2012-11-20 38 views
2

我想在python(而不是內置函數)中使用插值方法來獲取給定間隔的函數的根。Python插值錯誤

我已經做了以下,不知道我要去哪裏錯了,我已經做了與平分,我雖然唯一的區別將是測試點。

X1和X2的間隔的兩個端部中,f是功能和小量是公差

def interpolation (x1,x2,f,epsilon): 
i = 1 
n = 100 
while i<n: 
    m = (f(x2)- f(x1))/(x2-x1) 
    b = f(x2) - m*(x2) 
    p = b 
    print (i,p,f(p)) 
    if f(p) == 0 or b< epsilon: 
     print ('The root is at ',p,'after',i,'iterations') 
     break 
    i+= 1 
    if f(x1)*f(p) > 0:   #Equal signs 
     x1 = p 
    else: 
     x2 = p 

以f =的sin(x^2)簡單地返回100次迭代振盪如下運行此:

代碼

(80, 1.3266674970489443, 0.98214554271216425) 
    (81, 1.4900968376899661, 0.79633049173817871) 
    (82, 1.3266674970489443, 0.98214554271216425) 
    (83, 1.4900968376899661, 0.79633049173817871) 
+1

無關:不是'while while phihag

+0

「我做了以下事情,不知道我哪裏出錯了」。你能告訴我們代碼的行爲有什麼問題嗎? – Marcin

+0

我添加了它,謝謝 – user1778543

回答

2

它看起來就像你正在試圖解決這個使用割線法。插值方法需要三個初始值。

我不是很確定的方向,你用你的代碼去,但是我能有點其調整如下:

i = 1 
n = 100 
while i<n: 
    print x1, x2 
    m = (f(x2)- f(x1))/(x2-x1) 
    b = f(x2) - m*(x2) 
    p = -b/m #root for this line 

    # are we close enough? 
    if abs(f(p)) < epsilon: 
     print ('The root is at ',p,'after',i,'iterations') 
     break 
    i+= 1 

    x1 = x2 
    x2 = p 

它解決它在4次迭代基於1我的出發位置,2:

1 2 
2 1.52648748495 
1.52648748495 1.75820676726 
1.75820676726 1.7754676477 
('The root is at ', 1.7724406948343991, 'after', 4, 'iterations') 
+0

謝謝,我看到我在哪裏出錯了,儘管我認爲如果你只是指出而不是給出完整的答案 – user1778543

0

如果你真正想要的是解決問題(而不是開發用於鍛鍊的解決方案),我建議你使用現成的模件即

我的第一選擇將是scipy.optimize.bisect()docs

該模塊有其他的方法,太像牛頓迭代等

+0

我知道,但我正在嘗試做一個練習;) – user1778543