2013-07-16 286 views
2

我有以下的代碼,但在運行時,它給0.0 應該返回2一個值,因爲我試圖在區間[0, pi]sin(x)整合。 請指教。數值積分與黎曼和(Python)的

from math import sin, pi 

def Rsum(a,b): 
    for i in range(1001): 
     s = 0 
     delx = float((b-a)/1000) 
     g = i*delx 
     h = (i+1)*delx 

     y_i = float(sin(a+g)) 
     y_ii = float(sin(a+h)) 
     s += 1/2 * (y_i + y_ii) * delx 

    return s 

print Rsum(0,pi) 

回答

4

1/2 is 0 in python 2.x.它執行整數除法和舍入。您可以使用0.51.0/2來獲得想要的結果。

+0

謝謝。當然,菜鳥的錯誤。 :) 使用這個,我得到一個答案(-4.93479408312e-06)。但是,這不是預期的。該函數應該使用梯形法則來計算曲線下的面積,在這種情況下是sin(x)。 有什麼建議嗎? – TopGun

+1

嘗試在循環外移動s = 0。 – recursive

+0

謝謝遞歸!這現在起作用。 :) 我得到1.99999342027 但是,這是如何幫助完全?在前面的例子中,每次循環運行時是否被重新定義(重置爲0)? – TopGun

0

試試這個:

from math import sin, pi 

def Rsum(a,b): 

    for i in range(1001): 
     s = 0.0 
     delx = float(b-a)/1000.0 
     g = i*delx 
     h = (i+1.0)*delx 

     y_i = float(sin(a+g)) 
     y_ii = float(sin(a+h)) 
     s += 1.0/2.0 * (y_i + y_ii) * delx 
     #s += 1/2 * (sin(a+i*delx) + sin(a+(i+1)*delx)) * delx 

    return s 

print Rsum(0,pi) 

你應該小心浮點式使用整數,如果你有一個整數,然後用float()轉換。如果你的代碼中有一個常量,例如10,那麼使它成爲十進制... 10.0

+0

謝謝。當然,菜鳥的錯誤。 :) 使用這個,我得到一個答案(-4.93479408312e-06)。但是,這不是預期的。該函數應該使用梯形法則來計算曲線下的面積,在這種情況下是sin(x)。 有什麼建議嗎? – TopGun