牛頓迭代法求平方根
求n的平方根,先假設一猜測值x0 = 1
,然後根據以下公式求出x1
,再將x1
代入公式右邊,繼續求出x2
…通過有效次迭代後即可求出n的平方根,xk+1
先讓我們來驗證下這個巧妙的方法準確性,來算下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 (牛頓迭代法)。
假設f(x)
是關於x
的函式:
求出f(x)
的一階導,即斜率:
簡化等式得到:
然後利用得到的最終式進行迭代運算直至求到乙個比較精確的滿意值,為什麼可以用迭代法呢?理由是中值定理(intermediate value theorem):
如果我們先猜測一f
函式在閉區間[a,b]
內連續,必存在一點x
使得f(x) = c
,c
是函式f
在閉區間[a,b]
內的一點
x
初始值,例如1,當然地球人都知道除了1本身之外任何數的平方根都不會是1。然後代入初始值,通過迭代運算不斷推進,逐步靠近精確值,直到得到我們主觀認為比較滿意的值為止。例如要求768的平方根,因為252 = 625
,而302 = 900
,我們可先代入一猜測值26,然後迭代運算,得到較精確值:27.7128。
回到我們最開始的那個求2次方根的公式,令x2 = n
,假設一關於x
的函式f(x)
為:
f(x) = x2 - n
求f(x)
的一階導為:
f'(x) = 2x
代入前面求到的最終式中:
xk+1 = xk - (xk
2 - n)/2xk
化簡即得到我們最初提到的那個求平方根的神奇公式了:
在the art and science of c一書中有用到泰勒公式求平方根的演算法
,其實牛頓迭代法也可以看作是泰勒公式(taylor series)的簡化,先回顧下泰勒公式:
僅保留等式右邊前兩項:
令f(x0+ε) = 0
,得到:
再令x1 = x0 + ε0
,得到ε1
…依此類推可知:
轉化為:
牛頓迭代法
創新工廠的筆試題 不用庫函式sqrt 求乙個整型數n的開方,要求精度達到0.001即可。在這裡首先介紹一下牛頓迭代法 假設乙個方程為 f x 0 那麼假設其解為x0,則用泰勒級數展開之後可得 f x f x0 f x0 x x0 0 其中x為其近似解。根據上式推導出 x x0 f x0 f x0 這...
牛頓迭代法
目前接觸到的牛頓迭代法主要應用於兩個方面 1 方程求根問題 2 最優化問題。1 求解方程。並不是所有的方程都有求根公式,或者求根公式很複雜,導致求解困難。利用牛頓法,可以迭代求解。原理是利用泰勒公式,在x0處展開,且展開到一階,即f x f x0 x x0 f x0 求解方程f x 0,即f x0 ...
牛頓迭代法
欲求某方程 f x 0 的根,按照以下步驟進行求解 令x0 1 也可以選擇其他值 i 0,1,2 1 求出 f xi 和 導數f xi 2 令 x i 1 xi f xi f xi 3 將 x i 1 帶入方程 f x 計算方程值,當方程值與目標值的誤差小於預定值時,退出演算法輸出 x i 1 即為...