什麼是牛頓迭代法?
今天在刷 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 個視頻,想了解更多的可以查看視頻。
假設我們有一個連續的函數,其在 軸上存在很多根(零點)。現在在 軸上取一初始點 ,該點對應的函數值爲 。然後在該點的函數值附近畫切線,切線與 軸的交點爲 。假設 ,在由切線,x 軸及函數值 形成的三角形中,可以求得斜率 ,化解可得 。slope 即爲函數在 處的導數,所以有 ,最後代入得 。後面在 對應的函數值處取切線,然後開始新一輪的迭代。之後再循環這個過程,直到達到足夠準確的值,這就是牛頓法求根的過程。過程中迭代的公式可以寫成:
爲什麼可以用它來求解開方問題?
根據上面的基本介紹,牛頓法是用於求解一個實數函數的根的近似值的方法。然而開方問題可以看成是對方程 求根的問題,所以就可以用牛頓法來求解:首先可以得知 ,所以迭代公式爲
依據該迭代公式,對應 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:文中有錯歡迎指出,互相學習。以及歡迎關注我的公衆號 :)