probleme de divergence avec runge kutta d'ordre 2 pour un pendule simple
Bonjour,
j'applique la méthode de runge kutta à l'ordre 2 pour résoudre l'équation différentielle du pendule simple sans frottement. Je la réduit à un système d'ordre 1 comme ceci:
u=d(theta)/dt
du/dt=(g/l)cos(theta)=F(theta,g,l)
avec F la fonction suivante:
Code:
1 2 3 4 5 6 7 8 9 10
|
long double F(long double theta, long double g, long double a)
{
long double r;
r=(g/a)*cosl(theta);
return r;
} |
je calcule les coefficients qui sont dans un tableau k[4][4] en prenant comme vecteur : (dt/dt=1,d^2 t/dt^2=0,dtheta_dt,F(theta,g,l)=d^2theta/dt^2)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
k[0][0]=h;
k[0][1]=0;
k[0][2]=h*dtheta_dt[i];
k[0][3]=h*F(theta[i],g,l);
k[1][0]=h;
k[1][1]=h*k[0][1]/2;
k[1][2]=h*(dtheta_dt[i]+(k[0][2]/2));
k[1][3]=h*F((theta[i]+(k[0][3]/2)),g,l);
k[2][0]=h;
k[2][1]=h*k[1][1]/2;
k[2][2]=h*(dtheta_dt[i]+(k[1][2]/2));
k[2][3]=h*F((theta[i]+(k[1][3]/2)),g,l);
k[3][0]=h;
k[3][1]=h*k[2][1];
k[3][2]=h*(dtheta_dt[i]+k[2][2]);
k[3][3]=h*F((theta[i]+k[2][3]),g,l); |
et puis la formule de récurrence :
Code:
1 2 3
|
t[i+1]=t[i]+h*((k[0][0]+2*(k[1][0]+k[2][0])+k[3][0])/6);
theta[i+1]=theta[i]+h*((k[0][2]+2*(k[1][2]+k[2][2])+k[3][2])/6); |
Les résultats sont représentés sur les deux graphiques joints. pend.pdf montre le résultat sur 300s (abcisse) et pend2.pdf sur 30s.
Je ne comprends pas pourquoi l'amplitude des oscillations augmente avec le
temps comme c'est montré sur pend.pdf. Est ce lié à l'erreur de la méthode numérique utilisée ? je prends comme conditions initiales t[0]=0,theta[0]=0 et dtheta_dt[0]=0 et h le pas d'incrémentation égal à 0.01. je pense que le calcul des coef est bon.
Je vous remercie d'avance pour toute aide.