La méthode itérative de Newton et son application pratique (avec du code C++)

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  f(x):x_{0}

f(x) = f({x_0}) + (x - {x_0}){f^{(1)}}({x_0}) + {(x - {x_0})^2}\frac{​{ ​{f^{(2)}}({x_0})}}{​{2 !}} + ....

Prendre sa partie linéaire comme f(x)équation d'approximation pour les équations non linéaires = 0 

f(x) = f({x_0}) + (x - {x_0}){f^{(1)}}({x_0})

Supposons {f^{(1)}}({x_0}) \ne 0, alors la solution est :

{x_1} = {x_0} - \frac{​{f({x_0})}}{​{​{f^{(1)}}({x_0})}}

Développez ensuite la série de Taylor f(x)dans x_{1}le voisinage et prenez sa partie linéaire comme f(x) l'équation approximative de = 0, si {f^{(1)}}({x_1}) \ne 0, alors il y a :

{x_2} = {x_1} - \frac{​{f({x_1})}}{​{​{f^{(1)}}({x_1})}}

De cette manière, la méthode de Newton peut être dérivée :

 {x_{n + 1}} = {x_n} - \frac{​{f({x_n})}}{​{​{f^{(1)}}({x_n})}}

Exemples d'applications pratiques

Afin de mieux comprendre la méthode itérative de Newton, utilisez la solution y = {x^3} + {e^x}de la racine de l'équation comme exemple

L'équation dérivée est :y = 3{x^2} + {e^x}

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  y = {x^3} + {e^x}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 :

{x_{n + 1}} = {x_n} - \frac{​{f({x_n})}}{​{f({x_n}) - f({x_{n - 1}})}}( {x_n} - {x_{n - 1}})

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);
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_60811855/article/details/125895836
conseillé
Classement