Introduction à la méthode d'itération de Newton
La méthode d'itération de Newton est principalement utilisée pour résoudre le problème de la racine réelle de l'équation non linéaire qui n'est pas facile à calculer, et la méthode d'itération de Newton est utilisée pour obtenir une solution approchée.
Présentation du principe
Pour les équations non linéaires un développement de Taylor est effectué autour de :
Prendre sa partie linéaire comme équation d'approximation pour les équations non linéaires = 0
Supposons , alors la solution est :
Développez ensuite la série de Taylor dans
le voisinage et prenez sa partie linéaire comme
l'équation approximative de = 0, si
, alors il y a :
De cette manière, la méthode de Newton peut être dérivée :
Exemples d'applications pratiques
Afin de mieux comprendre la méthode itérative de Newton, utilisez la solution de la racine de l'équation comme exemple
L'équation dérivée est :
Implémentation de code C++
#include<iostream>
#include<cmath>
using namespace std;
//实例:y=x^3+e^x
double x; //定义变量x
double X; //临时变量,记录第k次的x值,用于判断精度,第k次与第k+1次做差比较精度
double y(double x) //定义关于x的表达式
{
return -x*x*x + exp(x);
}
double dy(double x) //定义导数公式
{
return -3 * x*x + exp(x);
}
bool accuracy(double x0)
{
if (fabs(X - x0) > 1e-5) //定义精度10的负5次方
{
return 1;
}
else
return 0;
}
void ND(double x0) //牛顿迭代法
{
int n = 0; //记录迭代次数
do{
double _y = y(x0);
double _dy = dy(x0);
X = x0;
x0 = x0 - _y / _dy;
n++;
cout << "第" << n << "次迭代结果为:" ;
printf("%.5f\n", x0);
} while (accuracy(x0));
cout << "共迭代" << n << "次,最终近似解为:" ;
printf("%.5f\n", x0);
}
void main()
{
x = 4.5; //定义x0初始值
ND(x);
}
Par conséquent, on peut voir que la solution approximative de la fonction fonction est 4,53640
Optimisation complémentaire
Lors de la résolution réelle de racines réelles non linéaires, certaines équations peuvent être difficiles à obtenir des dérivées, de sorte que le quotient de différence peut être utilisé à la place des dérivées, et la formule est :
Le code C++ est :
#include<iostream>
#include<cmath>
using namespace std;
//实例:y=x^3+e^x
double x; //定义变量x
double X; //临时变量,记录第k次的x值,用于判断精度,第k次与第k+1次做差比较精度
double y(double x) //定义关于x的表达式
{
return -x*x*x + exp(x);
}
bool accuracy(double x0)
{
if (fabs(X - x0) > 1e-5) //定义精度10的负5次方
{
return 1;
}
else
return 0;
}
void ND_optimize(double x1,double x0) //牛顿迭代法差商改进
{
double _y1 = y(x0);
double _y2 = y(x1);
int n = 0; //记录迭代次数
do{
double _y1 = y(x0);
double _y2 = y(x1);
X = x0;
x0 = x0 - (_y1 / (_y1-_y2)) * (x0-x1);
n++;
cout << "第" << n << "次迭代结果为:";
printf("%.5f\n", x0);
} while (accuracy(x0));
cout << "共迭代" << n << "次,最终近似解为:";
printf("%.5f\n", x0);
}
void main()
{
double x1 = 4.5; //定义x1初始值
double x2 = 4; //定义x2初始值
ND_optimize(x1,x2);
}