newton_usw_Enonce
March 27, 2021
1 Un peu de Sympy
[1]: import sympy as s s.init_printing()
from sympy.abc import x,y,a,b,c
[2]: #une fonction symbolique f = s.Function('f') f(x)
[2]:
f(x)
[7]: # La fonction dérivée de f
f_=lambda x: s.Derivative(f(x),x) f_(x)
[7]:
d dxf(x)
[8]: # un symbole x_0 x0=s.symbols('x0') x0, f_(x0)
[8]: (
x0, d dx0
f(x0) )
[10]: #équation de la tangente en x_0 eq = s.Eq(y,f_(x0)*(x-x0)+f(x0)) eq
[10]:
y= (x−x0) d dx0
f(x0) +f(x0)
[11]: #pour trouver l'intersection avec l'axe des abscisses, résoudre : eq.subs({y:0})
[11]:
0 = (x−x0) d
dx0f(x0) +f(x0)
[15]: # abscisse de l'intersection avec Ox sol=s.solve(eq.subs({y:0}),x,dict=True) sol
[15]:
[{
x:x0− f(x0)
d dx0f(x0)
}]
[17]: sol[0][x]
[17]:
x0− f(x0)
d dx0f(x0)
2 Newton
Implanter la méthode de Newton du cours def newton(f,f_,x0,epsilon):
"""
f : fonction dérivable f_ : dérivée de f
x0 : abscisse de départ
epsilon : précision 'horizontale'
"""
[32]: x=s.symbols('x',real=True) sol=s.solve(x**3-2*x+1) sol
[32]:
[
1, −1 2+
√5 2 , −
√5 2 − 1
2 ]
[34]: [e.evalf() for e in sol]
[34]:
[1.0, 0.618033988749895, −1.61803398874989]
[30]: newton(lambda x:x**3-2*x+1,lambda x:3*x**2-2,-1.5,10**(-3)) [30]:
−1.618034007303786
3 Résolution de systèmes d’équations non linéaires
On considère un système non linéaire de deux équations à deux inconnues comme : {2x2+y2 = 4
x+y = 1
Ce système correspond à l'équation : F(X) = (0) où X = (x
y )
, F(x) =
(f1(X) f2(X) )
, f1(X) = 2x2+y2−4;f2(X) =x+y−1
On commence par calculer la matrice Jacobienne de la fonction différentiable F:
F′(X) =
∂f1
∂x(X) ∂f1
∂ y(X)
∂f2
∂x(X) ∂f2
∂y(X)
=
(4x 2y
1 1
)
Obervons que, sauf cas 4x= 2y, cette matrice est inversible.
Ensuite, on choisit X0 pas trop éloigné d'une véritable solution, et on applique la méthode de newton en résolvant :
Xk+1=Xk−(F′(Xk))−1F(Xk)
Le critère d'arrêt sera ∥Xk+1−Xk∥ ≤ε
Plutôt que d'inverser la matrice, on résoud F′(Xk)(Xk+1 − Xk) = −F(Xk) dont l'inconnue est le vecteur ∆k=Xk+1−Xk. Ceci s'obtient par pivot de Gauss.
Donc à chaque tour de boucle : 1. On résoud le système par Gauss pour trouver ∆k 2. On pose Xk+1=Xk+ ∆k 3. le critère d'arrêt est ∥∆k∥ ≤ε
3.1 Deux fonctions auxiliaires
Ecrire les fonctions def resoudre(A,B):
def norm(X):
qui retournent respectivement le vecteur colonne solution d'un système linéaire 2×2 et la norme d'un vecteur.
Les matrices sont implantées par des tableaux numpy 2×2, et les vecteurs colonnes par de simples tableaux d'une dimension.
3.2 Newton et Jacobienne
Ecrire la fonction :
def newtonb(f,f_,x0,epsilon):
"""
f : fonction différentiable de R^n dans R^n f_ : jacobiennne de f
x0 : point de départ dans R^n
epsilon : précision voulue entre deux itérés consécutifs
"""
[124]: newtonb(F,F_,X_0,0.01)
[124]: matrix([[ 1.38742624], [-0.38742624]])
4 Méthode de la fausse position
Voir Wikipedia pour plus d'informations.
Comme la méthode de dichotomie, la méthode de la fausse position commence par deux points a0 et b0 tels que f(a0) et f(b0) soient de signes opposés, ce qui implique d'après le théorème des valeurs intermédiaires que la fonction continue f possède au moins un zéro dans l'intervalle [a1, b1]. La méthode consiste à
produire une suite décroissante d'intervalles [ak, bk] qui contiennent tous un zéro de f.
On calcule l'abscisse ck de l'intersection de la corde joignant les points
Ak = (ak, f(ak)) à Bk = (bk, f(bk)). Cette abscisse est appelée zéro de la sécante.
Si f(ak) et f(ck) sont de même signe, alors on pose ak+1 = ck et bk+1 = bk, sinon on pose ak+1 = ak et bk+1 = ck. Ce procédé est répété jusqu'à ce que le zéro soit suffisamment approché, c'est-à-dire que l'écart entre ck+1 et ck soit inférieur à un écart ε acceptable.
La seule différence entre la méthode de la fausse position et la méthode de dichotomie est l'utilisation dans cette dernière la relation ck= (ak+bk)/2.
def rFalsi(f,a,b,p):
"""une seule extrêmité change à chaque étape on suppose f(a)*f(b)<0 comme dans dichotomie
"""
5 Méthode de la sécante
On part de deux abscisses quelconques (pas trop éloignées d'un zéro) et on calcule à chaque étape k, le zéro ck de la sécante (la corde) qui joint les
points Ak = (ak, f(ak)) à Bk = (bk, f(bk)). Comme dans la méthode de Newton, ak+1 vaut bk et bk+1 vaut ck.
On s'arrête dès que la différence entre deux abscisses consécutives est assez petite.
C'est cette méthode qui est utilisée lors de l'appel de la fonction
scipy.optimize.newton, si on n'indique pas la dérivée de la fonction dans les paramètres d'appels.
Ecrire la fonction
def secante(f, a, b, epsilon):
""" les deux extrémités de la corde sont mobiles comme dans newton
"""
pass