Scroll Top
Via Antonio Amato, 20/22 84131 Salerno (SA)

Anniversario allunaggio: quando i computer erano umani

Img-blog-nexsoft-allunaggio

(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:

Orbita allunaggio

Sono disponibili online diverse risorse per chi fosse curioso tra cui segnaliamo: https://dmi.units.it/~fonda/Appunti_Modelli_1_17_18.pdf

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 y 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

equazione Relero

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!

Questo sito utilizza cookies propri e si riserva di utilizzare anche cookie di terze parti per garantire la funzionalità del sito e per tenere conto delle scelte di navigazione.
Per maggiori dettagli e sapere come negare il consenso a tutti o ad alcuni cookie è possibile consultare la Cookie Policy.

USO DEI COOKIE

Se abiliti i cookie nella tabella sottostante, ci autorizzi a memorizzare i tuoi comportamenti di utilizzo sul nostro sito web. Questo ci consente di migliorare il nostro sito web e di personalizzare le pubblicità. Se non abiliti i cookie, noi utilizzeremo solo cookies di sessione per migliorare la facilità di utilizzo.

Cookie tecnicinon richiedono il consenso, perciò vengono installati automaticamente a seguito dell’accesso al Sito.

Cookie di statisticaVengono utilizzati da terze parti, anche in forma disaggregata, per la gestione di statistiche

Cookie di social networkVengono utilizzati per la condivisione di contenuti sui social network.

Cookie di profilazione pubblicitariaVengono utilizzati per erogare pubblicità basata sugli interessi manifestati attraverso la navigazione in internet.

AltriCookie di terze parti da altri servizi di terze parti che non sono cookie di statistica, social media o pubblicitari.