求n的平方根,先假设一猜测值
先让我们来验证下这个巧妙的方法准确性,来算下2的平方根 (Computed by Mathomatic)
1-> x_new = ( x_old + y/x_old )/2 y (x_old + -----) x_old #1: x_new = --------------- 2 1-> calculate x_old 1 Enter y: 2 Enter initial x_old: 1 x_new = 1.5 1-> calculate x_old 2 Enter y: 2 Enter initial x_old: 1 x_new = 1.4166666666667 1-> calculate x_old 3 Enter y: 2 Enter initial x_old: 1 x_new = 1.4142156862745 1-> calculate x_old 10 Enter y: 2 Enter initial x_old: 1 Convergence reached after 6 iterations. x_new = 1.4142135623731 ...
可见,随着迭代次数的增加,运算值会愈发接近真实值。很神奇的算法,可是怎么来的呢? 查了下wikipedia和wolfram,原来算法的名字叫Newton’s Iteration (牛顿迭代法)。
下面是数理介绍,不喜欢数学的言下之意也就是绝大部分人可以略过了。
简单推导
假设
求出
简化等式得到:
然后利用得到的最终式进行迭代运算直至求到一个比较精确的满意值,为什么可以用迭代法呢?理由是中值定理(Intermediate Value Theorem):
如果
DE>f DE>函数在闭区间 DE>[a,b] DE>内连续,必存在一点 DE>x DE>使得 DE>f(x) = c DE>, DE>c DE>是函数 DE>f DE>在闭区间 DE>[a,b] DE>内的一点
我们先猜测一
回到我们最开始的那个”莫名其妙”的公式,我们要求的是
求
代入前面求到的最终式中:
化简即得到我们最初提到的那个求平方根的神奇公式了:
用泰勒公式推导
我之前介绍过在The Art and Science of C一书中有用到泰勒公式求平方根的算法,其实牛顿迭代法也可以看作是泰勒公式(Taylor Series)的简化,先回顾下泰勒公式:
仅保留等式右边前两项:
令
再令
转化为: