I - Rappels Sur Les Equations Différentielles Ordinaires
I - Rappels Sur Les Equations Différentielles Ordinaires
I - Rappels Sur Les Equations Différentielles Ordinaires
Résolution Numérique
I-1 Programmation
I-1-1 Méthode d’EULER
Cas d’une EDO du premier ordre dont la forme mathématique est :
𝑑𝑑𝑑𝑑
𝑑𝑑𝑑𝑑
= 𝑓𝑓(𝑥𝑥, 𝑦𝑦). A partir de la connaissance de la valeur de 𝑦𝑦 = 𝑦𝑦0 pour une
𝑑𝑑𝑑𝑑
valeur de 𝑥𝑥 = 𝑥𝑥0 , on peut calculer la valeur de 𝑑𝑑𝑑𝑑
en ce point, soit
𝑑𝑑𝑑𝑑
(𝑑𝑑𝑑𝑑 )0. La valeur estimée de y pour 𝑥𝑥 = 𝑥𝑥0 + 𝑑𝑑𝑑𝑑 sera prise égale à
𝑑𝑑𝑑𝑑
𝑦𝑦0 + 𝑑𝑑𝑑𝑑 = 𝑦𝑦0 + (𝑑𝑑𝑑𝑑 )0 𝑑𝑑𝑑𝑑.
En appelant h le pas d’intégration on obtient la forme itérative :
𝑦𝑦𝑖𝑖+1 = 𝑦𝑦𝑖𝑖 + 𝑑𝑑𝑦𝑦𝑖𝑖 = 𝑦𝑦𝑖𝑖 + ℎ 𝑓𝑓(𝑥𝑥𝑖𝑖 , 𝑦𝑦𝑖𝑖 )
On remarquera que les valeurs estimées obtenus seront d’autant plus proches des valeurs exactes que le pas
h est plus petit.
Programme méthode d’Euler
function [t,u]=feuler(odefun,tspan,y0,Nh,varargin ) % [T,Y] = FEULER(ODEFUN,TSPAN,Y0 ,NH,P1,P2 ,...)
%FEULER Résout une équation différentielle avec la % passe
% méthode d’Euler explicite. % les paramètres supplémentaires P1,P2 ,.. à la
% [T,Y]=FEULER(ODEFUN,TSPAN,Y0,NH) avec % fonction ODEFUN de la maniere suivante:
% TSPAN=[T0,TF] % ODEFUN(T,Y,P1 ,P2...).
% intègre le système d’équations différentielles h=(tspan(2)-tspan(1))/Nh;
% y’=f(t,y) du temps T0 au temps TF avec la y=y0(:); % crée toujours un vecteur colonne
% condition w=y; u=y.’;
% initiale Y0 en utilisant la méthode d’Euler tt=linspace (tspan(1),tspan(2),Nh+1);
% explicite sur une grille de NH intervalles for t = tt(1:end -1)
% équi-distribués. La fonction ODEFUN(T,Y) doit w=w+h*feval(odefun,t,w,varargin {:});
% retourner un vecteur, correspondant à f(t,y), u = [u; w.’];
% de même dimension que Y. end
% Chaque ligne de la solution Y correspond t=tt;
% à un temps du vecteur colonne T. return
Il faut d'abord savoir que les fonctions ode résolvent les EDs de premier ordre, et aussi qu'elles n'expriment pas
les résultats sous forme d'expressions mathématique ; elles renvoient un vecteur colonne représentant la
variable "T" (temps en générale) et une matrice "Y" dont les colonnes sont les solutions.
La fonction ode45 est la première fonction à essayer
Considérons le système : 𝑦𝑦′1 = 𝑓𝑓1 (𝑦𝑦1 , 𝑦𝑦2 … .. 𝑦𝑦𝑛𝑛 , 𝑡𝑡)
𝑦𝑦 ′ 2 = 𝑓𝑓2 (𝑦𝑦1 , 𝑦𝑦2 … .. 𝑦𝑦𝑛𝑛 , 𝑡𝑡)
….
𝑦𝑦 ′ 𝑛𝑛 = 𝑓𝑓𝑛𝑛 (𝑦𝑦1 , 𝑦𝑦2 … .. 𝑦𝑦𝑛𝑛 , 𝑡𝑡)
Avec les conditions initiales : 𝑦𝑦1 (0) = 𝑦𝑦10 , 𝑦𝑦2 (0) = 𝑦𝑦20 … 𝑦𝑦𝑛𝑛 (0) = 𝑦𝑦𝑛𝑛0
Rappelons que tout système ou équation différentielle d'ordre supérieur peut se ramener simplement à cette
forme canonique, utilisée dans tous les solveurs d'EDO. Puisqu’une équation différentielle d’ordre m est
équivalente à un système de m équations différentielles d’ordre 1.
On voit donc que la définition d'un tel système repose sur la définition de fonctions de variables. Ces
fonctions devront être programmées dans une fonction MATLAB sous la forme canonique suivante :
function ypoint = f (y, t)
ypoint(1) = f1(y(1), y(2) ... y(n) , t)
...
ypoint(n) = fn(y(1), y(2) ... y(n) , t)
ypoint = ypoint(:);
end
On remarquera que les 𝑦𝑦𝑖𝑖 et les 𝑦𝑦′𝑖𝑖 sont regroupés dans des vecteurs, ce qui fait que la forme de cette fonction
est exploitable quel que soit le nombre d'équations du système différentiel.
La dernière ligne est nécessaire car la fonction doit renvoyer un vecteur colonne et non un vecteur ligne.
Ensuite, pour résoudre cette équation différentielle, il faut appeler un solveur et lui transmettre au minimum :
• Le nom de la fonction.
• Les bornes d'intégration ( et ).
• Les conditions initiales.
Le solveur fournit en sortie un vecteur colonne représentant les instants d'intégration , et une matrice dont la
première colonne représente les les 𝑦𝑦1 calculés à ces instants, la deuxième les 𝑦𝑦2 et la nième les 𝑦𝑦𝑛𝑛 .
Les lignes y1 = ... servent à extraire les différentes fonctions 𝑦𝑦𝑖𝑖 dans des colonnes simples
On a utilisé ici ode45 qui est un Runge-Kutta-Merson imbriqué d'ordre 4 et 5. C'est le plus courant et celui par
lequel il faut commencer, mais il en existe d'autres, en particulier ode15s adapté aux systèmes raides.
Exemple :
𝑦𝑦 ′′ + 0.5𝑦𝑦 ′ + 2𝑦𝑦 = 0 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎 𝑦𝑦(0) = 2 𝑒𝑒𝑒𝑒 𝑦𝑦 ′ (0) = 0
On pose 𝑦𝑦1 = 𝑦𝑦 𝑒𝑒𝑒𝑒 𝑦𝑦2 = 𝑦𝑦′
On obtient 𝑦𝑦′1 = 𝑦𝑦2 𝑒𝑒𝑒𝑒 𝑦𝑦′2 = −0.5𝑦𝑦2 − 2𝑦𝑦1 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎 𝑦𝑦1 (0) = 2 𝑒𝑒𝑒𝑒 𝑦𝑦2 (0) = 0
On crée la fonction :
function dy=equasys(t,y)
dy(1)=y(2) ;
dy(2)=-0.5*y(2)-2*y(1) ;
dy=dy(:) ;
end
On utilise la commande [t,y]=ode45('equasys',[0 10],[2 0]) et on obtient :
t= …
0 9.5868
0.0000 9.7245
0.0001 9.8623
0.0002 10.0000
y= …
2.0000 0 0.1524 -0.1833
2.0000 -0.0001 0.1253 -0.2081
2.0000 -0.0001 0.0955 -0.2237
2.0000 -0.0002 0.0641 -0.2300
Pour l'erreur maximale admissible, relative ou absolue, MATLAB prend une erreur relative max de 10−3 par
défaut, et il est toujours possible de modifier cette valeur, ainsi que bien d'autres paramètres grâce à la routine
de gestion des options odeset.
Exemple :
Soit le système :
e) syms x y f) syms x y
diff(x*sin(x*y), x, y) diff(x*sin(x*y), x, x, x, y)
ans = ans =
2*x*cos(x*y) - x^2*y*sin(x*y) x^2*y^3*sin(x*y) - 6*x*y^2*cos(x*y) - 6*y*sin(x*y)
I-3-2 Integration
int(expr,var), int(expr,var,a,b)
Exemples :
syms x syms x z syms x
int(-2*x/(1 + x^2)^2) int(x/(1 + z^2), z) int(x*log(1 + x), 0, 1)
ans = ans = ans =
1/(x^2 + 1) x*atan(z) ¼
4
I-3-3 Résolution des équations différentielles
S = dsolve(eqn) ; S = dsolve(eqn,cond) ; Y = dsolve(eqns) ; Y = dsolve(eqns,conds)
Exemples :
a) dsolve('Dy = y + 1','x')
ans =
-1 + exp(x) _C1
b) syms y(x);
dsolve(diff(y) == y + 1) and
ans =
-1 + exp(x) _C1
c) dsolve('D2y = x*y','x')
ans =
3*(1/6 x y + _C1 x + _C2)
d) syms y(x)
dsolve(diff(y, 2) == x*y)
ans =
3*(1/6 x y + _C1 x + _C2)
e) syms a b y(t)
dsolve(diff(y) == a*y, y(0) == b)
ans = b*exp(a*t)
g) syms a y(x)
dsolve(diff(y) == a/(y^2 + 1))
Warning: Explicit solution could not be found;
implicit solution returned.
ans =
RootOf(z^3 + 3*z - 3*a*x - 3*C36, z)