TP1 Calcul approché, résolution d'équation f(x)=0
On s'interesse à la résolution numérique d'une équation f(x)=0
, où de manière équivalente à
g(x)=x
avec g(x)=f(x)+x
.
Lisez d'abord l'aide sur scilab.
Si vous avez des problèmes d'affichages, lancez scilab depuis la console avec
LIBGL_ALWAYS_SOFTWARE=1 /usr/bin/scilab
Exécuter sous Scilab.
Les commandes Scilab peuvent être tapées directement en ligne. Par exemple,
--> x = 1
--> A = ones(3,2);
--> x + A
Le caractère ;
à la fin de la ligne indique si scilab affiche le résultat de la commande. Les commandes peuvent
écrites dans un fichier *.sce
.
- Enregistrez les instructions suivantes dans un fichier
test.sce
.
clc;clear;
A = rand(3,4)
Exécutez "le fichier" avec exec("test.sce")
.
- On peut définir des fonctions, et les placer dans un fichier :
// (commentaires en Scilab) Fonction carre.sci
function [res] = carre(x)
res = x.*x
endfunction
- Faites
exec("carre.sci")
. La fonction carre est maintenant définie sous Scilab
--> x = carre ([0,1,2,3,4])
--> y = carre(x)
--> plot2d(x,y)
Calcul approché
Récupérez le fichier myF.sci qui définit la fonction suivante :
function [ y ] = myF( x )
y = x;
for i=1:50
y = sqrt(y);
end
for i=1:50
y = y.*y;
end
endfunction
- Charger
myF
dans scilab, et calculer la fonction pour quelques valeurs. - Que vaut en théorie la fonction
myF
? Tracez-là sur[0,100]
. - Tracez l'erreur en valeur absolue entre la fonction, et sa valeur théorique.
Méthode du point fixe
On cherche à résoudre l'équation
x - \cos x = 0, \,\, x\in [0,1]
Sous certaines hypothèses (cf TD), la suite définie par
\left\{\begin{array}{l}
x_0\in I \\
x_{n+1} = g(x_n)
\end{array}\right.
converge vers un point fixe de g
. Ici, g(x) = \cos x\,\, , \,x\in [0,1]
.
- Récupérez le fichier pointFixe.sci définissant la fonction
function [ y ] = pointFixe(x0,n)
y = x0;
for i = 1:n
y = ...
end
endfunction
Cette fonction prend en entrée x0
une valeur initiale de la suite et n
le nombre d'itérations.
La fonction doit retourner y
valant x_n
.
Complétez le fichier, chargez la fonction, et vérifiez pour différentes valeurs
initiales de [0,1]
que la suite converge vers le même l = \cos l
. Que vaut l
? Normalement,
l \approx 0.739085133215161
.
- Récupérez le fichier pointFixeErreur.sci définissant la fonction
function [ err ] = pointFixeErreur(x0)
for i=1:50
y = pointFixe(x0,i)
err(i) = ...
end
endfunction
Cette fonction prend en entrée x0
une valeur initiale de la suite. Complétez la fonction pour que err(i)
vale
|e_i|
l'erreur commise à l'étape i
, en valeur absolue.
- Tracez l'évolution de l'erreur :
erreur = pointFixeErreur(0.1)
plot2d(erreur)
- Récupérez le fichier pointFixeVitesseConvergence.sci qui définit la fonction
function [ ratio ] = pointFixeVitesseConvergence(x0)
err = pointFixeErreur(x0);
for i = 1:49
ratio(i) = ...
end
endfunction
Cette fonction prend en entrée x0
une valeur initiale de la suite. Complétez le fichier pour que ratio(i)
vale
\frac{|e_{i+1}|}{|e_i|}
.
Chargez la fonction, et tracez le résultat. Vérifie-t'on que la méthode est d'ordre 1 ?
Dichotomie
Principe de la méthode
On se donne une fonction continue f
sur l'intervalle [a,b]
sur lequel f
ne s'annule qu'une fois en changeant de signe.
Pour trouver la solution, on divise l'intervalle [a,b]
en deux avec son milieu
m=\frac{a+b}{2}
Si f(a)
et f(m)
sont de même signe, la solution cherchée se trouve dans [m,b]
, sinon
elle se trouve dans [a,m]
.
On itére alors la recherche dans le nouvel intervalle jusqu'à ce que sa longueur soit inférieur à une précision \epsilon
voulue.
- Écrire une fonction
function [x]=dichotomie(f,a,b,eps) // f <-> fonction // a,b <-> [a,b] intervalle de départ // eps <-> valeur pour le test d'arret // x <-> valeur approché de f(x)=0
- Tester avec
- la fonction de l'exercice précédent,
f(x)=x^2-2
sur l'intervalle[1,2]
. Comparer numériquement la solution approchée avec la solution exacte, en faisant varier\epsilon
.g(x)=cos(x)-x^2
sur l'intervalle[0,1]
- Modifier la fonction pour qu'elle renvoié le nombre d'itérations nécessaires. Tester avec
x-\sin x - \frac{1}{4} = 0, \;\;x\in[\frac{1}{4},\frac{5}{4}]
Aide Scilab function if while for
Méthode de la fausse position
Principe de la méthode
On prend les même hypothèses que pour la dichotomie. La méthode consiste alors à diminuer l'intervalle
de recherche en considérant le point c
intersection de la corde aux extrémités de l'intervalle avec
l'axe des abscisses.
- Calculer
c
en fonction def(a),f(b),a,b
- Écrire une fonction
--> function [x,n]=fausse_position(f,a,b,eps) // f <-> fonction // a,b <-> [a,b] intervalle de départ // eps <-> valeur pour le test d'arret // x <-> valeur approché de f(x)=0 // n <-> nombre d'itérations
- Tester avec
x-\sin x - \frac{1}{4} = 0, \;\;x\in[\frac{1}{4},\frac{5}{4}]