Fare scienza con il computer - appunti II incontro - 19 gennaio 2007 M. Peressi
FILES DA COPIARE: Calcola.java Calcolai.java Sommameta.java MotoParabolico.java MotoParabolico2.java PuntoMateriale.java Vettore.java E POI USEREMO: gnuplot BlueJ
Evoluzione nel tempo - I A volte (poche!) conosciamo esplicitamente la legge oraria del moto, ad esempio: moto uniforme (=con velocita’ costante) moto uniformemente accelerato (=con accelerazione costante):
Ma pochi moti avvengono in una dimensione... Generalizziamo almeno al caso bidimensionale, ricordando la scomposizione di un vettore v nelle sue componenti vx , vy nel piano cartesiano: (vale per vettore posizione, velocita’, accelerazione, forza...) Utile nel caso di un corpo soggetto alla gravita’ sulla superficie terrestre: con la scelta dell’asse y verticale e’ Fx = 0, Fy = -mg (costante) e quindi : ax = 0, ay = -g (costante)
In tal caso e’ immediato calcolare e per un qualunque , date e , come e’ fatto in MotoParabolico.java , dove e’ descritto appunto il moto uniforme in e uniformemente accelerato in di un corpo soggetto a gravita’: ... t = i*dt; x = x0 + vx0*t ; y = y0 + vy0*t - 0.5*g*t*t; e un ciclo su t (cioe’ su i) permette di calcolare l’evoluzione:
t, x e y possono essere scritti su un file (vedi moto.dat): 0.0 0.0 0.0 0.2 0.36 3.4038 0.4 0.648 5.73444 0.6000000000000001 0.8784000000000001 7.206552 ... ... ... Per i grafici possiamo usare gnuplot: $ gnuplot G N U P L O T Version 3.7 patchlevel 3 last modified Thu Dec 12 13:00:00 GMT 2002 ..... Terminal type set to 'x11' gnuplot> p 'moto.dat' u 1:2 gnuplot>
i grafici (con gnuplot) di x e y in funzione del tempo: e quello della traiettoria (per ogni istante di tempo, rappresento il punto (x,y) e cosi’ ottengo y in funzione di x):
Evoluzione nel tempo - II Ma si puo’ anche costruire “a pezzetti” l’evoluzione temporale, calcolando a partire da ; da notare pero’ che la velocita’ da usare non e’ quella iniziale, ma quella in quell’istante di tempo, cioe’ . Se e’ presente un’accelerazione, in generale si avra’ :
Questo e’ l’algoritmo di EULERO Solita equazione del moto uniformemente accelerato, ma riferita all’intervallino di tempo , che va ripetutamente applicata da un intervallo a quello successivo (iterazione). Questo e’ l’algoritmo di EULERO iterare
Cosi’ e’ implementato in modo del tutto generale in PuntoMateriale Cosi’ e’ implementato in modo del tutto generale in PuntoMateriale.java per e e relative velocita’, e dove, sempre per massima generalita’, l’accelerazione e’ dedotta dalla forza (ricordiamo F=ma): public Vettore getPosEulero(... ... ax = forza(pos).x/massa; ay = forza(pos).y/massa; pos.x = pos.x + vel.x * dt + 0.5 * ax * dt * dt ; pos.y = pos.y + vel.y * dt + 0.5 * ay * dt * dt ; vel.x = vel.x + ax * dt; vel.y = vel.y + ay * dt; (pos.x, pos.y : componenti x e y del vettore pos ; analogamente per vel.x, vel.y, f.x, f.y, ...)
... e il programma MotoParabolico2.java utilizza la classe PuntoMateriale e quindi getPosEulero per e e velocita’, con l’opportuna precisazione delle condizioni iniziali: ... PuntoMateriale(x0,y0,vx0,vy0,t0,massa) Si ritrova l’esempio iniziale (moto uniformemente accelerato di un grave) definendo correttamente la forza in PuntoMateriale.java: public Vettore forza(Vettore p){ f.x = 0; f.y = - massa * g; return f; }
e i risultati sono gli stessi di prima... Strada piu’ complicata... pero’ piu’ generale, possibile seguirla anche al caso non banale in cui la forza NON sia costante nel tempo, e/o dipenda dalla posizione (vedremo gravitazione universale [Keplero]!) o dalla velocita’. Qualunque moto puo’ essere “spezzettato” in intervallini di tempo piccoli in cui possa essere considerato uniformemente accelerato:
“alla fratelli Lumiere”... a partire da: x(2) v(2) x(3) v(3) x(1) v(1) ... ... “alla fratelli Lumiere”...
Strada piu’ complicata Strada piu’ complicata... pero’ piu’ generale, possibile seguirla anche al caso non banale in cui la forza NON sia costante nel tempo, e/o dipenda dalla posizione (vedremo gravitazione universale [Keplero]!) o dalla velocita’. Ad esempio aggiungiamo un attrito dipendente dalla velocita’: . In PuntoMateriale.java : final private double gamma = 1.0 public Vettore forza(Vettore p, Vettore v){ f.x = - gamma * v.x; f.y = - massa * g - gamma * v.y; return }
risultati ??? mentre con “carta e penna” questo problema e’ MOLTO piu’ difficile da risolvere, con il computer no! ......
i grafici (con gnuplot) di x e y in funzione del tempo: e quello della traiettoria :