TP1 : Etude de méthodes de résolution des équations différentielles

Transcription

TP1 : Etude de méthodes de résolution des équations différentielles
TP1 : Etude de méthodes de résolution des équations différentielles
ordinaires à pas constant - solutions pour l’exercice 1
Sylvie Putot
8 février 2007
Dans ce TP, on va étudier plusieurs types de méthodes d’intégration à pas constant d’équations
différentielles ordinaires.
On appliquera ces méthodes à l’intégration d’un problème simple : l’équation régissant le mouvement d’un pendule simple de longueur l et faisant un angle θ par rapport à la verticale :
g
θ̈(t) = − sin(θ(t)).
l
(1)
On rappelle que g = 9.81, et on prendra pour l’implémentation l = 1.
1
Résolution par la méthode d’Euler explicite
• Ecrire une fonction matlab décrivant l’équation du pendule (1) comme un système d’équations
différentielles d’ordre 1. On la définira sous la forme
function thetaprime = Fpendule(t,theta)
[...]
On sauvera cette fonction dans un fichier matlab au nom de la fonction, Fpendule.m. (dans
laquelle on exprime le système sous la forme générale Θ̇(t) = F (t, Θ(t))).
Une solution pour Fpendule.m : Les variables theta et thetaprime sont des vecteurs de
longueur 2, theta(1) représente l’angle θ(t) que le pendule fait avec la verticale, theta(2)
représente θ̇(t). Un exemple de fichier Fpendule.m
function thetaprime = Fpendule(t,theta)
% g est la pesanteur, l la longueur du pendule,
% theta(1) l’angle qu’il fait avec la verticale, theta(2) la derivee de theta(1)
g = 9.81;
l = 1;
thetaprime = [theta(2); -g/l*sin(theta(1))]; % vecteur colonne
• Programmer la méthode d’Euler explicite, pour un système d’ordre 1 et de dimension quelconque. On définira une fonction
1
function [t,theta] = Euler(fct,trange,theta0,N)
[...]
– qui prend en entrée
∗
∗
∗
∗
un pointeur fct sur la fonction que l’on veut intégrer,
l’intervalle de temps sur lequel on veut résoudre le système, trange = [tmin tmax],
l’état theta0 du pendule à l’instant initial tmin,
et le nombre de pas à effectuer dans l’intervalle,
– qui retourne dans le tableau theta, la solution du système en N instants choisis à
intervalle régulier dans l’intervalle trange. Ces instants sont mémorisés dans le vecteur
t.
L’évaluation de la fonction fct à l’intérieur de la fonction Euler, avec les paramètres t et x,
se fait par feval(fct,t,x).
Une solution pour Euler.m :
function [t,theta] = Euler(fct,trange,theta0,N)
t0 = trange(1); t1 = trange(2);
h = (t1-t0)/N;
t = t0 : h : t1;
theta(1,:) = theta0’;
% ’ = conjugué
for k=1:N,
theta(k+1,:) = theta(k,:) + h*feval(fct,t0,theta(k,:))’;
end
Ici, theta sera une matrice à N lignes et 2 colonnes (pour rendre le résultat sous le même
format que la fonction de matlab ode45), theta0 et le résultat de Fpendule sont des matrice
à 2 lignes et 1 colonne, (vecteurs colonnes), on prend donc leurs conjugués.
• L’état initial du pendule définit l’amplitude du mouvement : si celle-ci est faible, la solution
de l’équation linéarisée
g
θ̈(t) = − θ(t)
(2)
l
donne une bonne approximation du comportement du pendule. On va vérifier la validité de
cette approximation pour différents états initiaux, en comparant pour chacun le résultat de
l’intégration numérique de l’équation du pendule avec la solution analytique du problème
linéarisé.
– écrire une fonction
function theta = PenduleLinearise(t,theta0)
[...]
qui calcule la solution analytique de ce problème en chaque point du tableau de temps
t, et pour theta0 l’état du pendule à l’instant t(0).
Une solution :
2
function theta = PenduleLinearise(t,theta0)
g = 9.81;
l = 1.0;
for k=1:length(t),
theta(k,1) = theta0(2)*sqrt(l/g)*sin(t(k)*sqrt(g/l))+
theta0(1)*cos(t(k)*sqrt(g/l));
theta(k,2) = theta0(2)*cos(t(k)*sqrt(g/l))theta0(1)*sqrt(g/l)*sin(t(k)*sqrt(g/l));
end
– définir un fichier de script Exercice1.m qui trace sur un même graphique, pour l’intervalle
de temps [0,5], et pour l’état initial θ(0) = 0.1, θ̇(0) = 0 :
∗ la solution θ(t) du pendule, calculée par la méthode d’Euler avec 5000 points
d’intégration,
∗ la solution du pendule donnée par la méthode prédéfinie de Matlab ode45,
∗ la solution analytique de l’équation linéarisée.
Recommencer pour θ(0) = 1, θ̇(0) = 0.
Une solution pour Exercice1.m :
trange = [0 5];
%----------------------------------------------------------------------thetazero1 = [0.1; 0]; % approx faibles amplitudes acceptables
% Euler explicite
[tE,thetaE] = Euler(@Fpendule,trange,thetazero1,5000);
plot(tE,thetaE(:,1),’b-’);
hold on; % pour superposer les courbes
% Avec Runge-Kutta d’ordre 4-5 de Matlab
[t1,theta1] = ode45(@Fpendule,trange,thetazero1);
plot(t1,theta1(:,1),’r-’);
% comparaison avec solution analytique du pendule linéarisé
theta_analytique = PenduleLinearise(tE,thetazero1);
plot(tE,theta_analytique(:,1),’m-’)
%-----------------------------------------------------------------------thetazero1 = [1; 0]; % approx faibles amplitudes plus acceptable
figure; % pour ouvrir une nouvelle fenetre graphique
% Euler explicite
[tE,thetaE] = Euler(@Fpendule,trange,thetazero1,5000);
plot(tE,thetaE(:,1),’b-’);
3
hold on; % pour superposer les courbes
% Avec Runge-Kutta d’ordre 4-5 de Matlab
[t1,theta1] = ode45(@Fpendule,trange,thetazero1);
plot(t1,theta1(:,1),’r-’);
% comparaison avec solution analytique du pendule linéarisé
theta_analytique = PenduleLinearise(tE,thetazero1);
plot(tE,theta_analytique(:,1),’m-’)
4

Documents pareils