zoukankan      html  css  js  c++  java
  • 2-1、非线性方程与牛顿迭代法

    内容来自王晓华老师

    这块内容有点硬核,先做了解,主要学习如何使用迭代解决问题的步骤

    在数值分析领域中,人们通常使用迭代法、逼近法和做图等方法来求解一些复杂问题的近似解,其中迭代法是一类利用递推公式或循环算法通过构造序列来求问题近似解的方法,把这种迭代求解数学问题的方法直接体现在算法中,就可以认为是设计领域中的迭代法。

    代数法求解低阶非线方程
    用代数方法求一元非线性方程的解的方法有很多,常用的方法有开平方法、配方法、因式分解法、公式法等,近似求解的方法有作图法以及各种迭代法
    代数法求解方程虽然准确性好、精度高,但是不利于编制计算机程序,所以在数值分析领域,常用各种迭代法求解一元非线性方程。常用的求解一元非线性方程的方法有二分逼近法和牛顿迭代法,

    二分逼近法

    牛顿迭代法
    牛顿迭代法又称为牛顿-拉弗森方法(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 次迭代,可见牛顿迭代法的收敛速度是超线性的。

    总结

    使用迭代法,需要首先确定问题是否存在迭代关系,如果存在迭代关系,就尝试确定迭代算法需要的三个关键要素

    它们分别是迭代变量、迭代递推关系公式和迭代终止条件。首先确定迭代变量,迭代变量是由迭代关系式确定的,一般情况下,迭代变量就是计算结果,接下来是确定迭代递推关系,最后是迭代退出条件

  • 相关阅读:
    导出大智慧L2要密码的公式
    SQL Server 索引结构及其使用
    职业式证券交易全貌向职业交易员进军者鉴[转]
    sqlite多字段拼接方法
    推荐两个UI、PSD文件搜索网站
    利用事件冒泡和阻止事件冒泡的例子
    js通过八个点 拖动改变div大小
    匿名函数运用js脚本一对圆括号
    js对象转换为json格式的jquery辅助类
    简单清晰的缓冲运动框架
  • 原文地址:https://www.cnblogs.com/orxx/p/10956851.html
Copyright © 2011-2022 走看看