2016-12-23 1 views
0

Je voulais implémenter la méthode newton. Mon code est pour le moment:Implémentation de la méthode Newton dans matlab

f est une fonction-handle, df la différentiation f (également une poignée de fonction) et x est la valeur de départ.

Il fonctionne pour certaines fonctions, mais par exemple quand je demande

newton(@(x) x^2,@(x) 2*x,1) 

il vient dans une boucle infinie. Comment régler ceci?

Répondre

1

Le contrôle habituel de terminaison pour la méthode de Newton est de voir si le résultat d'une autre itération est « très proche » à la réponse précédente, mais vous utilisez le chèque:

if abs(xn) == abs(x) 

qui exige essentiellement la deux valeurs identiques (sauf que vous avez utilisé abs, ce qui est un bogue car il accepte une réponse qui est si fausse qu'une itération inverse le signe). Pour certains problèmes, cela peut fonctionner, mais il est très probable que cela conduise à une boucle infinie avec les itérations parcourant un ensemble de valeurs très proches.

Changer votre test de terminaison à:

if abs(xn-x) < 0.0000001 (or something else very small) 

qui teste pour voir si xn et x ne diffèrent pas plus que la très faible valeur donnée, et cela devrait fonctionner.

+1

Étant donné que la racine de x^2 = 0 est 0, * racine * est à 0,0000001 près. –

+0

D'accord, merci! Est-il possible de faire en sorte que MATLAB rende 0 lorsque le nombre est très petit? – zer0kai

+0

Existe-t-il un moyen de calculer les racines exactes (pour calculer les divisions)? – zer0kai