利用牛頓迭代法求平方根

數理介紹,不喜歡數學的言下之意也就是絕大部分人能夠略過了。算法

簡單推導

假設f(x)是關於X的函數:app

An illustration of one iteration of Newton's method

求出f(x)的一階導,即斜率:函數

f'(x_{n}) = \frac{ \mathrm{rise} }{ \mathrm{run} } = \frac{ \mathrm{\Delta y} }{ \mathrm{\Delta x} } = \frac{ f( x_{n} ) - 0 }{ x_{n} - x_{n+1} } = \frac{0 - f(x_{n})}{(x_{n+1} - x_{n})}\,\!

簡化等式獲得:spa

 x_(n+1)=x_n-(f(x_n))/(f^'(x_n))

而後利用獲得的最終式進行迭代運算直至求到一個比較精確的滿意值,爲何能夠用迭代法呢?理由是中值定理(Intermediate Value Theorem):3d

若是f函數在閉區間[a,b]內連續,必存在一點x使得f(x) = cc是函數f在閉區間[a,b]內的一點code

咱們先猜想一X初始值,例如1,固然地球人都知道除了1自己以外任何數的平方根都不會是1。而後代入初始值,經過迭代運算不斷推動,逐步靠近精確值,直到獲得咱們主觀認爲比較滿意的值爲止。例如要求768的平方根,由於252 = 625,而302 = 900,咱們可先代入一猜想值26,而後迭代運算,獲得較精確值:27.7128。blog

回到咱們最開始的那個」莫名其妙」的公式,咱們要求的是N的平方根,令x2 = n,假設一關於X的函數f(x)爲:ci

f(X) = X2 - nrem

f(X)的一階導爲:get

f'(X) = 2X

代入前面求到的最終式中:

Xk+1 = Xk - (Xk2 - n)/2Xk

化簡即獲得咱們最初提到的那個求平方根的神奇公式了:

 x_(k+1)=1/2(x_k+n/(x_k))

用泰勒公式推導

我以前介紹過在The Art and Science of C一書中有用到泰勒公式求平方根的算法,其實牛頓迭代法也能夠看做是泰勒公式(Taylor Series)的簡化,先回顧下泰勒公式:

f(x_0+epsilon)=f(x_0)+f^'(x_0)epsilon+1/2f^('')(x_0)epsilon^2+....

僅保留等式右邊前兩項:

f(x_0+epsilon) approx f(x_0)+f^'(x_0)epsilon.

f(X0+ε) = 0,獲得:

epsilon_0=-(f(x_0))/(f^'(x_0))

再令X1 = X0 + ε0,獲得ε1…依此類推可知:

epsilon_n=-(f(x_n))/(f^'(x_n))

轉化爲:

 x_(n+1)=x_n-(f(x_n))/(f^'(x_n))

引伸

從推導來看,其實牛頓迭代法不只能夠用來求平方根,還能夠求立方根,甚至更復雜的運算。

一樣,咱們還能夠利用C語言來實現下那個最簡單的求平方根的公式(儘管咱們能夠直接用sqrt()完成)

#include <stdio.h>
#include <math.h>
#define N 768
main() {
float x=1;
int i;
for (i=1;i<=1000;i++) {  // recursion times : 1000
x = (x + N/x)/2;
}
printf("The square root of %d is %f\n",N,x);
}
相關文章
相關標籤/搜索