zoukankan      html  css  js  c++  java
  • 牛顿迭代法与一道经典编程问题


           牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method)。它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。





           既然牛顿迭代法能够用来求解方程的根,那么最好还是以方程 x2=n 为例,来试着求解它的根。

    为此。

    f(x)=x2n, 也就是相当于求解 f(x)=0 的解。如上图所看到的。


           首先随便找一个初始值 x0,假设 x0不是解,做一个经过 (x0,f(x0)) 这个点的切线,与x轴的交点为x1。相同的道理。假设 x1不是解,做一个经过(x1,f(x1))这个点的切线,与x轴的交点为x2

    以此类推。以这种方式得到的xi会无限趋近于 f(x)=0 的解。


    推断xi是否是f(x)=0的解有两种方法: 一是直接计算f(xi)的值推断是否为0,二是推断前后两个解xixi1是否无限接近。


    经过(xi,f(xi))这个点的切线方程为

    f(x)=f(xi)+f(xi)(xxi)
    当中。f(x)f(x)的导数,本题中为2x

    令切线方程等于 0。就可以求出

    xi+1=xif(xi)f(xi)



    继续化简


    xi+1=xix2in2xi=xixi2+n2xi=xi2+n2xi


    基于上述迭代公式,我们其实给出了一个求平方根的算法。其实,这也的确是非常多语言中内置的开平方函数的实现方法。




    Leetcode上也有一道经典面试题目涉及到开平方函数的实现。例如以下

    这里写图片描写叙述


    基于我们已经给出的牛顿迭代法,以下就可来编程解决该问题了。演示样例代码例如以下

    class Solution {
    public:
        int mySqrt(int x) {
            if (x ==0)  
            return 0;  
            double pre;  
            double cur = 1;  
            do  
            {  
            pre = cur;  
            cur = x / (2 * pre) + pre / 2.0;  
            } while (abs(cur - pre) > 0.00001);  
            return int(cur);  
        }
    };
  • 相关阅读:
    在 MAC 下配置 Nginx
    Color Schema 配色随笔
    .Net与 WebAssembly 随笔
    关于Xamarin、Qml、数据绑定、MVC、MVVM 相关的散讲
    用Nuget部署程序包
    Qt3D
    Qt3D Shader
    Qt QML 2D shader
    LearnOpenGL
    Qt3D 5.9 and future
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7082129.html
Copyright © 2011-2022 走看看