Planetenbahn

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Ananas

Betreff: Planetenbahn

BeitragDi, Mai 11, 2010 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey
In Physik müssen wir gerade eine Erde-kreist-um-Sonne-Simulation basteln, in einer beliebigen Pragrammiersprache. Klar dass ich BB gewählt habe Wink Leider machen mir die ganzen Formeln zu schaffen, weil der Lehrer verlangt dass alles realitätsgetreu und mit den richtigen Werten (z.B. Masse der Sonne = 1.9891 * 10^30kg) berechnet wird.
Wir sollen in einer Schleife immer berechnen, wohin die Erde als nächstes wandert. Ich poste hier mal meine Berechnungen, nur stimmen sie anscheinend nicht: Meine Erde startet am Ort (150/0/0) (weil die Erde 150 Mio km von der Sonne entfernt ist) und wird in Y-Richtung nach oben geschossen. Die Sonne ist im Nullpunkt. Nachdem die Erde eine Anfangsgeschwindigkeit hat, sollte alles mit den Berechnungen laufen.... sollte Sad

Hier mal der Code meiner Rechnungen (wird immer wieder in der Schleife abgefragt):

BlitzBasic: [AUSKLAPPEN]

X=EntityX(erde)*10^9
Y=EntityZ(erde)*10^9
r=Sqr(x^2+y^2)

ax=(G*(msonne/r^2))*(-(x)/r)
ay=(G*(msonne/r^2))*(-(y)/r)

vx=vx+ax*t
vy=vy+ay*t

PositionEntity erde,EntityX(erde)+vx*t,EntityY(erde),EntityZ(erde)+vy*t




Variablen t, G, msonne usw wurden natürlich am Anfang definiert.

(a=Beschleunigung, v=Geschw., G=GravitationsKonstante, r=Abstand Erde-Sonne, x= momentaner X-Standort(Erde), y= momentaner Y-Standort(Erde)


Ich weiss, die Motivation ist klein jemandem bei doofen Rechnungen zu helfen aber ich hoffe trotzdem dass mir jemand sagen kann was ich falsch mache (oder eine Vermutung).

Vielen Dank

mfg

EDIT: Die Erde fliegt immer schneller noch oben (Y) und erhält auch eine kleine Beschleunigung in X-Richtung, statt einen Kreis um die Sonne zu fliegen...

mpmxyz

BeitragDi, Mai 11, 2010 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast die entsprechenden Variablen hoffentlich als Float deklariert.
Schaue dir die Variablen-Werte mal mit Hilfe von Debuglog an, um zu sehen, wo es nicht mehr stimmt.

Auf die Schnelle erkenne ich nämlich keine Fehler außer den, dass du bei der Positionierung nicht den Weg-Faktor von 10^9 beachtest. (->"EntityX(erde)+vx*t*10^(-9)")
mfG
mpmxyz
Edit: Für eine höhere Genauigkeit solltest du die Berechnung "EntityX(erde)+(vx*t-0.5*ax*t*t)*10^(-9)" zur Positionsbestimmung nutzen. (Herleitung durch Formeln zur beschleunigten Bewegung)
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Xeres

Moderator

BeitragDi, Mai 11, 2010 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe nicht ganz, was daran "realitätsgetreu" sein soll. Schon allein, weil man bei den richtigen Abmessungen niemals Sonne und Erde gleichzeitig sehen könnte... Ich würde die Bahn per Cos/Sin berechnen und die Bahnexzentrizität dabei beachten.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Krischan

BeitragDi, Mai 11, 2010 20:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, das ist jetzt zwar gleich ein ganzes Sonnensystem, dafür aber sehr realistisch, evt. kannst Du Dir da was abgucken, im dazugehörigen Thread gibt es weitere Infos zur Steuerung und was das alles soll:

https://www.blitzforum.de/foru...338#153843

Code: [AUSKLAPPEN]
;Realistisches 2D-Modell des Sonnensystems V1.0
;unter Berücksichtigung des N-Körper Problems
;mit realen Daten der Objekte vom 01.01.2000

AppTitle "Realistisches 2D-Modell des Sonnensystems V1.0"

;Parameter
scrX   = 640      ;Bildschirmbreite
scrY   = 480      ;Bildschirmhöhe
scrD   = 32      ;Farbtiefe
scrT   = 2         ;1=Fenster 2=Fullscreen
pn      = 10      ;Anzahl Planeten
ps      = 3         ;Grösse der Planeten
zoom   = 200      ;Zoomfaktor (1=weit,250=nah, 200=inneres System, 5=komplett)
tracers   = 1         ;Planetenspuren 1=ein 0=aus
sunmove = 1         ;Korrektur der Sonnenbewegung 1=ein 0=aus
sunmass#= 1.0      ;Sonnenmasse (1=normal)
TIM#   = 0         ;Zeitfaktor rücksetzen
TIMINT#   = 0.5      ;um x Sonnentage erhöhen pro Durchgang, je höher desto ungenauer!
               ;bei über 10 kann der Merkur "verloren" gehen :-)

