2012-10-11 119 views
2

我知道這已經在C/C++中解決了,但是我不太習慣這些語言能夠將它轉換爲python。我正在嘗試在python中創建this。我能來最接近的是這樣的:python中的分割方法函數

#This is meant to work for functions of the form x^a + b = 0 

def secant(base, exp=2, it=20): 
    def f(x): 
     return x**exp - base 
    x1 = base/float(exp**2) 
    xnm1 = x1 - 5 
    xnm2 = x1 + 5 
    xn = 0 
    for n in range(it): 
     q = (xnm1-xnm2)/float(f(xnm1)-f(xnm2)) 
     xn = xnm1 - (f(xnm1)*q) 
     xnm1, xnm2 = xn, xnm1 
    return xn 

print secant(2, 2) 

這將返回錯誤:

Traceback (most recent call last): 
    File "/Users/Joe/Desktop/secant.py", line 16, in <module> 
    print secant(2, 2) 
    File "/Users/Joe/Desktop/secant.py", line 11, in secant 
    q = (xnm1-xnm2)/float(f(xnm1)-f(xnm2)) 
ZeroDivisionError: float division by zero 

我能,但是,編程的牛頓法,這是我基於這個代碼斷。如果有幫助的話,這裏是:

def newton(base, exp=2, it=20): 
    def f(x): 
     return x**exp - base 
    def df(x): 
     return exp*(x**(exp-1)) 
    x1 = base/float(exp**2) 
    xnp = x1 
    xn = 0 
    for n in range(it): 
     xn = xnp - ((f(xnp)/df(xnp))) 
     xnp = xn 
    return xn 

以下方法在20次迭代後給出12個數字的準確度的答案。任何幫助,將不勝感激。

+0

對此不起作用的是什麼? –

+0

不好意思。我通過零錯誤得到一個分區。 – JShoe

回答

2

你被零誤差得到一個界線,因爲算法收斂到答案中的Python的精度浮點數。除了迭代最大次數(以避免無限循環)之外,還應檢查最後兩次猜測是否「足夠接近」。

+0

謝謝,我修改了它,直到xnm1 = xnm2。 – JShoe

+2

這並不總是有效。有時你會遇到一個在兩個值之間跳動的解決方案。 – casevh

2

重要的是浮動圈數。在前一種情況下,經過一些迭代後,f(xnm1)f(xnm2)之間的差異非常小以至於浮點數將無法表示它,因此它將舍入爲零,然後拋出錯誤。

在後者中,我們直接通過使用導數計算該點的斜率,雖然它很小,但它不是零(但在接下來的迭代中它幾乎保持相同的值),所以它不會拋出一個錯誤。

這裏的an exampleIEEE floating point