Bolygómozgás Számítógépes szimulációk 1n4i11/1 Csabai István ELTE Komplex Rendszerek Fizikája Tanszék 5.102 Email: csabaiθcomplex.elte.hu 2009 tavasz
A bolygómozgás Kepler törvényei 1 A bolygók pályája ellipszis, és annak egyik gyújtópontjában van a Nap. 2 A bolygók vezérsugara (a bolygót a Nappal összeköt szakasz) azonos id k alatt azonos területet súrol. 3 A bolygók Naptól való átlagos távolságainak, azaz a pálya fél nagytengelyeinek (a) köbei úgy aránylanak egymáshoz, mint a keringési idejük (T ) négyzetei. Tehát a a3 T 2 hányados minden bolygó esetén ugyanakkora (ha azok ugyanabban a naprendszerben keringenek).
Kepler az el z törvényeket nem elméleti úton vezette le, hanem Tycho Brahe csillagászati meggyelései alapján találta meg. A törvényeket kés bb Isaac Newton vezette le a gravitációs elmélete alapján. A gravitációs elmélet alapján több általánosítás is tehet : a törvények nem csak egy bolygó-csillag párosra, hanem bolygó körül kering holdakra és m holdakra, illetve bármely nagy tömeg égitest körül kering más égitestekre is igazak a természetben nem csak kötött ellipszis alakú pályák lehetésgesek, hanem parabola és hiperbola is lehetséges
Newton gravitációs törvénye Kepler törvényei Newton gravitációs törvényéb l vezethet ek le: F 12 = Gm 1m 2 r 3 12 r 12, F 21 = Gm 1m 2 r21 3 r 21 A középpontba mutató er k következtében a perdület megmarad, így a pályák síkban helyezkednek el.
A Kepler probléma egzakt megoldása a Nap tömege legalább 1000-szerese bármely bolygó tömegénél feltehetjük, hogy a Nap mozdulatlan, illetve elhanyagolhatjuk a bolygók tömegét bolygó-hold, csillag-csillag rendszerek esetén a tömegek nem hanyagólhatóak el, ekkor a tömegközéppont lesz mozdulatlan (redukált tömeg!) µ = m 1m 2 m 1 + m 2, r = r 1 r 2, m 1 r 1 + m 2 r 2 = 0 Kepler pálya egyenlete (ɛ a pálya excentricitása) r(θ) = a(1 ɛ2 ) 1 ɛ cos θ, b = a 1 ɛ 2
A Kepler probléma egzakt megoldása a pálya sebesség v = G(m 1 + m 2 ) ( 2 r 1 ) a a teljes energia = kinetikus + potenciális energia E = 1 2 µv2 Gm 1m 2 r keringési id - Kepler 3-ik törvényéb l T 2 = 4π 2 G(m 1 + m 2 ) a3 = Gm 1m 2 2a a perdület L = r (µv)
A Kepler probléma numerikus számítása Két bolygó kering a közös tömegközéppontjuk körül. Határozzuk meg a pálya paramétereit! Csillagászati egységek a Föld fél nagytengelye: Kepler 3-ik törvénye 1AU = 1.496 10 11 m G(M Sun + m Earth ) = 4π2 a 3 a távolságot mérjük csillagászati egységben (AU) és az id t években (yr) G(M Sun + m Earth ) = 4π 2 AU 3 /yr 2 t 2
A Kepler probléma numerikus számítása Kezdeti értékek válasszuk a nagytengelyt x tengelynek rögzítsük x(t = 0)-t a közelpontban: x(0) = a(1 + ɛ) a közelpontban a sebesség y irányú, adjuk meg v y (t = 0)-t a sebesség a pálya egyenletb l v = G(m 1 + m 2 ) ( 2 r 1 ) a az el z összefüggések alapján t = 0-ban meghatározhatjuk a megadott paraméterek mellett az excentricitást és a fél nagytengely méretét ɛ = x(0)v y (0) 2 /(G(M + m)) 1, a = x(0)/(1 + ɛ)
C++ program #include <cstdlib> #include <fstream> #include <iostream> using namespace std; #include "vector.hpp" #include "odeint.hpp" using namespace cpl; const double pi = 4 * atan(1.0); const double GmPlusM = 4 * pi * pi; bool switch_t_with_y = false; // to interpolate to y = 0 // Derivative vector for Newton's law of gravitation Vector f(const Vector& x) { double t = x[0], r_x = x[1], r_y = x[2], v_x = x[3], v_y = x[4]; double rsquared = r_x*r_x + r_y*r_y; double rcubed = rsquared * sqrt(rsquared); Vector f(5); f[0] = 1; f[1] = v_x; f[2] = v_y; f[3] = - GmPlusM * r_x / rcubed; f[4] = - GmPlusM * r_y / rcubed; if (switch_t_with_y) { // use y as independent variable for (int i = 0; i < 5; i++) f[i] /= v_y; } return f; }
A pálya vizsgálatához ki akarjuk íratni az x-tengely metszeteket. Mivel a véges lépések miatt nem lenne mindig kiértékelés itt, amikor keresztezzük az x-tengelyt, visszaléptatünk oda. A következ függvény vissza-interpolálja a pályát egy x-tengely metszése után az y = 0-hoz. ehhez áttérünk t-r l y változóra: a Runge-Kutta lépésköz legyen -y dx dy = dx/dt dy/dt // Change independent variable from t to y and step back to y = 0 void interpolate_crossing(vector x, int& crossing) { ++crossing; switch_t_with_y = true; RK4Step(x, -x[2], f); cout << " crossing " << crossing << "\t t = " << x[0] << "\t x = " << x[1] << endl; switch_t_with_y = false; }
//The code contains both simple and adaptive Runge-Kutta method int main() { cout << " Kepler orbit comparing fixed and adaptive Runge-Kutta\n" << " -----------------------------------------------------\n" << " Enter aphelion distance in AU, and eccentricity: "; double r_ap, eccentricity, a, T, v0; cin >> r_ap >> eccentricity; a = r_ap / (1 + eccentricity); T = pow(a, 1.5); v0 = sqrt(gmplusm * (2 / r_ap - 1 / a)); cout << " Enter number of periods, step size, and adaptive accuracy: "; double periods, dt, accuracy; cin >> periods >> dt >> accuracy; Vector x0(5); x0[0] = 0; x0[1] = r_ap; x0[2] = 0; x0[3] = 0; x0[4] = v0; ofstream datafile("fixed.data"); Vector x = x0; int steps = 0, crossing = 0; cout << "\n Integrating with fixed step size" << endl; do { for (int i = 0; i < 5; i++) datafile << x[i] << '\t'; datafile << '\n'; double y = x[2]; RK4Step(x, dt, f); ++steps; if (y * x[2] < 0) interpolate_crossing(x, crossing); } while (x[0] < periods * T); cout << " number of fixed size steps = " << steps << endl; cout << " data in file fixed.data" << endl; datafile.close();
} datafile.open("adaptive.data"); x = x0; steps = crossing = 0; double dt_max = 0, dt_min = 100; cout << "\n Integrating with adaptive step size" << endl; do { for (int i = 0; i < 5; i++) datafile << x[i] << '\t'; datafile << '\n'; double t_save = x[0]; double y = x[2]; adaptiverk4step(x, dt, accuracy, f); double step_size = x[0] - t_save; ++steps; if (step_size < dt_min) dt_min = step_size; if (step_size > dt_max) dt_max = step_size; if (y * x[2] < 0) interpolate_crossing(x, crossing); } while (x[0] < periods * T); cout << " number of adaptive steps = " << steps << endl; cout << " step size: min = " << dt_min << " max = " << dt_max << endl; cout << " data in file adaptive.data" << endl; datafile.close();
Három test probléma Egzakt megoldások a probléma egyszer nek t nik: három tömeg (m 1, m 2, m 3 ), három pozició ( r 1, r 2, r 3 ) és három egyenlet : d 2 r 1 dt 2 = Gm r 1 r 2 2 r 1 r 2 Gm r 1 r 3 3 r 1 r 3 (ez az 1. testre vonatkozik, hasonló egyenletek írhatóak fel a 2. és 3. testre) a megoldások azonban er sen függenek a kezdeti feltételekt l! analitikusan csak nagyon kevés eset kezelhet kezelhet egyszer bb esetek: síkbeli 3 test probléma - a 3 test egy síkban mozog korlátozott 3 test probléma - m 3 = 0, ekkor m 1, m 2 Kepler pályán mozog, míg a 3-ik körülöttük kering
Síkbeli 3 test probléma általában a 3 test problémák nem síkbeliek, de pl. a Naprendszer kezelhet síkbeliként gyorsulások relatív poziciók mozgás egyenletek a 1 = Gm 2 r 2 12 r 12 Gm 3 r13 2 r 13 s 1 = r 3 r 2, s 2 = r 1 r 3, s 3 = r 2 r 1 s 1 + s 2 + s 3 = 0 d 2 s i dt 2 = mg s 2 s i + m i G m = m 1 + m 2 + m 3, 3 G s i = G s 2 i=1 i
Linkek Nap-Föld-Jupiter applet: t/t : keringési id, r: távolság, v: sebesség állíthatóak: m i : a Jupiter és a Föld tömege, e i excentricitásuk, a: a Föld fél nagytengelye, theta: a Föld kezdeti pálya szöge, a keringési iránya, valamint a egy csúszkával az animáció sebessége.
Feladatok Használjuk a kepler.cpp programot! 1 A nagytengely iránya és nagysága elvileg állandó. Teszteljük, hogy a numerikus hibák miatt ez változik-e, és ha igen, akkor mennyire. Vizsgáljuk meg, hogy a lépéshossz és az alkalmazott integrál módszer mennyire befolyásolja ezt. (Keressük meg a trajektória perihéliumát és mérjük le a nagytengely szögét és hosszát a kiindulási helyzethez képest.) 2 Vizsgáljuk meg, hogy az adaptív lépéshossz hogyan változik a pálya mentén! Ábrázoljuk és magyarázzuk meg a kapott eredményt! Szorgalmi feladat: Hasonlítsuk össze, hogy ugyanakkora precizitás megkövetelésekor (pl. 10 teljes pálya után ugyanakkora hiba) mennyi futási id szükséges a normál és az adaptív Runge-Kutta szimulációhoz. 3 A Merkúr perihélium precessziója (lapozz!)
Feladatok 3 A Merkúr perihélium precessziója. A Merkúr pályája er sen elnyúlt (excentricitása: ɛ = 0.2056), így a pályán hosszú id alatt meggyelhet annak elfordulása. Erre az elfordulásra az általános relativitás elmélet adott magyarázatot. Ennek alapján a következ korrekció szükséges az er k megadásakor: F = Gm ( Summ Mercury r 2 1 + α ) r 2 Írjuk át a kódot ennek a korrekciónak a gyelembevételére. Vizsgáljuk meg, hogy α 1.1 10 8 AU 2 érték mellett mekkora perihélium mozgást tapasztalunk. A kapott értéket vessük össze a a Merkúr pályájának évszázadonkénti 43 ívmásodperces mért elfordulásával. (tipp: kis α esetén a precesszó rátája α, azaz meghatározhatjuk a meredekséget és extrapolálhatunk α 1.1 10 8 AU 2 -ra) 4 Alakítsd át a kepler.cpp forráskódot, hogy 3 test problémát kezeljen. Próbálj ki különféle paramétereket, ábrázold a pályákat, vizsgáld a stabilitást!
Feladatok 5 Szorgalmi feladat: Largrange pontok (lásd Wikipédia) stabilitása. Szimuláljuk a Nap-Jupiter rendszert, és vizsgáljuk meg az L1, L2, L3, L4, L5 Lagrange pontokba helyezett kis (a bolygó tömegénél sokkal kisebb) tömegek mozgását, igazoljuk, hogy (csak) a L4-L5 pontok stabilak. A Jupiter esetében az utóbbi pontokban valóban összegy lnek aszteroibák, az ún Trójai kisbolygók (linkek: trójaiak az SDSS-ben, wikipedia).