平方根迭代公式
假设√a = x
则平方根迭代公式为:
xn+1 = 1/2 (xn + a/xn)
推导过程
假设有如上图的曲线,xn点的直线为曲线的切线,容易得到xn的方程为 f(xn) + f’(xn)(x - xn)
上面的方程是根据泰勒级数展开后,去除高阶项后得到。
这样让切线方程等于0的点的x设为xn+1,方程变为了f(xn) + f’(xn)(xn+1 - xn)(粗体是导数) = 0
解得xn+1 = xn - f(xn)/f’(xn)(粗体是导数)。
进入今天的主题,已知√a = x,所以x2 - a = 0,曲线如下图,
我们任意取xn点,假设是上面的两种情况。
上面的推导公式同样适用于当前曲线情况。通过上面的迭代公式xn+1 = xn - f(xn)/f’(xn)(粗体是导数)和图像不难看出,xn+1总是向y = 0的x点趋近,这样只要我们选择了xn后,不断地迭代求xn+1,它总是能够到达y = 0的点,此时的x便是平方根的值。
我们将x2 - a = 0带入到上面的迭代公式,得到了xn+1 = 1/2 (xn + a/xn)。
需要注意的是我们的根号后得到的x为正值,而二次函数显然有两个值,一正一负,这就需要我们选择的初始xn点应该为正值。
实现代码
代码就是简单的实现了一下,还有漏洞,希望读者自己查缺补漏吧。
#include <iostream>
#include <cmath>
using namespace std;
double f(double x, double a)
{
x = (x + a/x)/2;
if (abs(a-x*x) < 0.000001)
return x;
return f(x, a);
}
int main()
{
double n;
cin >> n;
cout << f(5, n) << endl;
return 0;
}