
(articolo redatto da Domenico Di Mieri)
In occasione dell’anniversario dell’allunaggio di Armstrong del 20 luglio 1969, racconto qui i retroscena dello storico traguardo americano. Spiego in questo articolo gli aspetti scientifici del lavoro silenzioso di centinaia di persone, quasi tutte donne e afroamericane, chiuse in un laboratorio della NASA in Virginia alla fioca luce di un neon.
Una storia di eroismo, genialità e coraggio, tutta al femminile.
Il 20 luglio 1969, a soli 66 anni dal primo volo dei fratelli Wright su un aereo a motore, l’astronauta americano Neil Armstrong impresse la prima orma umana su un corpo extra-terrestre mentre pronunciava la famosa frase: “That’s one small step for man, one giant leap for mankind” o più precisamente, come dichiarato dallo stesso Angstrom qualche tempo dopo: “That’s one small step for a man, one giant leap for mankind”.
Probabilmente tutti noi abbiamo visto decine di volte le immagini dell’allunaggio, i discorsi del presidente Kennedy e conosciamo, forse in maniera un po’ romanzata, tutte le disavventure di quei coraggiosi astronauti che hanno fatto qualcosa che davvero nessuno aveva mai fatto prima.
Pochi sanno, però, che dietro quegli eroi virili e dalla mascella squadrata,che bene esprimevano l’immagine di forza e coraggio che, in piena guerra fredda, il governo americano voleva dare di sé, c’è il lavoro silenzioso di centinaia di persone quasi tutte donne e afroamericane, chiuse in un laboratorio della NASA in Virginia sotto la ben poco salutare luce di un tubo al neon.
Il calcolo della traiettoria per l’allunnaggio
Per mandare l’uomo sulla Luna, infatti, oltre a costruire una navicella abitabile, che fosse in grado di superare la velocità di fuga dal campo gravitazionale terrestre, era necessario calcolare la traiettoria migliore: quella che consumasse meno carburante e che consentisse alla navicella di manovrare in sicurezza verso il punto di “allunaggio” scelto dagli scienziati, poiché ritenuto sicuro sulla base delle osservazioni fino ad allora fatte.
Il calcolo di una siffatta traiettoria non è per niente banale: occorre considerare che la Terra si muove intorno al Sole e che la Luna si muove intorno alla Terra e al Sole e questi corpi celesti esercitano delle forze sul modulo spaziale. Insomma è un po’ come fare tiro al piattello stando sul “calcinculo”.
In passato gli scienziati si erano già interrogati su quale traiettoria seguire e basta leggere il bel libro di Jules Verne “Dalla Terra alla Luna” (“De la Terre à la Lune, trajet direct en 97 heures 20 minutes”), scritto nel 1865, per scoprire che fin dal XIX secolo si fantasticava su come raggiungere il nostro satellite. L’ipotesi, allora, era di seguire una traiettoria (presumibilmente) parabolica “sparando” verso la Luna un razzo da una base di lancio situata in Florida proprio, non del tutto casualmente, nello stesso stato in cui oggi si trova Cape Canaveral sull’isola di Merrit.
Un contributo fondamentale verso la definizione delle procedure necessarie per raggiungere il nostro satellite venne poi dato nel 1925 dall’ingegnere tedesco Walter Hohmann col suo libro “La raggiungibilità dei corpi celesti” (“Die Erreichbarkeit der Himmelskörper”), in cui la traiettoria viene suddivisa in diverse spezzate e si passa dall’orbita della Terra a quella della Luna, sfruttando l’energia gravitazionale dei corpi celesti stessi:

Gli scienziati della NASA, quindi, potevano già basarsi su teorie consolidate e sperimentate in precedenza con missioni non umane, ma restava da risolvere il problema delle interazioni delle forze gravitazionali di Sole, Terra e Luna nonché dell’attrito sul modulo di allunaggio (LM).
L’equazione del moto risultante dalla combinazione di tutte queste forze è una equazione differenziale troppo complessa per essere risolta analiticamente.
Come hanno fatto, allora, gli scienziati della NASA?
Fu la dott.ssa Katherine Johnson nei primi anni ’60 a suggerire l’utilizzo di metodi numerici per la soluzione del problema: il metodo di Eulero.
Il problema delle soluzioni numeriche, però, è che richiedono una quantità enorme di calcoli spesso ripetitivi ed ecco che entrano in scena quelle donne di cui avevano accennato.
Chi ha visto il film “Hidden Figures” tratto dall’omonimo libro di Margot Lee Shetterly ha già sentito parlare delle “computers”. Così erano chiamati gli impiegati della NASA che lavoravano in un apposito dipartimento a cui erano demandati i calcoli.
Le “computers” furono anche le prime programmatrici della NASA, poiché quando nel 1959 la NASA installò il primo IBM 7090 ed esse rischiavano di essere licenziate, la matematica Dorothy Vaughan le convinse ad imparare il FORTRAN, dicendo loro che o sarebbero state programmatrici o sarebbero state non necessarie (redundant in inglese).
L’ingombrante IBM 7090, prendendo il posto delle “computers” ne prese anche il nome, ed è per questo che noi oggi usiamo il termine “computer”.
Metodo di Eulero e algoritmi Runge-Kutta-Fehlberg
La risoluzione numerica del problema di Cauchy
y’ = f(x, y(x))
y(a) = c
con x Î[a,b], nelle ipotesi in cui la soluzione è unica[1], consiste nel calcolare un’approssimazione yi+1 della soluzione esatta y(xi+1) a partire dai valori yi precedentemente calcolati, essendo xi punti dell’intervallo [a,b] detti punti di griglia
xi = a + i×h h = (b – a)/n.
Si costruisce così a partire da (xn, yn) un insieme di punti yi che approssimano y(xi), in altri termini, si tenta di seguire la traiettoria della curva integrale soluzione del nostro problema di Cauchy.
A seconda che yi+1 dipenda solo da yi o da altri valori precedentemente calcolati, si parla di metodi one-step o di metodi multi-step.
I metodi one-step si basano sostanzialmente sullo sviluppo in serie di Taylor:
[1] si rimanda a tal fine al teorema di esistenza e unicità in grande per le equazioni differenziali

