2014-12-06 120 views
2

我的程序旨在使用n個梯形在兩個數字(x1,x2)之間定義給定函數的積分。看起來,我的部門的自動評估程序給出的答案不同於mine.Problem的是,我不能發現任何錯誤在我的代碼...使用梯形法則定義積分(初學者)

def funct(x): 
    val= -(1./6)*(x-1)*(x-2)*(x+2)*(x-4) 
    return val 


x1,x2,n=input() 
Dx=float(x2-x1)/n 
Sum=0 
i=x1+Dx 
while i<x2: 
    val=funct(i) 
    Sum+=val 
    i+=Dx 
Sum=2*Sum 
val1=funct(x1) 
val2=funct(x2) 
S=(Dx/2)*(val1+val2+Sum) 
print "%.3f" %S 
+1

你使用了什麼樣的x1和x2值,答案是什麼? – ErikR 2014-12-06 22:11:19

+0

x1和x2可以是任何實數,只要x1 user4332869 2014-12-06 22:29:35

+0

我可以說你的風格比較巴洛克風格嗎?特別是「Sum = Sum * 2」的陳述......另一種說法是:由於數學的先天習慣和後來的程序設計,一個字母變量「i,j,k,m,n」度,'l'用來表示用作索引或計數的整數。例如,一個更加習慣的用法是'x_i = x1 + Dx' – gboffi 2014-12-06 23:12:40

回答

1

由於四捨五入問題,您while循環總是包括x最後一個值,可嘗試使用精確的整數運算

x0, x1 = -88.787529, 83.494648 
n = 1942 

dx = (x1-x0)/n 
s = 0 
i = 1 
while i < n: 

    # if we allow i == n, in the following row we'll have 
    # x0 + n*dx = x0 + n * (x1-x0)/n = x0 + x1 - x0 = x1 
    # but we want to exclude the last term 

    s = s + funct(x0+i*dx) 
    i = i + 1 
result = (s + funct(x0)/2.0 + funct(x1)/2.0)*dx 
+0

非常感謝,沒有得到你提到的「舍入問題」。 – user4332869 2014-12-06 23:13:44

+0

不要循環使用整數或使用寬容(例如'while x_i <(x1-0.1 * dx)'),因爲您不能認爲舍入不會是一個真正的變量問題。 – gboffi 2014-12-06 23:20:27

+0

哦,我看到了,我很擔心那件事,但並不確定它實際上可能是問題。事實上,程序運行良好 – user4332869 2014-12-06 23:24:26

0

我知道這個我這可能是某種作業問題,但總的來說,不要重新發明輪子:

import numpy 

def funct(x): 
    return -(1./6)*(x-1)*(x-2)*(x+2)*(x-4) 

x1, x2 = -88.787529, 83.494648 
n = 1942 
# n "panels", n+1 points 
x = numpy.linspace(x1, x2, n+1) 
y = funct(x) 

result = numpy.trapz(y, x) 
+0

我知道numpy函數。只是我不能跳過整個思路程序,你知道..爲編程的緣故。但是,感謝 – user4332869 2014-12-06 23:31:25