2016-12-15 26 views
0

我不明白爲什麼函數給我一個不正確的結果1,000,100,000.7423575,而不是原來的結果應該是1,000,000,000.75。 工作已經給了我們,我們需要實現Python,高階函數的功能,並且構建我的代碼。只要提到在代碼的某些部分在社區中使用了其他代碼。 如果你能幫我解決問題,我會很高興。我無法確定我的python梯形規則函數有什麼問題

謝謝

def summ(a, b, f, nextt): 
    total = f(a)/2.0 
    while a <= b: 
     total += f(a) 
     a = nextt(a) 
    total += f(b)/2.0 
    return total 

def Tr(fx, a, b, n): 
    h = float(b - a)/n 
    return summ(a, b, fx, lambda a:a + h) 

print(Tr(lambda x:x**9, 0.0, 10.0, 100000)) 
+4

http://stackoverflow.com/questions/588004/is-floating-point-math-broken –

+1

@ TadhgMcDonald-Jensen或者考慮到有效數字的模糊比較。 – brianpck

+2

@Silvering你確定嗎?答:你實際上得到了'1 000 100 000.7423575',因爲我得到了'10 001 000 007 423.574'和你發佈的確切代碼。和B:正確的結果應該是1e9 + 0.75?你怎麼會知道這事? –

回答

0

首先,您要添加的f(a)f(b)值的兩倍,給1.5倍的價值,而不是一半的價值你要。嘗試

def summ(a, b, f, nextt): 
    total = f(a)/2.0 
    a = nextt(a) 
    while a < b - 1e-9: 
     total += f(a) 
     a = nextt(a) 
    total += f(b)/2.0 
    return total 

這可以消除結果中額外的100,000。

其次,你應該每個矩形的寬度乘以總和,即h

def Tr(fx, a, b, n): 
    h = float(b - a)/n 
    return summ(a, b, fx, lambda a:a + h) * h 

否則,結果是你的榜樣10000倍太大

(與您發佈的結果。)

現在我得到的結果是1,000,000,000.7423584。你說它應該是1,000,000,000.75。差異可能是舍入誤差。也許你可以通過只使用內置SUM函數減少這樣的:

def Tr(fx, a, b, n): 
    h = float(b - a)/n 
    tot = sum(fx(a + h*i) for i in range(1, n)) 
    tot += (fx(a) + fx(b))/2. 
    return tot * h 

現在,我得到1,000,000,000.7500008,這是非常接近你的既定結果。

+0

謝謝你的幫助。這是很好的解釋。 – Silvering

0

這裏這應該工作:

def trapezoidal(a, b, next, f = lambda x:x**9): 
    h = float(b - a)/next 
    s = 0.0 
    s += f(a)/2.0 

    for i in range(1, next): 
     s += f(a + i * h) 

    s += f(b)/2.0 

    return s * h 
+0

謝謝你,但我需要的總和部分將在另一個功能,如我張貼在頂部。 – Silvering