2016-12-16 68 views
0

我做Python中的函數計算根據梯形規則定積分: Trapezoidal rule formula由梯形規則算法積分我寫的,是給10倍的答案

這是代碼:

from math import ceil 

def Trapez_rule(f, a, b, n): 
    '''Calculates an estimation of a definite integral of a function f(x), between the boundries a, b, by dividing the area to n equal areas''' 
    sum = (f(a) + f(b))/2 
    for i in range(ceil((b * n))): 
     sum += f(a + i/n) 
    sum *= (b - a)/n 
    return sum 

它給出的答案是它應該返回的10倍。 我無法找到問題的根源。

+0

在for循環中嘗試打印以查看發生了什麼,然後您可能會自己發現問題。 – dustin

+0

由於您的建議,我現在就這樣做了。我在循環中添加了「print(str(f(a + i/n))+」「+ str(sum))」這一行。沒有辦法知道應該在那裏出現什麼數字。最後的結果也不能從循環中理解,因爲稍後你將它乘以另一個數字,並完全改變結果。 –

+0

在每個步驟中打印中間值,或者使用調試器。你會看到你的假設破裂的地方。 – 9000

回答

1

假設:

a=10 
b=20 
n=5 

這些線的問題:

for i in range(ceil((b * n))): 
    sum += f(a + i/n) 

i從0到99
當i = 99,那麼:

f(a + i/n) => f(10 + 99/5) => f(29) 
  1. 你除以兩個99/5 => 29而不是29.8。
  2. 但你只希望有它的範圍從10到20
  3. 您可以使用下面的後向N虛假的樣子,所以這應該工作:

    高清Trapez_rule(F,A,B, n): 對於範圍(1,n-1)中的i,和=(f(a)+ f(b))/ 2.w : sum + = f (A + I * H) 總和* = H 回報總和

+0

對不起,它不起作用。結果仍然不正確。在嘗試其他功能時,有時結果甚至不是真實結果的10倍,而只是假,與實際結果沒有任何關係。 –

+0

我編輯我的文章^^你分兩個整數,這是第二次失敗。 但它看起來仍然是腥......嗯 – Boendal

+0

保持不變... –

0

我繼續網絡固定您的代碼,並且還將該功能重命名爲適合官方指南PEP-8

def trapezium_rule_integral(f, a, b, n): 
    '''Calculates an estimate of the definite integral of a function f, between 
     the boundaries a and b, by dividing the area to n equal areas''' 
    height = (b - a)/n 
    x = a 
    ys = [] 
    while x <= b: 
     ys.append(f(x)) 
     x += height 
    estimate = 0.5 * height * ((ys[0] + ys[-1]) + 2 * (sum(ys[1:-1]))) 
    return estimate