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