Simulation funktioniert bei grossen Zahlen nicht mehr
-
Hi,
ich schreibe gerade meine Facharbeit und hänge gerade ein einem Problem auf welches ich mir keinen Reim machen kann.
Ich habe hier eine Struktur:double gamma=6.6742e-11; struct Satellite { double xlenght; double ylenght; double zlenght; double vx; double vy; double vz; double ax; double ay; double az; double m; }P1, P2, P3;Wenn ich jetzt das folgende in die Daten einlese:
P1.vy=29800; P1.vx=0; P1.xlenght=1.496e11; P1.ylenght=0; P1.zlenght=0; P1.m=5.9723e24; P1.ax=0; P1.ay=0; P3.m=1.9884e30; P3.xlenght=0; P3.zlenght=0; P3.ylenght=0; P3.vx=0; P3.vy=0;welches die Erde und die Sonne repräsentiert, fliegt die Erde (P1) einfach weg.
Die Funktion zur Berechnun sieht folgendermassen aus:void sphere12(float secperframe) { double r = sqrt(P1.xlenght*P1.xlenght+P1.ylenght*P1.ylenght); P1.ax = -gamma*(P3.m/(r*r*r))*P1.xlenght; P1.ay = -gamma*(P3.m/(r*r*r))*P1.ylenght; P1.vx = P1.vx + P1.ax*secperframe; P1.vy = P1.vy + P1.ay*secperframe; P1.xlenght = P1.xlenght + P1.vx*secperframe; P1.ylenght = P1.ylenght + P1.vy*secperframe; }Wenn ich nun aber die folgenden Werte einsetze (ist aus unserem Physikbuch wo ein Satellit um die Erde kreist)
P1.vy=3070; P1.vx=0; P1.xlenght=4.22e7; P1.ylenght=0; P1.zlenght=0; P1.m=0; P1.ax=0; P1.ay=0; P3.m=5.9723e24; P3.xlenght=0; P3.zlenght=0; P3.ylenght=0; P3.vx=0; P3.vy=0;Wahrscheinlich steh ich einfach auf dem Schlauch aber ich sehe den Fehler nicht. Kann es am Datentyp liegen? Habe ich eigentlich ausgeschlossen, da dieser mit 13 Nachkommastellen rechnet oder so.
GrussLukas
-
mh ich meine das mit den satteliten ist eine formel die mit satteliten und raketen funktioniert nicht aber mit grösseren sachen (z.b. planet oder sonne) ich weis es nicht so genau, aber ich meien für planeten gibts eine andere formel
kann aber auch sein dass die zahlen für standart c++ zu klein werden...
(e-11 ist ja noch ok, aber dann auch noch einen kubikradius im nenner...)
-
ne also die formel stimmt^^
die ist einfach von der Gravitation abgeleitet
Ich weiss auch nicht wegen der grösse der Zahlen hast du da eine idee was man machen könnte?
Gruss
-
du könntest dir eventuell mal eine bigfloat klasse oder ähnliches holen und statt double diese bigfloats benutzen...
oder du gehst mal mit dem debugger durch
ich gehe mal davon aus dass das ganze mit grafik ist, du könntest als kontrollausgabe (abgekapselt mit #ifdef usw) nebenbei auf der konsole machen wo du bei jedem durchlauf alle werte ausgibst dann siehst du ja wo der hase hinläuft...
-
Ich habe da nochmal eine Frage. Kannst du mir zufällig nicht gerade einen Link zu eine Bigfloat KLasse schicken? Denn alle die ich gefunden habe, unterstützen keine Wurzeln und Potenzen, was ich aber unbedingt brauche.
Ich hoffe ohr könnt mir helfen danke
-
-
vielen dank ich baue mir gerade die libs zusammen^^
Für alle die dies später lesen, hier ein gutes Tut:
http://suchideas.com/journal/2007/07/installing-gmp-on-windows/
-
Also ich habs jetzt zum laufen gebracht nur habe ich noch ein Problem.
Ich arbeite mit VC++ 2008EE. Da läuft es aber nicht. ich muss es mit gcc kompilieren.
Nun wollte ich fragen, ob ich meine Struktur und Funktionen in eine andere Datei schreiben kann und diese dann mit gcc kompilieren und die kompilierte datei dann in vc++ verwenden?
DankeLukas
-
habe gerade gemerkt, dass ich mich gar nicht angemeldet habe^^
nun habe ich aber noch das Problem, dass ich die gmp datentypen in float oder double konvertieren muss, da ogre3d nicht mit gmp umgehen kann^^.
Ich hoff ihr könnt mir helfen
-
Ein allgemeiner Tipp für solche Simulationen: Man skaliert einfach die Größen, so, dass man in einem vernünftigen Bereich für die Genauigkeit der Fließkommazahlen ist. Im Beispiel vom OP kann man das beispielsweise machen, indem man die Erdmasse gleich 1 setzt, ebenso den Abstand. Die Anfangsgeschwindigkeit könnte man ebenfalls auf 1 setzen, es ist jedoch praktischer, dem Zeitschritt die Länge 1 zu geben und dann mit Hilfe der reskalierten Länge den Wert der Anfangsgeschwindigkeit in diesem Einheitensystem auszurechnen. Der Wert der Gravitationskonstante muss dann ebenfalls umgerechnet werden.
Eine schöne Alternative ist es auch, den Wert der Gravitationskonstanten auf 1 zu setzen und dann damit die anderen Größen auszudrücken, so spart man sich diese unsinnigen Multiplikationen in jedem Rechenschritt.
-
Das habe ich mir auch überlegt, aber es soll so sein, dass der benutzer die daten eingibt. Der Konfigurator ist schon da. Sonst muss ich halt die Umrechnungen erst zur Programmlaufzeit oder vielleicht beim konfigurator machen