一、介紹
平方根(square root)是高中數學中比較基礎的概念之一,也是在實際應用中非常常見的運算之一。Python內置的math庫中提供了對平方根進行近似計算的sqrt函數,但由於計算機在進行浮點數運算時存在著精度誤差,所以在一些精度要求比較高的場景下,我們需要自己編寫平方根代碼以達到精準計算數字x的準確值的目的。
二、計算方法
計算平方根的最基本方法就是不斷地使得近似值的平方逼近待求值,這個過程類似於二分查找。最開始的時候可以將待求值x作為近似值,即x = s。每次將近似值與x/近似值求平均數,得到下一個近似值。不斷重複這個過程,直到符合精度或者迭代次數達到了上限。
def sqrt(x):
"""
計算數字x的平方根,精度要求1e-7
"""
if x == 0:
return 0
res = x
while abs(res * res - x) > 1e-7:
res = (res + x / res) / 2
return res
上面的代碼中,初始近似值res被賦值為待求值x,while循環中每次將res與x/res求平均數,得到下一個近似值,並進行判斷。在這個判斷中,二者的平方差與精度要求1e-7進行比較,如果差距仍然較大,即近似值繼續向待求值逼近,直到符合精度或者達到迭代次數上限。
三、優化方法
上面的演算法是最基本的求解平方根的方法,但在實際應用中可能需要進行一些優化。這裡介紹兩種優化方法。
1. 牛頓迭代法
牛頓迭代法是一種近似求解方程的方法,對於求平方根的問題,它的迭代公式如下:
xn+1 = (xn + a/xn)/2
其中,a為待求的數字,xn為第n個近似值。
在牛頓迭代法中,近似值的計算速度更快,通常情況下只需要數次迭代即可得到較為準確的結果。
def sqrt_newton(x):
"""
牛頓迭代法計算數字x的平方根,精度要求1e-7
"""
if x == 0:
return 0
res = x
while abs(res * res - x) > 1e-7:
res = (res + x / res) / 2
return res
2. 二分法
另一個求解平方根問題的方法是二分法,這個方法在計算平方根的時候表現不如迭代法,但在其他求解方程問題上可能會更為實用。二分法的大致思路如下:
如果x>=1,那麼x的平方根不可能大於x/2,不可能小於0,因此我們可以從0~x/2採用二分法進行迭代。
如果x<1,那麼x的平方根不可能大於x,不可能小於0,因此我們可以從0~x採用二分法進行迭代。
二分法的代碼示例如下:
def sqrt_binary(x):
"""
二分法計算數字x的平方根,精度要求1e-7
"""
if x == 0:
return 0
left, right = 0, max(x, 1)
while left + 1e-7 < right:
mid = (left + right) / 2
if mid * mid < x:
left = mid
else:
right = mid
return left
四、總結
Python編寫的平方根代碼雖然不如內置的sqrt函數簡單,但考慮到精度要求,自己編寫代碼時可以選擇基本計算方法、牛頓迭代法或二分法等不同的計算方法,並根據實際情況進行優化。在實際應用中,還需要考慮到數據類型、運算速度等因素。掌握好求解平方根的方法,可以為我們在一些數學計算及相關問題的求解中提供很多方便。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/258546.html