Heyy ich versuche seit einiger Zeit mit Python eine Animation für die Laufbahn von der Erde zu erstellen, aber ich wundere mich, ob mein Ansatz stimmt. 🤔
Ich will ein Python Programm erstellen, wo ich den Exponenten des Radius im Gravitationsgesetz ändern und somit neue Umlaufbahnen zeichnen kann. Dabei stütze ich mich auf die Formel: F = G * (m1 * m2)/r^x. Ich bin mir nicht sicher, ob mein Programm korrekte Laufbahnen zeichnet, da ich nicht sonderlich gut in Physik bin. Der Grundgedanke kann ich nachvollziehen: Bei abnehmender Kraft, wird die Umlaufbahn grösser. Aber ist es normal, dass die Umlaufbahn der Erde bei einer kleinen Exponenten-Änderung von 2 auf 2.02 so viel grösser wird? Falls ja, warum ist das so?
Danke im Voraus für eure Hilfe! 😊
LG Leonie
Ein Quadrat entspricht hier einer astronomischen Einheit.
Hier ist mein Programm:
Ich verwende für meine Animation pygame.
import pygame
import sys
import math
Das sind die Konstanten, die ich verwende und die Startwerte:
G = 6.67430e-11
M_SUN = 1.989e30
M_EARTH = 5.972e24
AU = 1.496e11
TIME_STEP = 43200
x = AU
y = 0
vx = 0
vy = 29780
exp_r = float(input"Exponent:"))
Die Erstellung des Fensters:
pygame.init()
WIDTH, HEIGHT = 800, 800
SCALE = WIDTH / (20 * AU) # Maßstab für die Darstellung
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
Mit RK4 approximiere ich die Laufbahn der Erde. Hier sind die Funktionen:
def runge_kutta4(t, state, dt):
k1 = deriv(t, state)
k2 = deriv(t + 0.5 * dt, [state[i] + 0.5 * dt * k1[i] for i in range(4)])
k3 = deriv(t + 0.5 * dt, [state[i] + 0.5 * dt * k2[i] for i in range(4)])
k4 = deriv(t + dt, [state[i] + dt * k3[i] for i in range(4)])
return [state[i] + (dt / 6) * (k1[i] + 2 * k2[i] + 2 * k3[i] + k4[i]) for i in range(4)]
def draw_grid():
grid_size = AU * SCALE
half_width = WIDTH // 2
half_height = HEIGHT // 2
for i in range(-19, 20):
x_pos = int(half_width + i * grid_size)
pygame.draw.line(screen, (50, 50, 50), (x_pos, 0), (x_pos, HEIGHT))
for i in range(-19, 20):
y_pos = int(half_height + i * grid_size)
pygame.draw.line(screen, (50, 50, 50), (0, y_pos), (WIDTH, y_pos))
Hauptschleife:
running = True
t = 0
earth_path = []
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
state = [x, y, vx, vy]
x, y, vx, vy = runge_kutta4(t, state, TIME_STEP)
t += TIME_STEP
draw_x = int(WIDTH / 2 + x * SCALE)
draw_y = int(HEIGHT / 2 + y * SCALE)
earth_path.append((draw_x, draw_y))
screen.fill((0, 0, 0))
draw_grid()
pygame.draw.circle(screen, (255, 255, 0), (WIDTH // 2, HEIGHT // 2), 20)
pygame.draw.circle(screen, (0, 0, 255), (draw_x, draw_y), 5)
for px, py in earth_path:
pygame.draw.circle(screen, (0, 255, 0), (px, py), 1)
pygame.display.flip()
clock.tick(60)
pygame.quit()
sys.exit()