zoukankan      html  css  js  c++  java
  • 牛顿迭代法求n方根

    一、简单推导

    二、使用

    借助上述公式,理论上可以求任意次方根,假设要求a(假设非负)的n次方根,则有xn=a,令f(x)=xn-a,则只需求f(x)=0时x的值即可。由上述简单推导知,当f(x)=0时,xn+1=xn,因此把f(x)=xn-a 代入上述迭代式进行迭代直至xn+1=xn即可。

    实际中xn+1=xn可能永远达不到,可以根据给定精度△,当|xn+1-xn|<△成立时即可停止迭代,此时的xn+1即为所求。

    下面以算术平方根和立方根举例。

    (一)算术平方根

    设待求算术平方根的数为a,其算术平方根为x,则x2=a,令f(x)=x2-a,代入上面的递推式有xn+1=xn-(xn2-a)/(2xn),整理得xn+1=(1/2)(xn+a/xn)

    代码如下:

    double sqrt(double a)
    {
        double x1=a;
        double x2=a/2;
        while(fabs(x1-x2)>0.0000001)
        {
            //printf("%f
    ",x2);
            x1=x2;
            x2=0.5*(x1+a/x1);
        }
        return x2;
    }

    (二)立方根

    同理,令f(x)=x3-a,代入递推式有xn+1=xn-(xn3-a)/(3xn2),整理得xn+1=(1/3)(2xn+a/xn2)

    代码如下:

    double cubrt(double a)
    {
        double x1=a;
        double x2=a/2;
        while(fabs(x1-x2)>0.0000001)
        {
            //printf("%f
    ",x2);
            x1=x2;
            x2=(2*x1+a/(x1*x1))/3.0;
        }
        return x2;
    }

    三、(题外话)手算算式平方根

    顺便提下,在网上看到了一个手动列算式求解任意正整数算术平方根的方法,如下:

  • 相关阅读:
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
  • 原文地址:https://www.cnblogs.com/z-sm/p/5020754.html
Copyright © 2011-2022 走看看