Halley chiese a Newton quale fosse la traiettoria seguita da un corpo attratto da un altro corpo molto più massiccio e supposto fermo, con una forza che fosse diretta lungo la congiungente i cue corpi e un'intensità inversamente proporzionale al quadrato della loro distanza. Newton, che aveva già trovato la risposta per via geometrica anni prima, rispose immediatamente: "un'ellisse". Vogliamo ripetere numericamente il calcolo di Newton: che cosa accade a un corpo attratto da una forza centrale inversamente proporzionale al quadrato della distanza? La forza newtoniana che il corpo di massa \(m_1\) esercita sul corpo di massa \(m_2\), suppono che \(\underline{r}_{12}\) sia il vettore dal primo al secondo, è data da Scriviamo una procedura che simula il moto del pianeta. In prima approssimazione, supporremo che uno dei due corpi abbia una massa di gran lunga superiore all'altro, la tipica situazione che si verifica nel moto di un pianeta attorno a una stella. Questa approssimazione non è lecita quando due corpi di massa confrontabile ruotano entrambi attorno al comune centro di massa del sistema. In [1]: using Gadfly # la libreria grafica
In [2]: # pensiamo il Sole nel punto (0,0) # usiamo unità di misura convenzionali. k =.9114 dt =.001 tf = 8760 #Condizioni iniziali s0x=0.5 s0y=0. v0x=0.0 v0y=1.7 rx=[s0x] ry=[s0y] sx=[s0x] sy=[s0y] vx=[v0x] vy=[v0y] t=0 while t < tf d=(s0x^2+s0y^2)^( 1.5) s0x=s0x+v0x*dt s0y=s0y+v0y*dt ax= k*d*s0x ay= k*d*s0y v0x=v0x+ax*dt v0y=v0y+ay*dt #mettiamo da parte tutte le posizioni qui in rx ry. push!(rx,s0x) push!(ry,s0y) #in sx sy le posizioni per i grafici if rem(t,120) == 0 push!(sx,s0x) push!(sy,s0y) t+=1 set_default_plot_size(13cm, 13cm) plot(layer(x=sx,y=sy,geom.point,geom.line(preserve_order=true),theme(default _color=color("blue"))),layer(x=[0],y=[0], Geom.point,Theme(default_color=color("orange"))),Guide.title("Diagramma dell 'orbita"),coord.cartesian(fixed=true))
Out[2]: 1.0 Diagramma dell'orbita 0.5 y 0.0 0.5 1.0 2 1 0 1 x Ma possiamo fare di meglio. Il fatto che l'orbita di un pianeta intorno al Sole sia ellittica è solamente la prima delle tre leggi di Keplero. Da un punto di vista visivo, il diagramma sembra confermarla. Vogliamo provare con le altre due? Seconda legge di Keplero Durante il moto intorno al Sole, i raggi vettori condotti dal pianeta al Sole spazzano aree uguali in tempi uguali. Questo equivale a mostrare che, comunque si considerino due triangoli mistilinei aventi per lati le congiungenti Sole pianeta e come terzo lato il piccolo arco di ellisse percorso in quello stesso lasso di tempo, le loro aree saranno uguali. Questo dovrebbe provocare un effetto immeidatamente verificabile, e cioè che il pianeta percorre la sua orbita a velocità più alta quando è più vicino al Sole, mentre va più piano quando è più lontano. Ma questo si vede benissimo dalla figura, infatti, le posizioni del pianeta sono rilevate a intervalli di tempo costante, e si nota a occhio nudo che sulla destra del grafico, quando il pianeta è più vicino al Sole, i trattini sono più lunghi rispetto a quando il pianeta si trova nella parte sinistra, cioè più lontano dal Sole. Quindi, dal punto di vista qualitativo, ci siamo. Come dimostrare, ora, che anche quantitativamente le cose vanno come previsto da Keplero?
Nella nostra simulazione, abbiamo suddiviso l'anno in 8760 parti,. Questo, per la Terra, sarebbe equivalente a ricalcolare la posizione ogni ora. Ogni punto evidenziato sul grafico rappresenta cinque giorni. Naturalmente, l'orbita della Terra è molto più simile a una circonferenza (l'eccentricità è bassa), ma per capire meglio, ci conviene esagerare l'effetto. Ok, allora abbiamo la posizione della Terra ogni ora. La distanza Terra Sole all'inizio del calcolo è In [3]: δts11=sqrt(rx[1]^2+ry[1]^2) Out[3]: 0.5 Dopo un'ora, la distanza è In [4]: δts12=sqrt(rx[2]^2+ry[2]^2) Out[4]: 0.5000028899916479 Approssimiamo poi il piccolo arco coperto in un'ora con la distanza rettilinea fra le due posizioni: In [5]: δts13=sqrt((rx[1] rx[2])^2+(ry[1] ry[2])^2) Out[5]: 0.0017 e adesso possiamo calcolare l'area con la formula di Erone: In [6]: Out[6]: function Area(a,b,c) p=(a+b+c)/2 return sqrt(p*(p a)*(p b)*(p c)) Area (generic function with 1 method) Quindi per l'area del primo triangolo: In [7]: A1=Area(δTS11,δTS12,δTS13) Out[7]: 0.00042499999999998095 Adesso ripetiamo il calcolo in un momento dell'orbita in cui le distanze sono ben diverse: In [8]: δts21=sqrt(rx[4001]^2+ry[4001]^2) δts22=sqrt(rx[4002]^2+ry[4002]^2) δts23=sqrt((rx[4001] rx[4002])^2+(ry[4001] ry[4002])^2) A2=Area(δTS21,δTS22,δTS23) Out[8]: 0.00042499999999976546 La differenza fra i due valori è piuttosto piccola... In [9]: Out[9]: A1 A2 2.15485181781494e 16
parliamo della diciassettesima cifra decimale. Vediamo però che, mentre le aree sono uguali, i raggi sono ben diversi dal caso precedente: In [10]: δts21 Out[10]: 1.8881106226509243 In [11]: δts22 Out[11]: 1.888156867424726 In [12]: δts23 Out[12]: 0.0004525489928020072 Come ci aspettavamo, a raggi più grandi corrispondono tratti percorsi più piccoli, e siccome il tempo impiegato è lo stesso, resta confermata la legge delle aree! Passiamo adesso ala terza legge: Terza legge di Keplero: Il cubo del periodo di rivoluzione è proporzionale al quadrato del semiasse maggiore dell'orbita In questo caso, possiamo provare a tracciare altre orbite con diversi semiassi e calcolare per ogni orbita il rapporto indicato. Resta da stabilire come trovare il semiasse dell'orbita e come calcolare il periodo di rivoluzione. Partiamo dal pianeta di riferimento del primo esempio: in quel caso, il periodo di rivoluzione è di 365 giorni, per il semiasse, troviamo le posizioni estreme sull'asse x: In [13]: xmax=maximum(rx) Out[13]: 0.5023499374984003 In [14]: xmin=minimum(rx) Out[14]: 1.895359422833042 In [15]: smaxis=1/2*(xmax xmin) Out[15]: 1.1988546801657212 In [16]: K31=(8760^2) / (smaxis^3) Out[16]: 4.453573080311166e7 Adesso proviamo con un altro pianeta.
In [28]: # pensiamo il Sole nel punto (0,0) # usiamo unità di misura convenzionali. k =.9114 dt =.001 tf = 1321 #Condizioni iniziali s0x=0.5 s0y=0. v0x=0.0 v0y=1. rx=[s0x] ry=[s0y] sx=[s0x] sy=[s0y] vx=[v0x] vy=[v0y] t=0 while t < tf d=(s0x^2+s0y^2)^( 1.5) ax= k*d*s0x ay= k*d*s0y v0x=v0x+ax*dt v0y=v0y+ay*dt s0x=s0x+v0x*dt s0y=s0y+v0y*dt #mettiamo da parte tutte le posizioni qui in rx ry. push!(rx,s0x) push!(ry,s0y) #in sx sy le posizioni per i grafici if rem(t,20) == 0 push!(sx,s0x) push!(sy,s0y) t+=1 set_default_plot_size(13cm, 13cm) plot(layer(x=sx,y=sy,geom.point,geom.path,theme(default_color=color("blue")) ),layer(x=[0],y=[0], Geom.point,Theme(default_color=color("orange"))),Guide.title("Diagramma dell 'orbita"),coord.cartesian(fixed=true))
Out[28]: 0.4 Diagramma dell'orbita 0.2 y 0.0 0.2 0.4 0.2 0.0 0.2 0.4 0.6 x In []: In []: In questo caso, abbiamo un periodo di 1321 ore. Calcoliamo il semiasse maggiore: In [19]: xmax=maximum(rx) Out[19]: 0.5 In [20]: xmin=minimum(rx) Out[20]: 0.18899453878831246 In [21]: smaxis=1/2*(xmax xmin) Out[21]: 0.34449726939415626 In [22]: K32=(1321^2) / (smaxis^3) Out[22]: 4.26823461493875e7 L'errore è più marcato, ma viste le approssimazioni in gioco è compatibile con l'ipotesi. Come possiamo procedere per migliorare la precisione?