Methode itérative de Newton.

cs_Maritime Messages postés 69 Date d'inscription dimanche 16 mars 2003 Statut Membre Dernière intervention 14 mars 2015 - 27 févr. 2008 à 10:16
marinmarais Messages postés 104 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 16 juillet 2010 - 28 févr. 2008 à 11:28
Bonjour,
Je dois resoudre une equation du 6eme degré f (µ)=0,
ça consiste a rechercher la plus petite racine µ qui est en fait un multiplicateur de Lagrange.
avec la fonction f (µ), et sa dérivée f '(µ).
on pose  µk+1= µk - f (µk) / f '(µk)
On peut choisir comme valeur initiale µ0=0.
J'ai besoin d'un coup de main "Code" pour résoudre cette equation par la methode itérative de Newton.

  Merci.

3 réponses

marinmarais Messages postés 104 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 16 juillet 2010 1
27 févr. 2008 à 15:18
Bonjour Maritime,

Fait ca avec une boucle WHILE.
Tu definis la precision de la determination de µ dont tu as besoin.
En gros, ca ressemblerait a ca :

>   '   Definition du seuil
>   epsilon=0.000001
>
>   '   Valeur initiale
>   mo=0
>
>   '   Premiere Valeur
>   m1=mo-f(mo)/f'(mo)
>   '   NB :    ce que j'ai note f(mo) correspond bien evidemment a :   a0+a1*mo+...+a6*mo^6 _
>   '               De meme, f'(mo) correspond  a :   a1+2*a2*mo+...+6*a6*mo^5
>
>   '   On lance la boucle - Tant que |mi+1-mi| > 1x10^-6, on continue l'operation
>   while abs(m1-mo)>epsilon
>         m=m1-f(m1)/f'(m1)
>         '   Meme remarque pour f et f' dans la notation
>
>         mo=m1
>         m1=m
>   loop
>   '   Hum, je ne garantis pas l'exactitude de la syntaxe... Ca fait longtemps que j'ai pas fait de boucle While... _
>       Je te laisse rechercher sur ce forum ;o)
>
>   '   Resultat final
>   mu=m1

Voili voilou...

Marin Marais
cs_Maritime Messages postés 69 Date d'inscription dimanche 16 mars 2003 Statut Membre Dernière intervention 14 mars 2015 2
28 févr. 2008 à 10:04
Bonjour,

J'ai essayé avec cette boucle, et ça a l'air de fonctionner.


  eps=0.0000001
  maxIter=30
  µ=0

Do
   
     diff = F(µ)/ F'(µ)
     Rac = Rac - diff
     iter = iter + 1
 
Loop While (iter <= maxIter) And (Abs(diff) > eps)

Merci marinmarais.
marinmarais Messages postés 104 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 16 juillet 2010 1
28 févr. 2008 à 11:28
De rien...

Ca rend bien service ce genre de petits algorithmes...
Si ca t'interesse, tu peux faire - a peu pres - la meme demarche pour des systemes a plusieurs dimensions. On joue entre la fonction et sa matrice jacobienne.

Allez, je me motive et je poste l'algo (ca tombe bien, j'etais justement en train de regarder mes cours de maths de l'inge ;o) ) :

L'exemple est dans IR^2 mais ca marche egalement dans IR^n.

On a 1 fct F de IR^2 dans IR^2
Je note en gras les vecteurs.
Les matrices sont notees en gras souligne.X(x1,x2) et Y (y1,y2)= F( X )
Soient les deux fonctions f1 et f2 definies comme suit :
f1(x1,x2) =y1
f2(x1,x2)= y2
On cherche a determiner la valeur de  X telle que F(X) =0
On va construire une suite Xn qui converge vers le vecteur X qui annule la fonction F.
Je vous epargne la theorie, mais on joue avec les variations de la fonction F, autrement dit les derivees partielles de F (d'ou l'introduction de la matrice jacobienne).
Soit Ji la jacobienne de F en Xi

On definit la valeur initiale X0
Delta= (- J0 ^(-1)) x F(X0)
X1 =X0+Delta
On definit le critere de convergence epsilon
Tant que ||X1-X0||<epsilon
      Delta= (- J1 ^(-1)) x F(X1)
      X0 =X1
      X1=X0+Delta
Fin Tant que

Voili voilou. C'est facile a programmer et redoutablement efficace.
Bon, faut en avoir l'usage ;o)
Mais ca sert de temps en temps...

Marin Marais
Rejoignez-nous