;Gaußsche Gravitationskonstante
K1# = .01720209895
K2# = K1# * K1#

;Felder dimensionieren
Dim X#(pn), Y#(pn), Z#(pn), VX#(pn), VY#(pn), VZ#(pn), MASS#(pn), ro(pn), gr(pn), bl(pn)
Dim name$(pn), oldx#(pn), oldy#(pn), DEG#(pn), MU#(pn), SEMI#(pn), ECCEN#(pn)

;Datenfelder auslesen
Dim pla$(pn,11)
Restore planetdata
For p=0 To pn-1
   For q=0 To 11
      Read pla$(p,q)
      name$(p)=pla$(p,0)                     ;Name
      X#(p)=pla$(p,1)                        ;X-Position
      Y#(p)=pla$(p,2)                        ;Y-Position
      Z#(p)=pla$(p,3)                        ;Z-Position
      VX#(p)=pla$(p,4)                     ;Geschwindigkeit X
      VY#(p)=pla$(p,5)                     ;Geschwindigkeit Y
      VZ#(p)=pla$(p,6)                     ;Geschwindigkeit Z
      MASS#(p)=Float(pla$(p,7))*10^Int(pla$(p,8))   ;Masse
      ro(p)=pla$(p,9)                        ;Rotanteil
      gr(p)=pla$(p,10)                     ;Grünanteil
      bl(p)=pla$(p,11)                     ;Blauanteil
   Next
Next

;Daten der Objekte Stand 01.01.2000
.planetdata
;    Name              POS X         POS Y         POS Z             Vx             Vy             Vz   Masse*10^X   Rot   Grü   Bla
Data "Sonne"   ,   0.0000000 ,   0.0000000 ,   0.0000000 ,  0.000000000 ,  0.000000000 ,  0.000000000 , 1.991 , 30 , 255 , 255 ,   0
Data "Merkur"  ,  -0.1778023 ,  -0.3863251 ,  -0.1879025 ,  0.020335410 , -0.007559570 , -0.006147710 , 3.191 , 23 , 255 ,  64 ,   0
Data "Venus"   ,   0.1787301 ,  -0.6390267 ,  -0.2987722 ,  0.019469170 ,  0.004915870 ,  0.000978980 , 4.886 , 24 , 255 , 192 , 128
Data "Erde"    ,  -0.3305873 ,   0.8497269 ,   0.3684325 , -0.016483420 , -0.005365460 , -0.002326460 , 5.979 , 24 ,   0 ,   0 , 255
Data "Mars"    ,  -1.5848092 ,  -0.3648638 ,  -0.1244522 ,  0.003821510 , -0.011241840 , -0.005259630 , 6.418 , 23 , 255 ,   0 ,   0
Data "Jupiter" ,   4.1801700 ,  -2.5386080 ,  -1.1900210 ,  0.004106423 ,  0.006125327 ,  0.002525539 , 1.901 , 27 , 128 , 255 ,   0
Data "Saturn"  ,  -4.6197080 ,  -8.2374610 ,  -3.2033610 ,  0.004647751 , -0.002328957 , -0.001161564 , 5.684 , 26 , 255 , 255 , 128
Data "Uranus"  ,  -3.7245900 , -17.1975200 ,  -7.4791700 ,  0.003833665 , -0.000845721 , -0.000424809 , 8.682 , 25 ,   0 , 255 , 255
Data "Neptun"  ,   1.9138100 , -27.9215500 , -11.4762000 ,  0.003118271 ,  0.000233303 ,  0.000017967 , 1.027 , 26 ,   0 , 128 , 255
Data "Pluto"   , -23.2285900 , -18.5272000 ,   1.2167500 ,  0.002066577 , -0.002488884 , -0.001397200 , 1.080 , 24 , 128 , 128 , 128

;Masse mit Sonne normalisieren (Sonne=1)
For I = 1 To pn-1
MASS#(I) = MASS#(I) / MASS(0)
Next
MASS#(0) = sunmass#

;reduzierte Masse in Gaussschen Einheiten erzeugen
For I = 1 To pn-1
MU#(I) = K2# * (1 + MASS#(I))
Next

;Grafikmodus
Graphics scrX,scrY,scrD,scrT
SetBuffer BackBuffer()

