4

Python 2.7.2 で台形規則を実装しようとしています。私は次の関数を書きました:

def trapezoidal(f, a, b, n):
    h = float(b - a) / n
    s = 0.0
    s += h * f(a)
    for i in range(1, n):
        s += 2.0 * h * f(a + i*h)
    s += h * f(b)
    return s

ただし、 f(lambda x:x**2, 5, 10, 100) は 583.333 を返すため (291.667 を返すはずです)、明らかに私のスクリプトに問題があります。私はそれを見つけることはできません。

4

2 に答える 2

7

あなたは2倍離れています。実際、数学の授業で教えられている台形規則は、次のような増分を使用します。

s += h * (f(a + i*h) + f(a + (i-1)*h))/2.0

(f(a + i*h) + f(a + (i-1)*h))/2.0グリッド上の隣接する 2 つのポイントで関数の高さを平均化しています。

隣接する 2 つの台形ごとに共通のエッジがあるため、上記の式では、必要に応じて関数を 2 回評価する必要があります。

より効率的な実装 (投稿したものに近い) は、次の隣接する反復から共通の用語を組み合わせますfor-loop

f(a + i*h)/2.0 + f(a + i*h)/2.0 =  f(a + i*h) 

到着する:

def trapezoidal(f, a, b, n):
    h = float(b - a) / n
    s = 0.0
    s += f(a)/2.0
    for i in range(1, n):
        s += f(a + i*h)
    s += f(b)/2.0
    return s * h

print( trapezoidal(lambda x:x**2, 5, 10, 100))

利回り

291.66875
于 2014-01-15T19:39:24.077 に答える
4
于 2014-01-15T19:45:30.717 に答える