牛顿迭代法主要用于求解对于不便于计算的非线性方程实根的问题,利用牛顿迭代法求出近似解。
原理介绍对于非线性方程在附近进行Tayor展开:
取其线性部分作为非线性方程 = 0的近似方程
设,则解为:
再把在附近展开Tayor级数,取其线性部分作为 = 0的近似方程,若,则有:
如此可以推导出Newton法:
实际应用举例
为了更好理解牛顿迭代法,利用求解方程根进行举例
求导方程为:
C++代码实现#include#include 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("%.5fn", x0); } while (accuracy(x0)); cout << "共迭代" << n << "次,最终近似解为:" ; printf("%.5fn", x0); } void main() { x = 4.5; //定义x0初始值 ND(x); }
故由此可知,函数 函数近似解为4.53640
补充优化在实际求解非线性放出实根时,部分方程可能会出现求导困难的情况,故可以利用差商代替求导,则公式为:
C++代码为:#include#include 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("%.5fn", x0); } while (accuracy(x0)); cout << "共迭代" << n << "次,最终近似解为:"; printf("%.5fn", x0); } void main() { double x1 = 4.5; //定义x1初始值 double x2 = 4; //定义x2初始值 ND_optimize(x1,x2); }



