python計算平方根
用match包
import math
math.sqrt( x )
自己實現
二分法步驟:
①low = 0;high = x;
②guess = (low + high) / 2
③如果guess² == x,則輸出guess,程式結束;
④如果guess² > x,則high = guess,繼續執行步驟②
⑤如果guess² < x,則low = guess,繼續執行步驟②
def dichotomy_sqrt(x):
if x > 1: #在0到1之間的數,我們知道0到1之間的任何乙個數平方後的結果都小於原值(0,1除外),因此如果要沿用上面的程式達不到「逼近」的作用,反而擴大了
a = 1.0
b = x
else:
a = x
b = 1.0
y = (a + x)/2
while abs(y * y - x) > 1e-6:
if y * y > x:
b = y
y = (y + a) /2
else:
a = y
y = (y + b) /2
return y
#牛頓迭代法
def newton_sqrt(x,y=1):
z = x/y
if abs(z - y) < 0.000001:
return z
else:
y = (y + z)/2
return newton_sqrt(x,y)
def sqrt1(x, y=1):
return x / y if abs(x/y - y) < 0.000001 else sqrt(x, (x/y + y)/2)
sqrt2 = lambda x, y=1:x / y if abs(x/y - y) < 0.000001 else sqrt2(x, (x/y + y)/2)
思路牛頓迭代
仔細思考一下就能發現,我們需要解決的問題可以簡單化理解。
從函式意義上理解:我們是要求函式f(x)=x²,使f(x)=num的近似解,即x²-num=0的近似解。
從幾何意義上理解:我們是要求拋物線g(x)=x²-num與x軸交點(g(x)=0)最接近的點。
我們假設g(x0)=0,即x0是正解,那麼我們要做的就是讓近似解x不斷逼近x0,這是函式導數的定義:
image.png
可以由此得到
image.png
從幾何圖形上看,因為導數是切線,通過不斷迭代,導數與x軸的交點會不斷逼近x0。
image.png
對於一般情況:
image.png
將m=2代入:
image.png
利用「將長方形變得更像正方形」的思路也可以得到求 a
的算數平方根的迭代公式
image.png
image.png
image.png
快速計算平方根
在3d圖形程式設計中,經常要求平方根或平方根的倒數,例如 求向量的長度或將向量歸一化。c數學函式庫中的sqrt具有理想的精度,但對於3d遊戲程式來說速度太慢。我們希望能夠在保證足夠的精度的同時,進一步提高速度。carmack在quake3中使用了下面的演算法,它第一次在公眾場合出現的時候,幾乎震住了...
計算平方根的演算法
總結一下一些常用的計算平方根的方法 1.牛頓法 具體的做法如下 計算公式如下 具體的計算程式如下 double sqrt double x return g 2.利用級數進行逼近 微積分中的泰勒級數如下 這樣,有了這個公式我們可以得到求平方根公式的展開式 這樣我們可以進行在一定精度內的逼近。但是這兒...
平方根問題
考慮定義在兩正整數上的函式ssr 平方根之和的平方 ssr a,b sqrt a sqrt b 2。牛牛對函式值為整數的情況很感興趣。現在給定整數n和m,請幫助牛牛計算有序對 a,b 的數量,滿足1 a n,1 b m而且ssr a,b 是乙個整數。這道題本質上是要求sqrt ab 是整數,也就是要...