正文
牛顿迭代法求n方根
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
一、简单推导
二、使用
借助上述公式,理论上可以求任意次方根,假设要求a(假设非负)的n次方根,则有x n =a,令f(x)=x n -a,则只需求f(x)=0时x的值即可。由上述简单推导知,当f(x)=0时,x n+1= x n, 因此把f(x)=x n -a 代入上述迭代式进行迭代直至x n+1= x n 即可。
实际中x n+1= x n 可能永远达不到,可以根据给定精度△,当|x n+1- x n |<△成立时即可停止迭代,此时的x n+1 即为所求。
下面以算术平方根和立方根举例。
(一)算术平方根
设待求算术平方根的数为a,其算术平方根为x,则x 2 =a,令f(x)=x 2 -a,代入上面的递推式有x n+1= x n -(x n 2 -a)/(2x n ),整理得x n+1 =(1/2)(x n +a/x n )
代码如下:
double sqrt(double a)
{
double x1=a;
double x2=a/;
while(fabs(x1-x2)>0.0000001)
{
//printf("%f\n",x2);
x1=x2;
x2=0.5*(x1+a/x1);
}
return x2;
}
(二)立方根
同理,令f(x)=x 3 -a,代入递推式有x n+1= x n -(x n 3 -a)/(3x n 2 ),整理得x n+1 =(1/3)(2x n +a/x n 2 )
代码如下:
double cubrt(double a)
{
double x1=a;
double x2=a/;
while(fabs(x1-x2)>0.0000001)
{
//printf("%f\n",x2);
x1=x2;
x2=(*x1+a/(x1*x1))/3.0;
}
return x2;
}
三、(题外话)手算算式平方根
顺便提下,在网上看到了一个手动列算式求解任意正整数算术平方根的方法,如下: