基礎算法六:求平方根的問題

求解\sqrt{n},也是面試中經常問的一個問題。該問題有兩種解法:二分法和牛頓法。

首先說二分法,首先給定個初始區間範圍[0,n],因爲\sqrt{n}一定是在這個範圍內,然後比較這個區間的中值的平方m^{2}和n,如果m^{2}小於n,將範圍縮小爲[m,n],如果m^{2}大於n,將範圍縮小爲[0,m​​​​​​​]。然後重複這個步驟,直到誤差小於設定的閾值。

代碼如下:

def binary_search(n, e=1e-5):
    '''
    二分法計算平方根
    '''
    max = n
    min = 0.
    mid = (max + min) / 2.
    while abs(mid * mid - n) > e:
        if mid * mid > n:
            max = mid
        elif mid * mid < n:
            min = mid
        else:
            return mid
        mid = (max + min) / 2.
    return mid

然後是牛頓法,牛頓法是一種求函數f(x)的0點的方法,對於我們這個問題,如果我們要求的值爲x,那麼x^{2}-n=0,於是就轉化成了求f(x)=x^{2}-n的0點。牛頓法的做法是給定x的初始值x=x_{0},對f(x)求導求出f(x)x_{0}處的切線,該切線和y軸交點處爲x_{1},將x更新爲x_{1},重複剛纔的過程,使x不斷逼近f(x)=0的點。

如下圖所示:

x的更新公式推導過程爲:

f(x)x_{t-1}處的切線方程爲:y=f'(x_{t-1})x+f(x_{t-1})-f'(x_{t-1})x_{t-1}

f'(x_{t-1})x_{t}+f(x_{t-1})-f'(x_{t-1})x_{t-1}=0

於是x_{t}=x_{t-1}-\frac{f(x_{t-1})}{f'(x_{t-1})}=x_{t-1}-\frac{x_{t-1}^{2}-n}{2x_{t-1}}=\frac{1}{2}(x_{t-1}+\frac{n}{x_{t-1}})

代碼如下:

def newton_search(n, e=1e-5):
    '''
    牛頓法計算平方根
    '''
    x = n
    while abs(x * x - n) > e:
        x = (x + n / x) / 2.
    return x

運行結果如下所示:

if __name__ == '__main__':
    print(binary_search(2))
    print(newton_search(2))


1.414215087890625
1.4142156862745097

 

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