Vous êtes sur la page 1sur 3

TP 1 - Résolution des équations avec Matlab

Rappels :

I- Résolution des équations algébriques


a) fzero
Cette commande permet de trouver une racine d’une fonction non linéaire autour d’une estimation initiale x0
Syntaxe : x = fzero(fun,x0)
x = fzero(fun,x0,options)

Exemple :
function y = f(x)
y = x.^3 - 2*x - 5;

g = @f; % déclaration de la fonction g ou x0 = [1 2]; % intervalle initial


x0 = 2; % valeur initiale x = fzero(‘f ’,x0)
z = fzero(g,x0) On remarquera ici que le symbole f est mis entre
primes. Cela vient du fait qu'ici, la définition de la
fonction f est faite dans un fichier

b) fsolve
Cette commande permet de trouver les racines d’un système d’équations non linéaires en démarrant à partir du vecteur
initial x0
Syntaxe : x = fsolve(fun,x0)
x = fsolve(fun,x0,options)

Exemple :
2𝑥𝑥1 − 𝑥𝑥2 = 𝑒𝑒 −𝑥𝑥1 ⇒ 2𝑥𝑥1 − 𝑥𝑥2 − 𝑒𝑒 −𝑥𝑥1 = 0
−𝑥𝑥1 + 2𝑥𝑥2 = 𝑒𝑒 −𝑥𝑥2 ⇒ −𝑥𝑥1 + 2𝑥𝑥2 − 𝑒𝑒 −𝑥𝑥2 = 0
function F = sys(x)
F = [2*x(1) - x(2) - exp(-x(1)) ; -x(1) + 2*x(2) - exp(-x(2))];

x0 = [-5; -5];
[x,fval] = fsolve(@sys,x0)

x= fval =
0.5671 1.0e-006 *
0.5671 -0.4059
-0.4059

1
II- Résolution des équations différentielles
Solver : ode45 , ode23 , ode123 …
Syntaxe: [T,Y] = solver(odefun,tspan,y0)
[T,Y] = solver(odefun,tspan,y0,options)

Il faut d'abord savoir que les fonctions ode résolvent les EDOs 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.

Exemple : Equation différentielle ordinaire du deuxième ordre


𝑑𝑑2 𝑦𝑦(𝑡𝑡) 𝑑𝑑𝑑𝑑(𝑡𝑡) 𝑑𝑑𝑑𝑑(𝑡𝑡0 )
Pour l’équation différentielle = 𝑓𝑓 �𝑡𝑡, 𝑦𝑦(𝑡𝑡), � 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎 𝑦𝑦(𝑡𝑡0 ) = 𝑐𝑐1 𝑒𝑒𝑒𝑒 = 𝑐𝑐2
𝑑𝑑𝑡𝑡 2 𝑑𝑑𝑑𝑑 𝑑𝑑𝑑𝑑
𝑑𝑑𝑑𝑑(𝑡𝑡)
on pose 𝑦𝑦1 (𝑡𝑡) = 𝑦𝑦(𝑡𝑡) 𝑒𝑒𝑒𝑒 𝑦𝑦2 (𝑡𝑡) =
𝑑𝑑𝑑𝑑
𝑦𝑦′1 = 𝑦𝑦2 (𝑡𝑡) 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎 𝑦𝑦1 (𝑡𝑡0 ) = 𝑐𝑐1
on obtient alors le système �
𝑦𝑦′2 = 𝑓𝑓(𝑡𝑡, 𝑦𝑦1 (𝑡𝑡), 𝑦𝑦2 (𝑡𝑡)) 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎 𝑦𝑦2 (𝑡𝑡0 ) = 𝑐𝑐2

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 yprime = f (y, t)


yprime(1) = f1(y(1), y(2) ... y(n) , t)
...
yprime(n) = fn(y(1), y(2) ... y(n) , t)
yprime = yprime (:);
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 𝑦𝑦1 calculés à ces instants, la deuxième les 𝑦𝑦2 et la nième les 𝑦𝑦𝑛𝑛 .

2
L'appel du solveur prend donc en général la forme suivante :
[t, y] = ode45 ('f', [tmin tmax], [y10 y20 ... yn0] );
y1 = y(:,1);
y2 = y(:,2);
...
yn = y(:,n);
plot(t, y1, t, y2) % par exemple on trace y1(t) et y2(t)

Les lignes y1 = ... servent à extraire les différentes fonctions 𝑦𝑦𝑖𝑖 dans des colonnes simples.
On a utilisé ici ode45 qui est un Runge-Kutta explicite 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.

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 :

On crée la fonction Matlab sysedo représentant ce système :


function dy = sysedo(t,y)
dy = zeros(3,1); % a column vector
dy(1) = y(2) * y(3);
dy(2) = -y(1) * y(3);
dy(3) = -0.51 * y(1) * y(2);
On résout le système dans l’intervalle [0,12s] en modifiant les tolérances :
options = odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]);
[T,Y] = ode45(@sysedo,[0 12],[0 1 1],options);
plot(T,Y(:,1),'-',T,Y(:,2),'-.',T,Y(:,3),'.')

Exercices:
1) Soit la fonction f(x) = cos(x) – x. Trouver la racine de cette fonction.
2) Considérons l’équation différentielle 𝑦𝑦 ′′ + 0.5𝑦𝑦 ′ + 2𝑦𝑦 = 0 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎 𝑦𝑦(0) = 2 𝑒𝑒𝑒𝑒 𝑦𝑦 ′(0) = 0
Tracer l’allure de sa solution sur l’intervalle [0 10].