razzo.py su latinblog.org

Ultimo aggiornamento: 17 maggio 2008

razzo.py - simulazione numerica in Python

Come compito assegnatoci dal prof. Furio Bobisut per il corso di Fisica 2, ho scritto questo programmino in Python che simula numericamente il lancio verticale di un razzo (sistema a massa variabile) considerando l'attrito dell'aria (termine lineare e termine quadratico) e la variazione della forza di gravità con l'altezza.

Scarica il programma razzo.py.tar.gz


Installazione
Per eseguire lo script basta avere un sistema Linux (in teoria anche Mac) con installati il celebre programma Gnuplot e la sua interfaccia con Python Gnuplot.py.

Su Ubuntu o Debian si installa tutto il necessario con il comando:
sudo apt-get install gnuplot python-numpy python-gnuplot
almeno se si vuole sfruttare la possibilità di creare grafici "al volo".
Per le altre distribuzioni Linux ho creato uno script: setup.sh. Per eseguirlo:
chmod 755 setup.sh
./setup.sh
Per eseguire il programma, scaricate razzo.py e, una volta nella cartella in cui si trova questo file sul vostro computer, estraetelo dall'archivio e date alla shell il comando 'python razzo.py'.

Features
  • Completo controllo su otto parametri del modello:
    • massa iniziale del razzo
    • velocità relativa del carburante espulso
    • consumo di carburante per unità di tempo
    • coefficiente aerodinamico Cx
    • superficie trasversale
    • coefficiente di viscosità k in F = -kηv
    • lunghezza degli intervallini di tempo su cui eseguire l'integrazione numerica
    • durata complessiva della simulazione
  • Visualizzazione interattiva di tutti i grafici interessanti della simulazione: tempo/altezza, tempo/velocità, tempo/forze, velocità/forze e molte altre combinazioni.
  • Salvataggio automatico di sette parametri per ogni istante di tempo, in vista di ulteriori elaborazioni: tempo trascorso, velocità, altezza, spinta del razzo, attrito dell'aria, forza di gravità, somma delle forze.
Il modello
Il modello impiegato si basa sulle seguenti approssimazioni:
  • Il razzo si muove solo in direzione verticale.
  • Non c'è nessun tipo di fenomeno meteorologico.
  • La Terra è un sistema di riferimento inerziale, ovvero non si tiene conto di nessuna forza apparente.
  • Il razzo brucia il carburante a ritmo costante fino all'esaurimento del serbatoio, dopo di che la spinta diventa istantaneamente nulla.
  • L'attrito dell'aria è nella forma
  • La temperatura è ovunque costante, e vale 293 K.
  • La pressione dell'aria dipende dall'altezza secondo la formula: , dove M è la massa molare dell'aria, R è la costante dei gas e T la temperatura vista sopra. Solo per questa formula, si suppone l'accelerazione di gravità g come costante. Questo fino ad una quota di 400km, dopo di che si pone l'attrito dell'aria costantemente nullo.
  • L'aria è un gas perfetto, quindi la densità dipende solo dall'altezza attraverso la pressione:
Il codice
Il codice si può consultare integralmente aprendo il file razzo.py con un qualsiasi editor di testo. Dovrebbe essere adeguatamente commentato. Descrivo qui brevemente la funzione chiave della simulazione, ovvero quella che passa dallo stato all'istante t allo stato all'istante t+dt. Il razzo è descritto da una lista che funge da vettore di stato con quattro componenti, nell'ordine: tempo trascorso, velocità, altezza, serbatoio. I primi tre sono numeri a virgola mobile, il serbatoio può essere solo pieno o vuoto. La funzione aggiorna(Q) prende il vettore di stato Q e lo aggiorna all'istante di tempo successivo. Il codice Python è:
def aggiorna(Q):
    F = razzo - attrito(Q)-grav(Q)
    acc = F/m(Q)
    Q[2]+= Q[1]*dt+0.5*acc*dt**2
    Q[1]+=acc*dt
    Q[0]+= dt
    return Q
Ci si potrebbe chiedere se l'ordine in cui vengono eseguite le tre operazioni di aggiornamento sia importante, ma il risultato di simulazioni con altre combinazioni differisce al massimo per qualche decina di centimetri, quindi qualche ordine di grandezza sotto gli errori dovuti alle altre approssimazioni del modello impiegato. Le espressioni dell'attrito e della forza di gravità sono ancora più ovvie. Un problema interessante è come tenere la massa del razzo "ben discosta" da zero, onde evitare risultati non realistici, come un'accelerazione enorme o una gravità troppo piccola. In questo programma ho impostato una massa minima uguale a una costante (100 è il valore predefinito) per il consumo istantaneo per la lunghezza degli intervallini dt. In pratica la costante dice quanti intervallini il razzo potrebbe ancora percorrere con i motori accesi prima di avere massa nulla.

Licenza
Il programma è distribuito con la licenza Gnu GPL 3.