Livre_silo 30 août 2013 16:32 Page 209
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
209
8 – Résolution numérique d’équations sur les réels
8.2.4 Mise en œuvre
Pour la version réalisée ici, on ne fait aucune vérification d’hypothèse de convergence, qu’on
laisse à l’utilisateur. La terminaison et la correction ne sont donc pas assurées.
PROGRAMME 6 Méthode de Newton
def newton(f, fp, x0, epsilon):
u = x0
v = u - f(u)/fp(u)
while abs(v-u) > epsilon:
u, v = v, v - f(v)/fp(v)
return v
Dans des conditions réelles, à défaut de pouvoir s’assurer de la convergence, on vérifierait
à la volée que les valeurs prises par u et v ne sont pas trop grandes (ce qui signifierait qu’on
quitte le domaine dans lequel l’action est censée se passer) et/ou que celles prises par f
′ (v)
ne sont pas trop petites.
In [3]: newton(math.sin, math.cos, 3, 10**(-3))
Out[3]: 3.141592653589793
In [4]: newton(lambda x : x**2-2, lambda x : 2*x, 2., 10**(-2))
Out[4]: 1.4142156862745099
Exercice 8.6 Que se passe-t-il si dans le dernier appel on remplace 2. par 2 ? Attention, la réponse dépend
de la version de Python !
En modifiant un peu le programme précédent, on peut imposer le nombre d’itérations au
lieu de faire une boucle while :
In [5]: [newton_n_iterations(math.sin, math.cos, 3, k) for k in range(4)]
Out[5]: [3.0, 3.142546543074278, 3.141592653300477, 3.141592653589793]
In [6]: [newton_n_iterations(lambda x : x**2-2, lambda x : 2*x, 2., k) for k in range(5)]
Out[6]: [2.0, 1.5, 1.4166666666666667, 1.4142156862745099, 1.4142135623746899]
Enfin, on va visualiser l’évolution de l’erreur |x n − l| en fonction de n, le nombre d’itérations. On représente figure 8.6 cette erreur sur les deux exemples précédents (pour approcher
√
2 et π).
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
209
8 – Résolution numérique d’équations sur les réels
8.2.4 Mise en œuvre
Pour la version réalisée ici, on ne fait aucune vérification d’hypothèse de convergence, qu’on
laisse à l’utilisateur. La terminaison et la correction ne sont donc pas assurées.
PROGRAMME 6 Méthode de Newton
def newton(f, fp, x0, epsilon):
u = x0
v = u - f(u)/fp(u)
while abs(v-u) > epsilon:
u, v = v, v - f(v)/fp(v)
return v
Dans des conditions réelles, à défaut de pouvoir s’assurer de la convergence, on vérifierait
à la volée que les valeurs prises par u et v ne sont pas trop grandes (ce qui signifierait qu’on
quitte le domaine dans lequel l’action est censée se passer) et/ou que celles prises par f
′ (v)
ne sont pas trop petites.
In [3]: newton(math.sin, math.cos, 3, 10**(-3))
Out[3]: 3.141592653589793
In [4]: newton(lambda x : x**2-2, lambda x : 2*x, 2., 10**(-2))
Out[4]: 1.4142156862745099
Exercice 8.6 Que se passe-t-il si dans le dernier appel on remplace 2. par 2 ? Attention, la réponse dépend
de la version de Python !
En modifiant un peu le programme précédent, on peut imposer le nombre d’itérations au
lieu de faire une boucle while :
In [5]: [newton_n_iterations(math.sin, math.cos, 3, k) for k in range(4)]
Out[5]: [3.0, 3.142546543074278, 3.141592653300477, 3.141592653589793]
In [6]: [newton_n_iterations(lambda x : x**2-2, lambda x : 2*x, 2., k) for k in range(5)]
Out[6]: [2.0, 1.5, 1.4166666666666667, 1.4142156862745099, 1.4142135623746899]
Enfin, on va visualiser l’évolution de l’erreur |x n − l| en fonction de n, le nombre d’itérations. On représente figure 8.6 cette erreur sur les deux exemples précédents (pour approcher
√
2 et π).
