BCPST2
9 5
0 2 Méthode de Newton
Le but de la méthode de newton est de déterminer de manière approchée les solutions d'une équation
f(x) = 0
On considère dans la suite une fonction dérivable dénie sur un intervalleIdansR.
x0 x3 x2 x1
On part d'un point de l'intervalle, si possible pas trop éloigné de la position de la solution re- cherchée, que l'on notera dans la suitexs. L'idée est d'approcher localement la fonction par une tangente et de considérer que l'intersection de la tangente avec l'axe des abscisses comme une bonne approximation dexs. On peut ensuite réitérer le procédé an d'obtenir une approximation plus ne.
1 re Partie : Mise en oeuvre de la méthode de Newton
1◦) Ecrire l'équation de la tangente au graphe defenx0et déterminer son intersection avec l'axe des abscisses, que l'on notex1. Quelle hypothèse faut-il faire pour qu'il y ait une solution au problème ?
Solution: L'équation de la tangente est : y = f
0(x
0)(x − x
0) + f (x
0) ainsi x
1= x
0− f (x
0) f
0(x
0) On suppose donc f
0(x
0) 6= 0 .
2◦) Ecrire une fonction mynewton(f, df, x0, n) qui prend en argument la fonctionf, sa dérivéedf, le point de départx0et le nombre d'itérations et qui renvoie le résultat obtenu aprèsnitérations de la méthode de newton.
Solution:
def mynewton ( f , df , x0 , n ) :
""" E f f e c t u e l a mé thode de Newton à p a r t i r de x_0 avec n i t é r a t i o n s """
x = float ( x0 ) #Ceci pour f o r c e r l e passage en f l o a t , i n u t i l e avec python3
f o r i in range ( N ) : x = x − f ( x ) /df ( x ) return x
3◦) Modier la fonction précédente pour que les calculs s'arrêtent si à un momentf0(xk)est trop proche de 0(on s'arrêtera par exemple si
|f0(xk)|<10−10et renvoie dans ce casxk.
Solution:
def mynewton ( f , df , x0 , n ) :
""" E f f e c t u e l a mé thode de Newton à p a r t i r de x_0 avec n i t é r a t i o n s """
x = float ( x0 ) #Ceci pour f o r c e r l e passage en f l o a t , i n u t i l e avec python3
f o r i in range ( N ) :
i f abs ( df ( x ) ) < 10∗∗( −10) : return x
x = x − f ( x ) /df ( x ) return x
2014-2015 page 1 sur 4 TSVP
BCPST 951/952/953 Lycée du Parc TD 2
4◦) Appliquer la fonction mynewton à la fonctionx7→x2−2pourn∈J1,5J, ainsi qu'à la fonctionx7→ln(x)−1Que pensez vous de la vitesse de cette méthode ?
Solution:
Pour la fonction x 7→ x
2− 2 Pour la fonction x 7→ ln(x) − 1
n=0 1.0 3.0
n=1 1.5 2.704163134
n=2 1.41666666667 2.71824509872
n=3 141421568627 2.71828182821
n=4 1.41421356237 2.71828182846 C'est très rapide !
5◦) Lorsque l'équationf(x) = 0admet plusieurs solutions, la solution donnée par la méthode de Newton va dépendre du point de départ.
Eectuer :
mynewton ( lambda x : x ∗∗ 2 − 2, lambda x : 2 ∗ x , 1 ,5 ) mynewton ( lambda x : x∗∗2 −2, lambda x : 2∗ x , −1 ,5 )
Remarque:
lambda permet de déclarer une fonctionfen donnant son expressionf(x), c'est l'équivalent en mathématiques de x7→f(x)
6◦) La méthode aboutit-elle toujours à un résultat ? Eectuer :
mynewton ( lambda x : x ∗∗ 2+1 , lambda x : 2 ∗ x , 1 , 5)
2 e Partie : La méthode de Newton dans python
La méthode de newton est en faite déjà présente dans le module scipy.
Remarque:
S'il est important de comprendre comment fonctionne l'algorithme, il est également utile de savoir utiliser les méthodes déjà programmées, testées et optimisées.
1◦) Rechercher dans la documentation ou sur internet la fonction de scipy qui eectue la méthode de Newton.
2◦) Vous l'avez trouvée ? Vous pouvez faire la suite...
Pour importer la fonction, plusieurs méthodes :
import scipy . optimize # e f f e c t u e l e l i e n avec s c i p y . optimize
#pour l ' u t i l i s e r e n s u i t e : scipy . optimize . newton ( . . . . )
ou bien
from scipy . optimize import newton # importe l a f o n c t i o n
#pour l ' u t i l i s e r e n s u i t e : newton ( . . . . )
Dans la suite, on choisit cette dernière méthode.
3◦) Eectuer maintenant :
help ( newton )
Lire rapidement cette aide et répondre aux questions suivantes :
3.a Quels sont les arguments obligatoires de cette fonction ? La donnée de la dérivée est-elle obligatoire ?
Solution: Les arguments obligatoires : la fonction et le point de départ.
La donnée de la dérivée n'est pas obligatoire, dans ce cas, la méthode est remplacée par la méthode des sécantes.
3.b Que se passe-t-il quand la dérivée n'est pas donnée ? Remarque:
La méthode des sécantes consiste à remplacerf0(xn)par f(xn)−f(xn−xn−1xn−1) dans la formule.
La convergence est un peu moins rapide 3.c Que se passe-t-il lorsque la méthode ne converge pas ?
Eectuer :
newton ( lambda x : x∗∗2+1 , 2 , lambda x : 2∗ x )
2014-2015 page 2 sur 4 TSVP
BCPST 951/952/953 Lycée du Parc TD 2
Solution:
Traceback ( most recent call last ) :
File "<p y s h e l l#13>" , line 1 , in <module>
scipy . optimize . newton ( lambda x : x∗∗2+1 , 2 , lambda x : 2∗ x )
File "/ usr / l i b /python2 . 7 / d i s t − packages / s c i p y / optimize / z e r o s . py" , line 137 , in newton
r a i s e RuntimeError ( msg )
RuntimeError : Failed to converge after 50 iterations , value i s 0.870752774435
Python prévient qu'il y a un problème !
3 e Partie : Une jolie application
On utilisera dans la suite la fonction newton de scipy.optimize.
La méthode peut également s'appliquer à des fonctions d'une variable complexe et à valeurs complexes dérivables au sens complexe. C'est le cas des fonctions polynômes.
On considère pour la suitef(z) =z3−1.
1◦) Quelles sont les solutions def(z) = 0? Pour les obtenir dans python, on pourra faire :
import numpy
L = numpy . roots ( [ 1 , 0 , 0 , 1 ] ) #On é c r i t l e s c o e f f i c i e n t s du polyn ôme
#en commenç ant par l e plus grand .
2◦) Ecrire une fonction racine(z) qui eectue la méthode de newton sur la fonctionfà partir dezet qui renvoie : â i si on est proche de la racine L[i] pouri∈J0,2K.
On travaillera avec une précision10−10. â 3 sinon
Faire quelques tests.
Solution:
eps = 10∗∗( −10)
L = numpy . roots ( [ 1 , 0 , 0 , 1 ] ) def g ( z ) :
return ( z∗∗3+1) def dg ( z ) :
return (3∗ z ∗ ∗ 2) def racine ( z , L , g , dg ) :
""" r e n v o i e l e numé ro de l a r a c i n e dont se rapproche l a mé thode de newton et 3 en cas de non − convergence """
lz = newton ( g , z , dg ) code = len ( L )
f o r i in range ( len ( L ) ) : i f abs ( lz−L [ i ] ) < eps :
code = i return ( code )
Pour écrire un complexe
#Pour é c r i r e l e complxe 2+ i : 2+1j
#ou complex ( 2 , 1 )
3◦) On va travailler sur la fenêtre[−a, a]2que l'on va discrétiser :
On prendN points sur l'intervalle[−a, a]. On pose ainsih=2aN et on considère les points : zk,l= (−a+kh) + (−a+lh)pourk, l∈J0, NK Ecrire une fonction ClassPoints(a, N) qui renvoie une liste ListPoints constituée de4listes : la liste ListPoints[i] contient les points z dont le résultat par racine(z) est i.
Solution:
2014-2015 page 3 sur 4 TSVP
BCPST 951/952/953 Lycée du Parc TD 2
def ClassPoint ( a , N , L , g , dg ) :
""" Classe l e s d i f f e r e n t s p o i n t s en 4 l i s t e s suivant l a r a c i n e dont se rapproche l a mé thode de Newton"""
h = float ( 2 . ∗ a/N )
ListPoints = [ [ ] f o r i in range ( len ( L ) +1) ] f o r p in range ( N+1) :
f o r k in range ( N+1) :
z = complex( − a+p ∗ h ,( − a+k ∗ h ) ) code = racine ( z , L , g , dg ) ListPoints [ code ] . append ( z ) return ( ListPoints )
4◦) Acher les points en prenant une couleur diérente pour chacune des listes précédentes.