Ĺadny brzuch
Ciao,
ostatnio chciałem napisać program który symulował by ruch planety po orbicie danej gwiazdy. Kiedy jednak zaadaptowałem wzór na przyspieszenie w polu grawitacyjnym, moja planeta zaczęła krążyć nie po krzywej stożkowej ale po spirali (sic).
Sam wzór sprawdzałem kilkanaście razy, problem leży więc najprawdopodobniej w źle uwarunkowanym zadaniu. Po pierwsze wyciągamy pierwiastek z odległości między planetami (dramatyczny spadek dokładności) a po drugie - dzielimy przez ten pierwiastek. To nie ma prawa się udać, na pewno nie dla 8-bajtowego typu double.
Czy ktoś wie, jak można by usprawnić te obliczenia żeby zminimalizować błąd? Nie chodzi mi o uzyskanie perfekcyjnie eliptycznej orbity, ale na razie dewiacja jest zbyt duża żeby użyć programu do czegokolwiek sensownego.
Tu zamieszczam kod źródłowy w C/Win32 API: graw.zip
Z góry dzięki za odpowiedź.
Użytkownik taurendil edytował ten post 05 marzec 2008, 10:33
long double a;
ech, gdyby to było takie proste... Long double to nie jest po prostu double ze zwiększoną precyzją.
To ja rzucę tylko linkiem: http://libnova.sourceforge.net/
libnova is a general purpose, double precision, Celestial Mechanics, Astrometry and Astrodynamics library.
The intended audience of libnova is C / C++ programmers, astronomers and anyone else interested in calculating positions of astronomical objects or celestial mechanics. libnova is the calculation engine used by the Nova project and most importantly, is free software.
Biblioteka która byłaby idealna do tego celu. Używana jest np. w programie Stellarium - oba projekty są open source, więc mogą Ci się przydać jako mały podgląd.
Pisalem kiedys dokladnie cos takiego, obliczenia zdaje sie na long double - nie bylo zadnych problemow, nic nie cudowalem, po prostu liczylem jak trzeba, wiec moze problem lezy gdzie indziej?
// potem moze lookne kod.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
ostatnio chciałem napisać program który symulował by ruch planety po orbicie danej gwiazdy. Kiedy jednak zaadaptowałem wzór na przyspieszenie w polu grawitacyjnym, moja planeta zaczęła krążyć nie po krzywej stożkowej ale po spirali (sic).
Sam wzór sprawdzałem kilkanaście razy, problem leży więc najprawdopodobniej w źle uwarunkowanym zadaniu. Po pierwsze wyciągamy pierwiastek z odległości między planetami (dramatyczny spadek dokładności) a po drugie - dzielimy przez ten pierwiastek. To nie ma prawa się udać, na pewno nie dla 8-bajtowego typu double.
Czy ktoś wie, jak można by usprawnić te obliczenia żeby zminimalizować błąd? Nie chodzi mi o uzyskanie perfekcyjnie eliptycznej orbity, ale na razie dewiacja jest zbyt duża żeby użyć programu do czegokolwiek sensownego.
Tu zamieszczam kod źródłowy w C/Win32 API: graw.zip
Z góry dzięki za odpowiedź.
Użytkownik taurendil edytował ten post 05 marzec 2008, 10:33
long double a;
ech, gdyby to było takie proste... Long double to nie jest po prostu double ze zwiększoną precyzją.
To ja rzucę tylko linkiem: http://libnova.sourceforge.net/
libnova is a general purpose, double precision, Celestial Mechanics, Astrometry and Astrodynamics library.
The intended audience of libnova is C / C++ programmers, astronomers and anyone else interested in calculating positions of astronomical objects or celestial mechanics. libnova is the calculation engine used by the Nova project and most importantly, is free software.
Biblioteka która byłaby idealna do tego celu. Używana jest np. w programie Stellarium - oba projekty są open source, więc mogą Ci się przydać jako mały podgląd.
Pisalem kiedys dokladnie cos takiego, obliczenia zdaje sie na long double - nie bylo zadnych problemow, nic nie cudowalem, po prostu liczylem jak trzeba, wiec moze problem lezy gdzie indziej?
// potem moze lookne kod.