72
2 Equations non linéaires
a =[1 -7 15 -13 4]; format long ;
[x , niter ]= n e w t onh orne r(a ,0 ,1.e -15 ,100)
x =
1.000006935337374
0.999972452635761
1.000020612232168
3.999999999794697
niter =
61
100
6
2
La perte de précision apparaît clairement pour la racine multiple, et s’aggrave encore quand la multiplicité augmente. Plus généralement, on peut montrer (voir [QSS07]) que la détermination des racines d’une fonction f devient
mal conditionnée (c’est-à-dire très sensible aux perturbations des données)
quand la dérivée f
est “petite” au voisinage des racines. Voir l’Exercice 2.6
pour un exemple.
2.7 Ce qu’on ne vous a pas dit
Les méthodes les plus sophistiquées pour le calcul des zéros d’une fonction combinent différents algorithmes. Par exemple, la fonction fzero
de MATLAB (voir Section 1.5.1) adopte la méthode de Dekker-Brent
(voir [QSS07], Section 6.2.3). Dans sa version de base, l’instruction
fzero(fun,x0) calcule le zéro de la fonction fun en partant de x0, où
fun peut être une chaîne de caractères qui définit une fonction de x, ou
bien une fonction inline, une fonction anonyme, ou bien encore le nom
d’un M-fichier.
On peut résoudre le problème de l’Exemple 2.1 à l’aide de fzero, en
utilisant la donnée initiale x0=0.3 (comme pour la méthode de Newton)
en entrant les instructions :
Rfunc = inline ( ’ 6000 -1000*(1+ T )/T *((1+ T )^5 -1)’);
x0 =0.3;
[ alpha , res , flag , info ]= fzero ( Rfunc , x0 );
on obtient alpha=0.06140241153653 avec un résidu res=-1.8190e-12
en 7 itérations et 29 évaluations de la fonction Rfunc. Un flag négatif signifie que fzero ne parvient pas à trouver un zéro. La variable info est une structure comportant 5 champs. En particulier, les
champs info.iterations et info.funcCount contiennent respectivement le nombre d’itérations et le nombre d’appels à la fonction. A titre
de comparaison, la méthode de Newton converge en 6 itérations vers la
2 Equations non linéaires
a =[1 -7 15 -13 4]; format long ;
[x , niter ]= n e w t onh orne r(a ,0 ,1.e -15 ,100)
x =
1.000006935337374
0.999972452635761
1.000020612232168
3.999999999794697
niter =
61
100
6
2
La perte de précision apparaît clairement pour la racine multiple, et s’aggrave encore quand la multiplicité augmente. Plus généralement, on peut montrer (voir [QSS07]) que la détermination des racines d’une fonction f devient
mal conditionnée (c’est-à-dire très sensible aux perturbations des données)
quand la dérivée f
est “petite” au voisinage des racines. Voir l’Exercice 2.6
pour un exemple.
2.7 Ce qu’on ne vous a pas dit
Les méthodes les plus sophistiquées pour le calcul des zéros d’une fonction combinent différents algorithmes. Par exemple, la fonction fzero
de MATLAB (voir Section 1.5.1) adopte la méthode de Dekker-Brent
(voir [QSS07], Section 6.2.3). Dans sa version de base, l’instruction
fzero(fun,x0) calcule le zéro de la fonction fun en partant de x0, où
fun peut être une chaîne de caractères qui définit une fonction de x, ou
bien une fonction inline, une fonction anonyme, ou bien encore le nom
d’un M-fichier.
On peut résoudre le problème de l’Exemple 2.1 à l’aide de fzero, en
utilisant la donnée initiale x0=0.3 (comme pour la méthode de Newton)
en entrant les instructions :
Rfunc = inline ( ’ 6000 -1000*(1+ T )/T *((1+ T )^5 -1)’);
x0 =0.3;
[ alpha , res , flag , info ]= fzero ( Rfunc , x0 );
on obtient alpha=0.06140241153653 avec un résidu res=-1.8190e-12
en 7 itérations et 29 évaluations de la fonction Rfunc. Un flag négatif signifie que fzero ne parvient pas à trouver un zéro. La variable info est une structure comportant 5 champs. En particulier, les
champs info.iterations et info.funcCount contiennent respectivement le nombre d’itérations et le nombre d’appels à la fonction. A titre
de comparaison, la méthode de Newton converge en 6 itérations vers la
