Dies ist eine alte Version des Dokuments!
Um die Grundlage für weitere Arbeiten und Ideen zu legen, habe ich unter Verwendung eures Programmcodes das Programm umstrukturiert. Ich habe einige Kommentare hinzugefügt, glaube aber, dass es sinnvoll ist, wenn ihr selbst den Code analysiert und (in der Wiki) kommentiert.
Wichtige Neuerungen:
# -*- coding: utf-8 -*- from __future__ import division from visual import * import numpy as np # Einheit der Länge 1.5 * 10**11 Meter (eine 'Astronomische Einheit' # Entsprechend Graviationskonstante 6.672 10**(-11) / (1.5*10**11)**3 G= 6.672 *10**(-11) / (1.5*10**11)**3 # Alle anderen Einheiten sind SI-Einheiten (kg,s) def beschleunigung(p1,p2): '''gibt die Beschleunigung des Körpers p1 durch die von p2 wirkende Kraft zurück.''' if (np.linalg.norm(p1.pos-p2.pos)>0.000000001): beschleunigungsvektor=G*p2.mass*(p2.pos-p1.pos)/(np.linalg.norm (p2.pos-p1.pos)**3) else: # ACHTUNG: Das ist kein 'elastischer Stoß', sondern etwas eher Merkwürdiges beschleunigungsvektor=p1.pos-p2.pos return beschleunigungsvektor def schritt(dt, mode): '''Berechnet einen Zeitschritt des Systems. mode bezeichnet die Integrationsmethode. Bisher nur implementiert: mode='Euler' ''' if mode=='Euler': for planet in planets: planet.pos = planet.pos + planet.velocity*dt planet.trail.append(pos=planet.pos) beschl=vector(0,0,0) for planetplanet in planets: if not planet is planetplanet: beschl+=beschleunigung(planet,planetplanet) #print beschl planet.velocity = planet.velocity + beschl*dt elif mode=='RK': #Runge-Kutta pass else: print 'Unzulässiger Modus' raise Exception("Unzulässiger Integrationsmodus") ##### Hauptprogramm ########################################## scene.autoscale=True # Initialisieren der Planeten, alle werden eine Liste 'planets' zugefügt planets=[] # Stelle Planeten 500* größer dar als sie sind, Sonne 20* # Erde planet1 = sphere (pos=(1,0, 0), radius=500*6.4*10**6/(1.5*10**11), color=color.blue) planet1.velocity = vector(0.0,1.*2*np.pi/(3.15*10**7),0.0) planet1.trail=curve(color =color.blue) planet1.mass=5.97*10**24 planets.append(planet1) #Sonne planet2 = sphere (pos=(0,0,0), radius=20*7*10**8/(1.5*10**11), color=color.orange) planet2.velocity = vector(0,0,0) planet2.trail=curve(color =color.orange) planet2.mass=1.99*10**30 planets.append(planet2) #Mars planet3= sphere (pos=(0,1.524,0), radius=500*3.85*10**6/(1.5*10**11), color=color.red) planet3.velocity = vector(-1.524*2*np.pi/(687.*86400),0.0,0.0) planet3.trail=curve(color =color.red) planet3.mass=6.4*10**23 planets.append(planet3) # Kleinstplaneten, Größe auf 2/5 der Erddarstellung gesetzt for i in range(20): alpha=np.random.rand()*2*np.pi r=(np.random.rand()*2.+0.3) umlaufzeit=(4*np.pi**2/(G*planet2.mass) *r**3)**0.5 # Das wäre die Umlaufzeit bei Kreisbahn nach den Keplerschen Gesetzen planet=sphere(pos=(r*np.cos(alpha),0.+r*np.sin(alpha),0),radius=200*6.4*10**6/(1.5*10**11),color=color.yellow) planet.velocity=vector(-r*np.sin(alpha), r*np.cos(alpha),0)*2*np.pi/umlaufzeit # Durch Multiplizieren der velocity mit *(1+0.2*np.random.rand()) wird eine Zufällige Exzentrizität bewirkt. planet.mass=np.random.rand()*10**10+10**9 planet.trail=curve(color=color.yellow) print "umlaufzeit ",i, "r", r,"Um", umlaufzeit, "alpha", alpha, "v ", planet.velocity planets.append(planet) #time.sleep(59) ###################################################################################### # Eigentliche Simulation dt = 43300. # halber Tag in Sekunden TRAILLENGTH=1 # Drückt man die Taste 'd', wird alles bis auf die letzten TRAILLENGTH Stücke der Trails gelöscht rate(10) n=0 while 1: n=n+1 # Berechnung: schritt(dt,'Euler') # Interaktion mit Benutzer: if scene.kb.keys: # event waiting to be processed? s = scene.kb.getkey() # hole ein Zeichen aus der Warteschlange if s=='d': for planet in planets: planet.trail.x=planet.trail.x[-TRAILLENGTH:] planet.trail.y=planet.trail.y[-TRAILLENGTH:] planet.trail.z=planet.trail.z[-TRAILLENGTH:] if s=='a': scene.autoscale=not scene.autoscale