每日一問之初識牛頓迭代法(Newton's method)

什麼是牛頓迭代法?

今天在刷 LeetCode 的 sqrt(x) 這道題的時候,看到別人的解法中有使用牛頓迭代法。之前也看到這個方法很多次,但都沒有去了解。今天正好就這個問題來稍微整理一下:

  • 什麼是牛頓法?
  • 爲什麼可以用它來求解開方問題?

什麼是牛頓法

在維基百科中的定義如下:

In numerical analysis, Newton's method (also known as the Newton–Raphson method), named after Isaac Newton and Joseph Raphson, is a method for finding successively better approximations to the roots (or zeroes) of a real-valued function. It is one example of a root-finding algorithm.

牛頓法是一種用於找到實數函數的根的近似值的方法,是求根算法中的一個代表。下面以一個例子來具體說明用牛頓法求根的過程。

一個變量中的 Newton-Raphson 方法實現如下,主要的想法來自這個視頻,這個教授講解的挺明白的,一共有 7 個視頻,想了解更多的可以查看視頻。

假設我們有一個連續的函數f(x),其在 x 軸上存在很多根(零點)。現在在 x 軸上取一初始點 x_1,該點對應的函數值爲 f(x_1)。然後在該點的函數值附近畫切線,切線與 x 軸的交點爲 x_2。假設 x_2 = x_1 - △x,在由切線,x 軸及函數值f(x_1) 形成的三角形中,可以求得斜率 slope =\frac{f(x_1)}{△x},化解可得 △x = \frac{f(x_1)}{slope}。slope 即爲函數在 x_1 處的導數,所以有 △x = \frac{f(x_1)}{f'(x_1)},最後代入得 x_2 = x_1 - \frac{f(x_1)}{f'(x_1)}。後面在 x_2 對應的函數值處取切線,然後開始新一輪的迭代。之後再循環這個過程,直到達到足夠準確的值,這就是牛頓法求根的過程。過程中迭代的公式可以寫成:x_{n+1}=x_n - \frac{f(x_n)}{f'(x_n)}

爲什麼可以用它來求解開方問題?

根據上面的基本介紹,牛頓法是用於求解一個實數函數的根的近似值的方法。然而開方問題可以看成是對方程 x^2 - n =0 求根的問題,所以就可以用牛頓法來求解:首先可以得知 f(x) = x^2 - n ,f'(x) = 2x,所以迭代公式爲 x_{n+1}=x_{n} - \frac{ x_{n}^2 - n}{2x_{n}} = \frac{x_n + \frac{n}{x_n}}{2}。

依據該迭代公式,對應 LeetCode 的 sqrt(x) 這道題寫成 Python 代碼就會很簡潔,比二分法要簡潔多了,且運行時間也快一些。

class Solution:
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """       
        
        """
        # 採用二分法
        low, high = 0, x
        while(low <= high):
            mid = int((low + high) / 2)
            if mid*mid > x :
                high = mid - 1
            elif mid*mid < x:
                low = mid + 1
            else:
                return mid

        
        return low - 1
        """
        # 採用牛頓迭代法
        r = x
        while r*r > x:
            r = int((r + x/r) / 2)
        
        return r 

參考

[1]. Newton's method - wikipedia
[2]. Calculus: Newton's Method (1 of 7) Basics Continued: Roots of Functions

P.S:文中有錯歡迎指出,互相學習。以及歡迎關注我的公衆號 :)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章