2016-11-03 14 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

'если дх == 0: dx = 1e-8' ... может делать то, что вы хотите ... в основном вы не можете делить на ноль, поэтому вы должны определить, что вы ожидаете в этом случае ... –

+0

Ого, это было очевидно теперь, когда вы указал на это. Спасибо! – Errata

ответ

1

дх является единственно возможным параметром, который может быть 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