e ricordando che y’ = f(x, y(x)) si trova, trascurando il resto, il seguente schema numerico:

y0 = c k = 0, …, n-1[2]
Schemi più efficienti si ottengono considerando più termini della serie di Taylor.
Tali metodi non sono applicabili per la presenza delle derivate di ordine superiore al primo.
Si utilizzano allora i metodi RK.
Sia
[2] Metodo di Eulero

Il termine generale della serie dove si esprime come combinazione lineare dei valori della f calcolata in particolari punti opportunamente determinati in modo da ottenere l’ordine s voluto.
Il metodo Runge-Kutta a s stadi si esprime:


e richiede s valutazioni della funzione f.
I parametri vengono derivati fissando prima l’ordine s che si desidera raggiungere e poi imponendo che la soluzione numerica yk+1 (nella cui formula Kj sia stato sviluppato in serie di Taylor) coincida con lo sviluppo in serie di Taylor di y(xi+1) di punto iniziale xk fino al termine di ordine s.
Il metodo RK più usato è il metodo a 4 stadi che risulta di ordine 4:

Si osservi che i metodi RK risultano tanto più accurati quanto più piccolo è h (ampiezza di maglia). D’altra parte, però, per h troppo piccolo aumentano sensibilmente gli errori di round-off per cui l’ampiezza di maglia va scelta accuratamente.
Implementazione dell’algoritmo RKF45
A corredo di questo articolo alleghiamo, come al solito, un esempio di codice C#.
Si può clonare il repository dal sito: https://github.com/redazione-nexsoft/rkf45
La nostra libreria espone la sola funzione RKF45 che prende come argomento:
- La funzione f integranda
- Gli estremi A e B dell’intervallo
- Il valore iniziale della funzione integrale Y0 nel punto A (problema di Cauchy)
- La tolleranza usata per il calcolo
- Il numero di intervalli in cui viene diviso l’intervallo [A-B]
var f = (double x, double y) => (1 + Math.Pow(Math.Tan(x), 2)); double A = -1.4; double B = 1.4; double Y0 = -5.797884; double tolmin = 1.000000E-04; int NMAX = 40; var solver = new RKF45Solver(); var points = solver.RKF45(f, A, B, Y0, tolmin, NMAX);
La funzione restituisce un array di punti { X, Y } che rappresentano i valori “approssimati” della funzione soluzione.
OSLO: Open Solving Library for ODEs
Microsoft mette a disposizione una libreria open source per il calcolo delle soluzioni delle equazioni differenziali:
https://www.microsoft.com/en-us/download/details.aspx?id=52643
OSLO implementa oltre ai metodi di Eulero e RK45 altri algoritmi che possono essere usati quando è richiesta una precisione maggiore.
Al contrario dell’implementazione base da noi riportata nel nostro repository, inoltre, OSLO consente di utilizzare equazioni differenziali “spaziali” cioè basate su n dimensioni.
Per un esempio su come utilizzare OSLO si può fare riferimento agli unit test del nostro repository.
var expectedPoints = Ode.RK45( 0, new[] { A, Y0 }, (t, x) => new Vector(1, 1 + Math.Pow(Math.Tan(x[0]), 2) ), new Options { InitialStep = (B - A) / NMAX } ) .TakeWhile(p => p.X[0] >= A && p.X[0] <= B) .ToArray();
In questo caso stiamo usando l’algoritmo RKF45 integrando dall’istante t0 = 0, punto iniziale (A, Y0) e passo d’integrazione pari a B – A / NMAX.
Le funzioni di OSLO sono pensate per essere utilizzate con LINQ quindi restituiscono un IEnumerable<SolPoint> e sarà poi il chiamante a decidere qual è la condizione di terminazione (in questo caso il TakeWhile prende i valori compresi tra A e B).
Si osservi che la funzione integranda è multidimensionale quindi in questo caso è necessario fornire sia la df/dx che la df/dy con
new Vector (dx/dx, dy/dx)
ovvero
new Vector(1, 1 + Math.Pow(Math.Tan(x[0]), 2) ).
Conclusioni: test della libreria
Per verificare graficamente la validità dei risultati nel repository online, sotto la cartella M-files, sono riportati gli script MATLAB® ed i file di dati FUNDIFF1.DAT e FUNDIFF2.DAT contenenti i punti calcolati negli esempi Test1 e Test2 degli UnitTest.
I grafici si ottengono chiamando la funzione
compare (<funzione diff.>, <nome file>)
fundiff1(x, y) = 1 + tan2(x)


Se anche tu vuoi occuparti di progetti di sviluppo IT di ultima generazione
dai un’occhiata alle nostre opportunità di lavoro e conosciamoci subito!