Wie implementieren, dass Planeten auch miteinander interagieren und nicht nur mit Sonne

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Caturix99
User
Beiträge: 2
Registriert: Dienstag 20. März 2018, 19:36

Donnerstag 6. September 2018, 19:01

Ich programmiere ein Sonnensystem und habe im Moment alle Planeten mit der Sonne am interagieren. Nun will ich es auch noch versuchen , dass jeder Planet mit jedem anderen Planeten interagiert (Schwerkraft).
Ich habe mir das so gedacht, dass ich das mit einer 2-Fachen for Schlaufe schaffen könnte. Also eine in der anderen. Ich habe das mal versucht aber leider funktioniert es nicht. Könnt ihr mir vlt. weiterhelfen. Ich glaube das Problem liegt auch darin das ich vorher immer einen festen Fixpunkt (Sonne) hatte und jetzt steht halt immer Planet.

Hier ist mein Code

Code: Alles auswählen

from vpython import *

#Konstanten zum rechnen
s_rad0 = 6.9e8
s_rad1 = 10 * s_rad0
e_rad = s_rad1 * 0.65
m_rad = e_rad * 0.4
ae = 200 * s_rad0   #1 Astr. Einheit bezieht sich auf Ent. Sonne-Erde
ae2 = 200 * s_rad0  #bezieht sich auf Ent. Sonne-Mond
g = 6.6725e-11 

framerate = 100




#array liste von Planeten
planets = []


class Sphere(object):
    def __init__(self, pos, radius, make_trail):
        self.pos = pos
        self.radius = radius
        self.make_trail = make_trail
        


class planet(Sphere):
    def __init__(self, pos, radius, make_trail, mass, velocity):
        super().__init__(pos, radius, make_trail)
        self.mass = mass
        self.velocity = velocity
        planetSphere = sphere (pos = self.pos, radius = self.radius, make_trail = self.make_trail, mass = self.mass, velocity = self.velocity)


sun = planet(pos=vec(0,0,0),radius=s_rad1*1.5, make_trail=True, mass=2e30, velocity=vec(0,0,0))
mercury = planet(pos=vec(ae/3,0,0), radius=s_rad1/1.5, make_trail=True, mass=3.25e23, velocity=vec(0,0,-47000))
venus = planet(pos=vec(ae/1.6,0,0), radius=s_rad1/1.3, make_trail=True, mass=4.9e24, velocity=vec(0,0,-35000))
earth = planet(pos=vec(ae,0,0), radius=e_rad, mass=5.9e24, make_trail=True, velocity=vec(0,0,-25000))
mars =  planet(pos=vec(ae*1.52,0,0), radius=s_rad1/1.8, make_trail=True, mass=6.4e23, velocity=vec(0,0,-24000))
jupiter = planet(pos=vec(ae*5.18,0,0), radius=s_rad1/1.2, make_trail=True, mass=10e27, velocity=vec(0,0,-9678))
saturn = planet(pos=vec(ae*9.5,0,0), radius=s_rad1/1.4, make_trail=True, mass=5.7e26, velocity=vec(0,0,-7678))
uranus = planet(pos=vec(ae*19.13,0,0), radius=s_rad1/1.7, make_trail=True, mass=8.7e25, velocity=vec(0,0,-6772))
neptun = planet(pos=vec(ae*30,0,0), radius=s_rad1/1.7, make_trail=True, mass=1.02e26, velocity=vec(0,0,-5344))
pluto = planet(pos=vec(ae*39.37,0,0), radius=s_rad1/2.4, make_trail=True, mass=1.3e22, velocity=vec(0,0,-4740))

planets.extend((mercury,venus,earth,mars,jupiter,saturn,uranus,neptun,pluto))

dt = 10000
time = 0.1


while (True):

    rate(framerate) 

    #for-Schlaufe für Berechnung jedes einzelnen Planeten

    g_forceS = vec(0,0,0)
   
    for planet in planets:
        g_force = g * sun.mass * planet.mass * (sun.pos - planet.pos).norm()  / (sun.pos - planet.pos).mag2
        

        for planet in planets:
        g_force = g * planet.mass * planet.mass * (planet.pos - planet.pos).norm()  / (planet.pos - planet.pos).mag2
    
        #Sonne
        g_forceS -= g_force

        
        
    

    
        #Änderung des Velocity Vektor wird zum alten addiert
        #Da a=F/m // V = a*t(a*dt) 2 Geschw. vektoriell durch F/m ausgedrückt.
        planet.velocity = planet.velocity + ( g_force / planet.mass) * dt #Richtungsänderung
 
        #Diese Änderung wird zur alten Position addiert = neue Position
        planet.pos += planet.velocity * dt 

    sun.velocity = sun.velocity + ( g_forceS / sun.mass) * dt #Richtungsänderung
    sun.pos += sun.velocity * dt
Benutzeravatar
/me
User
Beiträge: 3334
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Donnerstag 6. September 2018, 23:09

Celebrity Deathmatch: Schlaufe vs. Schleife
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Freitag 7. September 2018, 07:04

Code: Alles auswählen

for planet1 in planets:
        g_force = g * sun.mass * planet1.mass * (sun.pos - planet1.pos).norm()  / (sun.pos - planet1.pos).mag2
        

        for planet2 in planets:
            if planet1==planet2:
                continue
            g_force += g * planet2.mass * planet1.mass * (planet2.pos - planet1.pos).norm()  / (planet2.pos - planet1.pos).mag2
    
        #Sonne
        g_forceS -= g_force
    
        #Änderung des Velocity Vektor wird zum alten addiert
        #Da a=F/m // V = a*t(a*dt) 2 Geschw. vektoriell durch F/m ausgedrückt.
        planet1.velocity += ( g_force / planet1.mass) * dt #Richtungsänderung
 
        #Diese Änderung wird zur alten Position addiert = neue Position
        planet1.pos += planet1.velocity * dt 
Wenn du die Sonne auch noch in die "Planeten" Liste tust, dann brauchst du so auch keine Extra-Behandlung der Sonne mehr. Eventuell könntest du dann "Planet" zu "Body" umbenennen.
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
kbr
User
Beiträge: 1102
Registriert: Mittwoch 15. Oktober 2008, 09:27

Freitag 7. September 2018, 08:28

Wenn Du Masse, Geschwindigkeite und Position im Raum als Anfangswerte hast, sollten zwei for-Schleifen für eine einfache Simulation genügen (dt geht dann in calc_partial_vector ein):

Code: Alles auswählen

while as long as you want to do it:
    for planet in planets:
        for other_planet in planets:
            if other_planet is planet:
                continue
            planet.calc_partial_vector(other_planet)
        planet.combine_vectors()
    move(planets)
Antworten