求n的平方根,先假設(shè)一猜測(cè)值
先讓我們來(lái)驗(yàn)證下這個(gè)巧妙的方法準(zhǔn)確性,來(lái)算下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 ...
可見,隨著迭代次數(shù)的增加,運(yùn)算值會(huì)愈發(fā)接近真實(shí)值。很神奇的算法,可是怎么來(lái)的呢? 查了下wikipedia和wolfram,原來(lái)算法的名字叫Newton’s Iteration (牛頓迭代法)。
下面是數(shù)理介紹,不喜歡數(shù)學(xué)的言下之意也就是絕大部分人可以略過(guò)了。
簡(jiǎn)單推導(dǎo)
假設(shè)
求出
簡(jiǎn)化等式得到:
然后利用得到的最終式進(jìn)行迭代運(yùn)算直至求到一個(gè)比較精確的滿意值,為什么可以用迭代法呢?理由是中值定理(Intermediate Value Theorem):
如果
DE>f DE>函數(shù)在閉區(qū)間 DE>[a,b] DE>內(nèi)連續(xù),必存在一點(diǎn) DE>x DE>使得 DE>f(x) = c DE>, DE>c DE>是函數(shù) DE>f DE>在閉區(qū)間 DE>[a,b] DE>內(nèi)的一點(diǎn)
我們先猜測(cè)一
回到我們最開始的那個(gè)”莫名其妙”的公式,我們要求的是
求
代入前面求到的最終式中:
化簡(jiǎn)即得到我們最初提到的那個(gè)求平方根的神奇公式了:
用泰勒公式推導(dǎo)
我之前介紹過(guò)在The Art and Science of C一書中有用到泰勒公式求平方根的算法,其實(shí)牛頓迭代法也可以看作是泰勒公式(Taylor Series)的簡(jiǎn)化,先回顧下泰勒公式:
僅保留等式右邊前兩項(xiàng):
令
再令
轉(zhuǎn)化為: