1. 程式人生 > 實用技巧 >牛頓迭代法求平方根

牛頓迭代法求平方根

如圖,一個曲線方程 \(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) = 0\) 時方程的解。
  • 函式 \(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