2016-11-03 38 views
1

我有一段代碼,用於在腳本中使用梯形法則通過將誤差擬合到多項式來查找數值積分中的誤差。這部分代碼拋出一個浮點除以零錯誤,我不明白爲什麼或如何解決它。識別並修復浮點除以零錯誤(Python)

有人可以幫助我找到答案嗎?

def trap(f,a,b,dx,exact): 
    N = int(numpy.round(float(b-a)/dx)) 
    w=(b-a)/N 
    sum = f(a)/2.0 + f(b)/2.0 
    for i in range(1,N): 
     sum += f(a+i*w) 
    area = sum * w 
    errorf = exact-area 
    # If the error crosses 0, a polynomial approximation 
    # to the absolute value will go crazy. 
    return errorf 

該替代方法將引發同樣的錯誤

# alternate way to handle dx not a divisor of b-a 
def alt_trap(f,a,b,dx,exact): 
    N = int(numpy.floor(float(b-a)/dx)) 
    sum = f(a)/2.0 + f(a+N*dx)/2.0 
    for i in range(1,N): 
     sum+= f(a+i*dx) 
    area = sum*dx 
    # now add one trapezoid between a+Ndx and b 
    area += 1/2*(b-(a+N*dx))*(f(b)+f(a+N*dx)) 
    errorf = exact-area 
    return errorf 
+0

'如果DX == 0:dx = 1e-8' ...可能做你想做的事......基本上你不能分成零,所以你必須定義你在這種情況下會發生什麼...... –

+0

哦哇,這很明顯,現在你指出來。謝謝! – Errata

回答

1

dx是唯一可能的參數,可以是0,並拋出ZeroDivisionError。 您可以捕捉異常並決定如何處理或修復輸入 - 取決於您的邏輯。

爲了提供一個默認值只需要添加:

dx = dx or 0.0000001 # 0 is false and python is awesome to support this syntax 

,如果你想嘗試和捕獲異常(多問了原諒,然後許可)

import sys # At the top 
... 
try: 
    N = int(numpy.floor(float(b-a)/dx)) 
except ZeroDivisionError, e: 
    print a, b, dx 
    N = sys.maxint