Rimbalzi di una palla

Per simulare i rimbalzi di una palla si può utilizzare il calcolo ricorrente e un "trucco informatico" che verrà esposto dopo.

Il nocciolo fisico della simulazione è molto semplice. Una volta assegnati i valori iniziali delle variabili t, vx, vy, x, y e portata la tartaruga nella posizione iniziale (con assegna posizione  asPos) ecco il ciclo di ripetizioni necessario:

repeat
           vy:=vy-9.8*dt;
           x:=x+vx*dt; y:=y+vy*dt;
           aspos(x,y);
           controlla;
           t:=t+dt
until t>tmax ;

Durante il moto senza attrito la vx non varia e nemmeno l'accelerazione.

La procedura controlla dentro il ciclo si incarica di verificare se la tartaruga palla urta il "pavimento" o le "pareti" di una ipotetica stanza:

procedure controlla;
begin
     if y<-300 then begin y:=-299; vy:=-vy*0.98 end;
     if y>300 then begin y:=299; vy:=-vy*0.98 end;
     if x<-400 then begin x:=-399; vx:=-vx*0.98 end;
     if x>400 then begin x:=399; vx:=-vx*0.98 end;
end;

Se l'ordinata della palla è minire di -300 allora vuol dire che deve avvenire l'urto con il pavimento e quindi essa viene riportata un pochino più sopra a -299 ed inoltre la vy deve essere invertita (segno meno) ed anche un po' rimpicciolita (fattore ad esempio 0.98 dipendente dalla elasticità dell'urto su suggerimento del prof. Orazio Casella). Allo stesso modo per il "tetto" cioè y>300 e per le pareti a destra e a sinistra.

E' chiaro che i valori di x e y dipendono da come si disegna inizialmente la "stanza". Inoltre le variabili x, y, vx, vy debbono essere delle variabili globali valide in tutta la unit. Per ottenere ciò basta inserire la dichiarazione delle variabili (var <nomi>: <tipo> ;) prima delle procedure.

A questo punto è possibile visualizzare il risultato in modi diversi:

Per ottenere un intervallo di tempo regolare basta utilizzare la funzione del Pascal a mod b che restituisce il resto nella divisione intera fra a e b (vedi tipi integer). Si prende ad esempio un contatore n per memorizzare il numero di volte in cui viene eseguito il ciclo e si scrive:

if (n mod 150 =0)  then begin
                                       pennagiu;
                                       quadrato(10);
                                       pennasu
                                   end;

Ogni 150 iterazioni del ciclo principale, viene disegnato un quadrato di lato 10 e viene riportata "su" la penna della tartaruga.

Grazie alle possibilità offerte dal Delphi è possibile che chi esegue il programma scelga il modo di visualizzazione con appositi checkbox oltre alle velocità iniziali e al tempo della simulazione.
Listato


Volendo estendere la simulazione è particolarmente simpatico aggiungere un "vetro" contro cui la palla rimbalza. Il vetro non è altro che lasciare bianco un segmento delle pareti mentre esse vengono disegnate.

Più complessa è l'introduzione di una "buca" dentro cui la palla può cadere mettendo fine alla simulazione. Per fare questo è necessario un controllo delle coordinate più raffinato (nell'intervallo della buca, la palla non deve rimbalzare ma cadere) ed anche bisogna scrivere in modo adeguato il predicato che chiude il ciclo repeat ... until . Ad esempio.

until (t>tmax) or ((y<-300) and (x>-50) and (x<50)) ;

Dal punto di vista didattico è molto istruttivo per gli studenti controllare rigorosamente le coordinate e comprendere le operazioni logiche per ottenere di fermare la simulazione dopo la caduta nella buca della palla. E' faticoso scrivere, correggere e far girare il programma, ma alla fine la soddisfazione è notevole. Tutto questo attiene al programma di matematica.



Tornando invece alla fisica è interessante inserire un'altra finestra per visualizare l'energia cinetica, l'energia potenziale gravitazionale e l'energia totale. Il discorso è perfettamente analogo a quanto già detto a proposito dell'energia durante l'oscillazione di una molla.

Si può aprire una ulteriore finestra in un altro "form2" del Delphi per visualizzare il grafico della energie al variare del tempo (o dello spazio). Per i particolari relativi all'inserimento di un altro "form" vedi: più finestre

Dopo aver impostato form2.finestra(...) con gli stessi valori del form1.finestra (oppure form2.finestra2(...) con altri valori se si utilizza grafica2),  ed eventualmente form2.assi, si può inserire nel ciclo repeat ...  until precedente una riga di questo tipo:

form2.disegnaPunto(t,Ec, clred);

oppure

form2.disegnaPunto2(t,Ec, clred);
se si utilizza grafica2.

Si può così visualizzare l'effetto della perdita di energia cinetica dovuto agli urti.