牛頓迭代法求平方根
阿新 • • 發佈:2020-10-12
如圖,一個曲線方程 \(f(x)\),在它的 \(f(x_n)\) 處畫一條切線與 \(x\) 軸相交,交點為 \(x_{n+1}\),如果繼續在它的 \(f(x_{n+1})\) 處畫一條切線與 \(x\) 軸相交,會得到交點 \(x_{n+2}\)。然後重複這個過程,可以發現交點 \(x_{n+m}\) 會無限逼近方程 \(f(x)=0\) 的解,最終可以得到一個與理想值無限靠近的解。
關於為什麼可以用這個方法,或者說,可以用這個方法的函式有什麼條件,可以參考維基百科:
而我們這裡討論的是求平方根,很顯然可以使用這個方法。比如,我們要求 N 的平方根。可以分為一下幾個步驟:
- 將問題轉化為求方程 \(f(x) = x^2 - N\)
- 函式 \(f(x)\) 的導函式是:\(f^{'}(x)=2x\)
- 那麼 \(f(x)\) 函式的曲線在 \((x_n,x_n^{\ 2}-N)\) 點處切線的斜率為:\(2x_n\)
- 那麼切線函式為:\(g(x) = 2x_n(x-x_n) + (x_n^{\ 2} - N)\),即:\(g(x) = 2x_nx - x_n^{\ 2} - N\)
- 所以切線與 \(x\) 軸的交點 \(x_{n+1} = \displaystyle\frac{x_n + \frac{N}{x_n}}{2}\)
- 最後,我們將得到的交點值的平方與 \(N\) 比較,迴圈以上過程直至得到滿意的值。
對於 \(x_1\) 的值,我們選擇 \(N\) 就好。
C 程式碼:
double abs(double x) { return x < 0 ? -x : x; } /** * 精度為 0.00001 * @param x * @return */ double sqrt(double x) { if (x < 0) return 0; else { double err = 0.00001; // 設定誤差範圍,當誤差小於這個值時我們認為得到了準確值 double root = x; while (abs(x - root * root) > err) root = (root + x / root) / 2; // 運用牛頓迭代法的公式進行計算 return root; } }
參考:https://blog.csdn.net/chenrenxiang/article/details/78286599