前段時間去面試,被問到「如何在不呼叫庫函式的前提下最快速地求出根號2,結果保留6位有效數字?」
方法一:簡單暴力的逼近法
x = 0.0
count = 0
while 1:
count += 1
x += 0.00001
if x*x >= a:
break
print x
print count
思路就是:x先取0,步長取0.00001,使得x^2逐步逼近2;
使用此方法求得的結果為1.41422,但是此方法迴圈竟然執行了141422次,實在是不快;
回去之後想了下又在網上查了下,了解到下面的方法二
方法二:牛頓迭代法
(1)先設f(x)=x^2 - a;
(2)求f(x)的一階導數,即斜率;
(3)得到xn+1與xn的迭代關係式
化簡上述斜率公式,即得到:
xn+1=1/2*(xn+a/xn);
(4)**實現
def sqrt(a):
x=0.0
y=a/2
count = 0
while(x!=y):
print 'x=',x,'y=',y
count += 1
x=yy=(x+a/x)/2
print count
return x
此方法計算出的結果為:1.41421356237,且只迭代了6次;
總結:
牛頓迭代法的本質是求出xn與xn+1的迭代關係式,此方法可以推廣至求任意次方根,例如求立方根:xn+1=1/3*(2*xn+a/xn^2);
def sqrt_3(a):
x=0.0
y=a/2
count = 0
while(x!=y):
print 'x=',x,'y=',y
count += 1
x=yy=(2*x+a/(x*x))/3
print count
return x
參考資料: 牛頓迭代法求平方根
sqrt 方法 public static double sqrt double c 什麼是牛頓迭代法 多數方程不存在求根公式,牛頓提出了一種用迭代來求方程近似根的方法。思路就是不斷取切線,用線性方程的根逼近非線性方程f x 0的根x 過程簡介 過點 xk,f xk 作函式的切線,切線方程是 切線與...
牛頓迭代法 求平方根
牛頓迭代法 求出根號a的近似值 首先隨便猜乙個近似值x,然後不斷令x等於x和a x的平均數,迭代個六七次後x的值就已經相當精確了。例如,我想求根號2等於多少。假如我猜測的結果為4,雖然錯的離譜,但你可以看到使用牛頓迭代法後這個值很快就趨近於根號2了 這種演算法的原理很簡單,我們僅僅是不斷用 x,f ...
牛頓迭代法求平方根
牛頓迭代法 newton s method 又稱為牛頓 拉夫遜 拉弗森 方法 newton raphson method 它是牛頓在17世紀提出的一種在實數域和複數域上近似求解方程的方法。多數方程不存在求根公式,因此求精確根非常困難,甚至不可能,從而尋找方程的近似根就顯得特別重要。方法使用函式f x...