Introdução ao método de iteração de Newton
O método de iteração de Newton é usado principalmente para resolver o problema da raiz real da equação não linear que não é fácil de calcular, e o método de iteração de Newton é usado para obter uma solução aproximada.
Introdução do princípio
Para equações não lineares, uma expansão de Taylor é realizada em torno de :
Tome sua parte linear como uma equação de aproximação para equações não lineares = 0
Suponha que , então a solução é:
Em seguida, expanda a série de Taylor na vizinhança e tome sua parte linear como a equação aproximada de = 0, se , então existem:
Desta forma, o método de Newton pode ser derivado:
Exemplos práticos de aplicação
Para entender melhor o método iterativo de Newton, use a solução da raiz da equação como exemplo
A equação derivada é:
Implementação de código 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);
}
Portanto, pode-se ver que a solução aproximada da função função é 4,53640
Otimização complementar
Ao resolver raízes reais não lineares, algumas equações podem ser difíceis de obter derivadas, então o quociente de diferença pode ser usado em vez de derivadas, e a fórmula é:
O código 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);
}
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);
}