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