Università di Bologna - Facoltà di
Ingegneria II - Sede di Forlì
|
|
Fisica Generale Interattiva
prof. Domenico Galli
|
|
Pendolo semplice
Punto materiale vincolato a una circonferenza
giacente su di un piano verticale, soggetto alla
forza peso
Soluzione mediante il metodo di Runge-Kutta del IV
ordine
Parametri e condizioni iniziali suggeriti per iniziare:
- Lunghezza = 1 m, Massa = 0.1 kg, Angolo iniziale = 30°, Velocità
angolare iniziale = 0 °/s, Intervallo di tempo = 12 s, Intervallo di
scansione = 0.03 s: Piccole oscillazioni. Moto di librazione
armonico.
- Lunghezza = 1 m, Massa = 0.1 kg, Angolo iniziale = 179°, Velocità
angolare iniziale = 0 °/s, Intervallo di tempo = 12 s, Intervallo di
scansione = 0.03 s: Moto di librazione non armonico.
- Lunghezza = 1 m, Massa = 0.1 kg, Angolo iniziale = 180°, Velocità
angolare iniziale = 10 °/s, Intervallo di tempo = 12 s, Intervallo
di scansione = 0.03 s: Moto di rotazione non uniforme.
- Lunghezza = 1 m, Massa = 0.1 kg, Angolo iniziale = 180°, Velocità
angolare iniziale = −10 °/s, Intervallo di tempo = 12 s, Intervallo
di scansione = 0.03 s: Moto di rotazione non uniforme.
Per avviare l'Applet "cliccare" il bottone qui sotto.
Algoritmo di Runge-Kutta del IV
ordine per il pendolo semplice:
for(i=0;t<tMax;)
{
// algoritmo di Runge-Kutta IV ordine
k1=v*deltaT;
j1=a*deltaT;
vm1=v+j1/2;
am1=-g*Math.sin(x+k1/2)/l;
k2=vm1*deltaT;
j2=am1*deltaT;
vm2=v+j2/2;
am2=-g*Math.sin(x+k2/2)/l;
k3=vm2*deltaT;
j3=am2*deltaT;
vf=v+j3;
af=-g*Math.sin(x+k3)/l;
k4=vf*deltaT;
j4=af*deltaT;
x=x+(k1+2*k2+2*k3+k4)/6;
v=v+(j1+2*j2+2*j3+j4)/6;
a=-g*Math.sin(x)/l;
// fine algoritmo di Runge-Kutta IV ordine
// xpg=angolo nel primo giro. -PI<xpg<PI
xpg=x-2*Math.PI*Math.floor((x+Math.PI)/(2*Math.PI));
r=m*l*v*v+m*g*Math.cos(xpg); // reazione vincolare
t=t+deltaT;
i++;
if(t>tMax)break;
// se ci sono > 10000 punti, memorizza 1 punto ogni storePeriod punti
if(i%storePeriod==0)
{
lxt.add(new Point2D.Float((float)t,(float)(180.0*xpg/Math.PI)));
lvt.add(new Point2D.Float((float)t,(float)(180.0*v/Math.PI)));
lat.add(new Point2D.Float((float)t,(float)(180.0*a/Math.PI)));
lrt.add(new Point2D.Float((float)t,(float)r));
lvx.add(new Point2D.Float((float)(180.0*x/Math.PI),
(float)(180.0*v/Math.PI)));
}
}
Indice Fisica Interattiva
February 21, 2004, Domenico
Galli