内容来自王晓华老师
这块内容有点硬核,先做了解,主要学习如何使用迭代解决问题的步骤
在数值分析领域中,人们通常使用迭代法、逼近法和做图等方法来求解一些复杂问题的近似解,其中迭代法是一类利用递推公式或循环算法通过构造序列来求问题近似解的方法,把这种迭代求解数学问题的方法直接体现在算法中,就可以认为是设计领域中的迭代法。
代数法求解低阶非线方程
用代数方法求一元非线性方程的解的方法有很多,常用的方法有开平方法、配方法、因式分解法、公式法等,近似求解的方法有作图法以及各种迭代法
代数法求解方程虽然准确性好、精度高,但是不利于编制计算机程序,所以在数值分析领域,常用各种迭代法求解一元非线性方程。常用的求解一元非线性方程的方法有二分逼近法和牛顿迭代法,
二分逼近法
牛顿迭代法
牛顿迭代法又称为牛顿-拉弗森方法(Newton-Raphson Method),它是一种在实数域和复数域上近似求解方程的方法。既然是迭代法,那么牛顿迭代法的算法实现肯定适合用迭代法模式。
导函数的求解与近似公式
牛顿迭代法算法实现
根据牛顿迭代法的迭代关系公式,牛顿迭代法的迭代变量就是要求的结果 xx ,迭代的初始值可以选择一个比较接近近似解的值,对于单调区间来说,这个值可以是任意值,甚至可以是区间边界值,迭代递推关系就是上面数学原理部分给出的迭代公式,迭代终止条件就是找到一个精度符合要求的近似解。判断迭代变量是否就是符合精度的解的方法就是计算最近两个迭代的值,看其差值是否小于迭代精度差值的要求。根据迭代递推关系,用循环实现迭代递推最简单。设计算法时,为了防止因为迭代不收敛导致的死循环,一般还可以增加一个迭代退出条件,即设置一个迭代次数上限。
double NewtonRaphson(FunctionPtr f, double x0) { double x = INVALID_VALUE; int count = 0; do { double x1 = x0 - f(x0) / CalcDerivative(f, x0); //应用迭代递推关系 if (fabs(x1 - x0) < PRECISION) { x = x1; break; } x0 = x1; //更新迭代变量 count++; } while (count < MAX_RUN_LOOP); return x; }
参数 x0 是迭代初始值。选择与上面相同的例子函数,并将迭代初始值设置为区间最大值 8.0,使用牛顿迭代法也只需要 7 次迭代,就可以得到和二分逼近法精度一样的近似解。选择初始值 -8.0 从另一个方向计算,还可以得到另一个解 x= -2.040967365,计算这个解也只需要 6 次迭代,可见牛顿迭代法的收敛速度是超线性的。
总结
使用迭代法,需要首先确定问题是否存在迭代关系,如果存在迭代关系,就尝试确定迭代算法需要的三个关键要素
它们分别是迭代变量、迭代递推关系公式和迭代终止条件。首先确定迭代变量,迭代变量是由迭代关系式确定的,一般情况下,迭代变量就是计算结果,接下来是确定迭代递推关系,最后是迭代退出条件