;Hauptschleife
While Not KeyHit(1)

   ;Zeit um Faktor erhöhen
   TIM# = TIM# + TIMINT#

   ;Tracer einzeichnen
   For i=0 To pn-1
      ;Tracerfarbe
      If tracers Then Color 32,32,32 Else Color 0,0,0
      Oval(scrX/2+oldx#(i),scrY/2+oldy#(i),ps,ps,1)
   Next

   ;Berechnungen und Planetenausgabe
   Gosub NewV
   Gosub NewP

   ;Fake CLS oben links
   Rect 0,0,150,42,1
   Color 255,255,255

   ;Textausgabe oben links
   Text 0, 0,"Tage:  "+Int(TIM#)
   Text 0,10,"Jahre: "+TIM#/365.25
   Text 0,20,"Zeit:  "+TIMINT#
   Text 0,30,"Zoom:  "+zoom

   ;Tastaturbefehle
   ;Pfeil rauf/runter = Zoom in/out
   ;Pfeil links/rechts = langsamer/schneller
   ;Space = Tracers ein/aus
   ;F1 = inneres Sonnensystem
   ;F2 = komplettes Sonnensystem
   ;F3 = Sonnenmasse verdoppelt
   ;F4 = Sonnenmasse halbiert
   ;F5 = Erdmasse = 0.05 Sonnenmassen ;-)
   kp=0
   If KeyDown(200) Then zoom=zoom+1:If zoom>250 Then zoom=250
   If KeyDown(208) Then zoom=zoom-1:If zoom<1 Then zoom=1
   If KeyDown(203) Then TIMINT#=TIMINT#-.5:If TIMINT#<.5 Then TIMINT#=.5
   If KeyDown(205) Then TIMINT#=TIMINT#+.5:If TIMINT#>25 Then TIMINT#=25
   If KeyHit(57) Then tracers=1-tracers:Cls
   If KeyDown(59) Then zoom=200:Cls
   If KeyDown(60) Then zoom=5:Cls
   If KeyDown(61) Then MASS#(0)=2
   If KeyDown(62) Then MASS#(0)=0.5
   If KeyDown(63) Then MASS#(3)=.05
   
   ;Bufferflip
   Flip 1

Wend

End

;ab hier Gosubs-------------------------------------------------------------

;Gosub: neue Geschwindigkeit berechnen
.NewV
For I = 0 To pn-1
   ;Parameter rücksetzen
   AX# = 0
   AY# = 0
   AZ# = 0

   ;keine Ahnung was hier passiert
   For J = 0 To pn-1
      If (J = I) Then Goto weiter
      XJI# = X#(J) - X#(I)
      YJI# = Y#(J) - Y#(I)
      ZJI# = Z#(J) - Z#(I)
      R# = Sqr(ZJI# * ZJI# + YJI# * YJI# + XJI# * XJI#)
      R3# = R# * R# * R#
      COEFF# = K2# * MASS#(J) / R3#
      AX# = COEFF# * XJI# + AX#
      AY# = COEFF# * YJI# + AY#
      AZ# = COEFF# * ZJI# + AZ#
   .weiter
   Next

   ;neue Geschwindigkeit berechnen
   VX#(I) = VX#(I) + AX# * TIMINT#
   VY#(I) = VY#(I) + AY# * TIMINT#
   VZ#(I) = VZ#(I) + AZ# * TIMINT#
Next
Return

;Gosub: neue Position berechnen und Planeten einzeichnen
.NewP
For i=0 To pn-1
   ;neue Position berechnen
   X#(i) = X(i) + VX#(i) * TIMINT#
   Y#(i) = Y(i) + VY#(i) * TIMINT#
   Z#(i) = Z(i) + VZ#(i) * TIMINT#

   ;Zoomfaktor berücksichtigen
   sx#=X#(i)*zoom
   sy#=Y#(i)*zoom

   ;Korrektur der Sonnenbewegung
   If i=0 And sunmove=1 Then
      sunx#=sx#
      suny#=sy#
   EndIf

   ;Position mit Zoomfaktor und Sonnenkorrektur
   sx#=sx#-sunx#
   sy#=sy#-suny#
   
   ;alte Position für Tracer speichern
   oldx#(i)=sx#
   oldy#(i)=sy#
   
   ;Planeten zeichnen
   Color ro(i),gr(i),bl(i)
   Oval(scrX/2+sx#,scrY/2+sy#,ps,ps,1)
Next
Return

Ananas

BeitragDi, Mai 11, 2010 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
@mpmxyz: Jo ich rechne natürlich mit Floats, und danke für den Tip mit dem zurückrechnen, was mir gar nicht aufgefallen ist, weil ich einfach die Zeit t ganz klein gemacht habe, was dann das zurückrechnen etwa ausgeglichen hat. Weiter bin ich leider nicht Sad

@Xeres: klar ist es nicht realistisch dass man Sonne + Erde auf einem Bild hat, eigentlich wären die ja kleiner als ein Pixel... Mein Lehrer meint einfach, wir sollen die echten Werte (Abstände, Massen,..) in der Formel im Programm einsetzen. Zur Darstellung werden Erde und Sonne natürlich stark vergrössert...
Ausserdem ist mein Lehrer ziemlich stur... Er hat gesagt wie er es will und schülerfreiheiten lässt er nicht (musste ich schon beim letzten Projekt mit einer schmerzhaften Note erfahren^^) Er möchte dass immer schrittweise die neue Beschleunigung, Geschw. und Position der Erde nach einer bestimmten Zeit t berechnet wird. Weiss also auch nicht ob ich das anders lösen sollte

@Krischan: Danke schonmal! ich glaube bei mir stimmt irgendwas mit der Beschleunigungsberechnung nicht, da hab ich mal die Stelle bei dir angeschaut:

BlitzBasic: [AUSKLAPPEN]


;keine Ahnung was hier passiert
For J = 0 To pn-1
If (J = I) Then Goto weiter
XJI# = X#(J) - X#(I)
YJI# = Y#(J) - Y#(I)
ZJI# = Z#(J) - Z#(I)
R# = Sqr(ZJI# * ZJI# + YJI# * YJI# + XJI# * XJI#)
R3# = R# * R# * R#
COEFF# = K2# * MASS#(J) / R3#
AX# = COEFF# * XJI# + AX#
AY# = COEFF# * YJI# + AY#
AZ# = COEFF# * ZJI# + AZ#
.weiter
Next



Leider hast du selber geschrieben dass du keine Ahnung hast was da passiert xD Was genau bedeutet denn das COEFF? Und was sind XJI, YJI... usw?

Und so nebenbei: Goto und Gosub sind böse Very Happy
Naja waren sie vielleicht noch ned als du den Code geschrieben hast...
 

Krischan

BeitragMi, Mai 12, 2010 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Das war auch einer meiner ersten Codes hier. Und ich habe wirklich keine Ahnung was da passiert, hab das nur von Qbasic portiert. Irgendwelche Mathe-Genies hier? Vortreten!

Ist auch egal, Hauptsache es läuft Rolling Eyes

mpmxyz

BeitragMi, Mai 12, 2010 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe die fragliche Stelle mal kommentiert:
BlitzBasic: [AUSKLAPPEN]
For I = 0 To pn-1
;Parameter rücksetzen
;A ist die Beschleunigung zu diesen Zeitpunkt
AX# = 0
AY# = 0
AZ# = 0

;Ich weiß, was passiert: Wink
;Jeder Planet wird von jedem Planeten angezogen.
;Die J-Planeten ziehen dabei die I-Planeten an.
For J = 0 To pn-1
;Wenn J=I gilt, würde sich der Planet selbst anziehen
If (J = I) Then Goto weiter
;Der Weg-Vektor vom I-Planeten zum J-Planeten wird berechnet.
XJI# = X#(J) - X#(I)
YJI# = Y#(J) - Y#(I)
ZJI# = Z#(J) - Z#(I)
;Die Größe des Abstands wird berechnet.
R# = Sqr(ZJI# * ZJI# + YJI# * YJI# + XJI# * XJI#)
;Warum wird der Abstand hoch 3 genommen und nicht nur quadriert?
;Antwort: Der Abstand wurde noch nicht normiert, sodass er nur noch eine Richtung angibt; in den darauf folgenden Berechnungen wird das dann mit Hilfe des anderen Wertes erledigt.
R3# = R# * R# * R#
;Betrag der Gravitationsbeschleunigung nach Gauß(!)/Korrektur für die fehlende Normalisierung
COEFF# = K2# * MASS#(J) / R3#
AX# = COEFF# * XJI# + AX#
AY# = COEFF# * YJI# + AY#
AZ# = COEFF# * ZJI# + AZ#
.weiter
Next

;neue Geschwindigkeit berechnen
VX#(I) = VX#(I) + AX# * TIMINT#
VY#(I) = VY#(I) + AY# * TIMINT#
VZ#(I) = VZ#(I) + AZ# * TIMINT#
Next

Die Berechnungen unterscheiden sich nur vom Code von Ananas, weil hier die Berechnungen nach Gauß verwendet werden. (Außerdem ziehen sich die Planeten mit der Sonne gegenseitig an. Sonst dürfte z.B. eine Änderung der Erdmasse keine Änderung der Erdbahn hervorrufen.)
Diese nutzen die "Einheiten des Sonnensystems".
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
  • Zuletzt bearbeitet von mpmxyz am Mi, Mai 12, 2010 18:11, insgesamt 2-mal bearbeitet
 

Krischan

BeitragMi, Mai 12, 2010 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
*staun* Shocked Wieder was gelernt.

Silver_Knee

BeitragMi, Mai 12, 2010 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
mach If (J = I) zu If not (J = I)...endif und du bist das goto los.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group