數理介紹,不喜歡數學的言下之意也就是絕大部分人能夠略過了。算法
假設f(x)
是關於X
的函數:app
求出f(x)
的一階導,即斜率:函數
簡化等式獲得:spa
而後利用獲得的最終式進行迭代運算直至求到一個比較精確的滿意值,爲何能夠用迭代法呢?理由是中值定理(Intermediate Value Theorem):3d
若是
f
函數在閉區間[a,b]
內連續,必存在一點x
使得f(x) = c
,c
是函數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 - n
rem
求f(X)
的一階導爲:get
f'(X) = 2X
代入前面求到的最終式中:
Xk+1 = Xk - (Xk2 - n)/2Xk
化簡即獲得咱們最初提到的那個求平方根的神奇公式了:
我以前介紹過在The Art and Science of C一書中有用到泰勒公式求平方根的算法,其實牛頓迭代法也能夠看做是泰勒公式(Taylor Series)的簡化,先回顧下泰勒公式:
僅保留等式右邊前兩項:
令f(X0+ε) = 0
,獲得:
再令X1 = X0 + ε0
,獲得ε1
…依此類推可知:
轉化爲:
從推導來看,其實牛頓迭代法不只能夠用來求平方根,還能夠求立方根,甚至更復雜的運算。
一樣,咱們還能夠利用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); }