欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

牛顿迭代法求平方根

程序员文章站 2024-02-27 18:03:45
...

问题

算法一书中,提到求平方根的方法sqrt用到了牛顿迭代法

牛顿迭代法

很多方程在求解根时比较困难(或者说求解精确根比较款那),并且我们经常会遇到求平方根无法直接得出结果的时候,牛顿迭代法就发挥了作用,牛顿迭代法的思想主要是利用切线方程无限逼近的特点求得结果,用于获取近似根。假设有f(x)=(x-2)^2,用牛顿迭代法求根((x-2)^2=0)过程如下:
牛顿迭代法求平方根
牛顿迭代法求平方根
选取一点做切线,然后作垂线交曲线于另一点,继续以另一点作为切点做切线,这样无限逼近即可求得函数的根。

用牛顿迭代法求平方根

可以利用牛顿迭代法求得数的开方,假设有数c,需要求得根号c。假设结果为result,则有
result^2 = c,即求函数f(x) = result^2-c的根

代码实现牛顿迭代法

    public static double sqrt(double c){
        if(c<0) return  Double.NaN;
        // 从该值开始迭代
        double result = c;
        // 定义一个极小值误差,当结果小于该误差时可以返回结果
        double err = 1e-15;
        // 函数为fx = x^2 - c 当小于一个极小值时可以认为是近似根,否则继续做切线
        while (Math.abs(Math.pow(result,2)-c)>err){
            result = (c/result+result)/2.0;
        }
        return  result;
    }

分析

函数为fx = x^2 - c,导数方程为f = 2xn,则过点(xn,xn^2-c)的切线方程为:y=2xn(x-xn)+xn^2-c,固切线与x轴交点为(xn+c/xn)/2,即对应代码中的result = (c/result+result)/2.0;