ASTRO - PHYSIK

Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.

Albert Einstein

ARCHIVIERTE BLOG-BEITRÄGE

Januar
März
April
Mai
Juni
Juli
August
September
Oktober
November
Dezember

Simulierte Bewegung

Infinity-loop

Diese Woche gibt es mal etwas Bewegung hier. Und zwar Bewegung von Massepunkten – Planeten, Sterne, schwarze Löcher, was immer man mag. Und zwar haben wir im astronomischen Praktikum 2 entsprechende Animationen mit python programmiert. Im geschriebenen Programm kann man eigentlich beliebige Systeme simulieren. Für ein paar habe ich kurze Animationen erstellt. Alles was man jeweils ändern muss sind die Massen der Objekte, deren Startposition und deren Startgeschwindigkeit.

Als Check ob das Programm überhaupt grundlegen funktioniert habe ich versucht zwei gleich schwere Objekte auf einer Kreisbahn laufen zu lassen. Dies könnte ein Doppelsternsystem sein.

Als nächstes habe ich diesem Doppelsternsystem einen Planeten hinzugefügt, welcher die beiden Sterne in einigem Abstand umkreist. Man sieht schnell, dass diese Lösung bei mir nicht ganz stabil läuft. Es kommt zu Bahnresonanzen – das System verschiebt sich als Ganzes, fällt aber nicht auseinander (zumindest noch nicht auf die kurze Zeitspanne die ich animiert habe). Dies liegt wohl unter anderem daran, dass der “Planet”, also die äussere Masse, im vergleich zu den “Sternen”, also den beiden inneren und schwereren Massen, doch recht schwer ist und auch nicht all zu weit von den beiden Sternen entfernt ist. Planeten sind sonst ein vielfaches leichter, verglichen mit Sternen. Dennoch gibt es auch in der Natur Systeme mit mehreren Sternen. Im Sternbild Zwilling finden wir sogar ein 6-fach System! 6 Sterne die umeinander kreisen.

Was man als Erdenbewohner natürlich auch gerne wissen möchte, ist, ob denn unser eigenes Sonnensystem ebenso funktioniert.

Dann wollte ich auch mal irgendwas “verrücktes” simulieren. Ich stiess auf ein Paper, dass eine stabile Konfiguration von 3 Körpern erläutert, deren Bahn eine 8 beschreibt. Mathematisch stabil.Es wäre mir jedoch nicht bekannt, dass man dies schon mal im All beobachtet hat.

Wer gerne eigene Simulationen laufen lassen möchte, kann gerne den nachfolgenden python code verwenden, copyright liegt bei mir und ein grosser Dank geht an den Assistenten des astronomischen Praktikums, welcher immer auf Fragen einging.

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 25 17:08:35 2018

@author: Kay Lehnert
"""

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

##Animation
#Quasi rohes Gittermodell der Animation
fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], 'o', animated=True, color="red")

#Hintergrund für jedes frame
def init():
    ax.set_xlim(-31, 31)
    ax.set_ylim(-31, 31)
    return ln,
    
#update plot
def update(i):
    Pos=r_list[i]
    for j in range(len(Pos)):#Positionen für jedes Objekt werden durchgegangen
        x_vals=Pos[j][0]#[0] ist die x-Richtung
        y_vals=Pos[j][1]
        xdata.append(x_vals)
        ydata.append(y_vals)
        ln.set_data(xdata, ydata) 
    return ln,
      
#Simulationsbedingungen
ni = 15000 #Anzahl Iterationsschritte
dt = 0.01 #Zeitinterval

#Vorgegebene initiale Objekteigenschaften
"""
Gravitationskraft propto 1/r^2
"""

""" Einheiten:
Massen in Sonnenmassen, Distanzen in AE, v in Keplergeschwindigkeit v=sqrt(GM/r) mit M=Sonnenmasse, bzw. Masse des schweren Körpers.
"""
m = np.array(([1],[1/6023600],[1/408524],[1/332946.038],[1/3098710],[1/1047.55],[1/3499],[1/22962],[1/19352])) #Masse der Objekte
r = np.array(([0,0],[0.4,0],[0,0.7],[1,0],[0,1.5],[5.2,0],[0,9.5],[19.2,0],[0,30.1]))#[0,0.5],[0,-0.50]#[0,1],[0,0]
r_list = []
r_list.append(r)
v = np.array(([0,0],[0,-np.sqrt(1/0.4)],[np.sqrt(1/0.7),0],[0,-1],[np.sqrt(1/1.5),0],[0,-np.sqrt(1/5.2)],[np.sqrt(1/9.5),0],[0,-np.sqrt(1/19.2)],[np.sqrt(1/30.1),0]))#[0,0.5],[0,-0.50]#[-0.7071,0],[0.7071,0]

nk = len(m) #Anzahl der Objekte

#Initiale Werte
a = np.zeros((nk,2))
for i in range(0,nk):
    for j in range(0,nk):
        if i==j:
            continue
        a[i,0] = m[j]*(r[i,0]-r[j,0])/np.power(np.linalg.norm(r[i,:]-r[j,:]),3)
        a[i,1] = m[j]*(r[i,1]-r[j,1])/np.power(np.linalg.norm(r[i,:]-r[j,:]),3)
v = v + 0.5*dt*a

"""
#Funktion wg Animation
def pos(t,r,v):
    a = np.zeros((nk,2))
    r = r + dt*v
    for i in range(0,nk):
        for j in range(0,nk):
            if i==j:
                continue
            a[i,0] = m[j]*(r[i,0]-r[j,0])/np.power(np.linalg.norm(r[i,:]-r[j,:]),3)
            a[i,1] = m[j]*(r[i,1]-r[j,1])/np.power(np.linalg.norm(r[i,:]-r[j,:]),3)
    a[:,:] = -a[:,:]
    v = v + dt*a
    return [r,v,a]
r, v, a = [pos(t,r,v) for t in np.arange(0,ni,dt)]
"""

for q in range(0,ni):
    r = r + dt*v
    r_list.append(r)
    for i in range(0,nk):
        a[i,:]=0
        
        for j in range(0,nk):
            if i==j:
                continue
            a[i,0] =a[i,0] - m[j]*(r[i,0]-r[j,0])/np.power(np.linalg.norm(r[i,:]-r[j,:]),3)
            a[i,1] =a[i,1] - m[j]*(r[i,1]-r[j,1])/np.power(np.linalg.norm(r[i,:]-r[j,:]),3)
    #a[:,:] = -a[:,:]
    v = v + dt*a

ani = FuncAnimation(fig, update, frames=range(len(r_list)),
                    init_func=init, blit=True)
ani.save('basic_animation.mp4', fps=60, extra_args=['-vcodec', 'libx264'])
plt.show()   
LaTeX-Dokumente schneller kompilieren
Kurzlebige schwarze Löcher
 

Kommentare 1

Gäste - A.Meister am Sonntag, 06. Mai 2018 12:04

Vielen Dank für den spannenden Beitrag .

AM

Vielen Dank für den spannenden Beitrag . AM
Bereits registriert? Hier einloggen
Gäste
Freitag, 17. August 2018
Cookies erleichtern die Bereitstellung unserer Dienste. Mit der Nutzung unserer Dienste erklären Sie sich damit einverstanden, dass wir Cookies verwenden.
Weitere Informationen Ok Ablehnen