1

Newton-Cotes メソッドを使用して特定の関数を統合する関数を Python で作成しようとしていますが、非常に奇妙な結果が返されます。正しい答えが得られる場合とそうでない場合があります (ほとんどの場合、-ve 境界で間違っています)。これは私のコードです。誰かが間違いを指摘できれば、それは大歓迎です:)

def integrate(function, a, b):
    coeff = [7,32,12,32,7]
    result = 0
    for i in range(0,len(coeff)):
        x = a + (i*(b-a))/(len(coeff)-1)
        result += coeff[i]*eval(function)
        print eval(function)
    result = result*((b-a)/90.)
    return result

私が従ってきたニュートン・コートの式は、ウィキペディアからのものです。

例:

print integrate("x**3-4*x+9", -7, 7)

戻り値:-38実際の答えが126

4

2 に答える 2

3

Python 2 では、整数除算のデフォルトの動作が切り捨てであることを忘れているために、不思議な数学の動作が発生することがよくあります。print x, eval(function)ループ内に追加:

>>> integrate("x**2+4", 0, 5)
0 4
1 5
2 8
3 13
5 29
50.166666666666664

しかし

>>> integrate("x**2+4", 0., 5.)
0.0 4.0
1.25 5.5625
2.5 10.25
3.75 18.0625
5.0 29.0
61.666666666666664

最初のものは評価点が間違っていることに注意してください。from __future__ import divisionそして、または 'a = 1.0*a;を追加した後。b = 1.0*b` を先頭に:

>>> integrate("x**2+4", 0, 5)
0.0 4.0
1.25 5.5625
2.5 10.25
3.75 18.0625
5.0 29.0
61.666666666666664

またはあなたの例のために:

>>> integrate("x**3-4*x+9", -7, 7)
-7.0 -306.0
-3.5 -19.875
0.0 9.0
3.5 37.875
7.0 324.0
126.0

これevalは設計上の選択としては不適切ですが、バグの原因ではありません。

于 2012-10-20T09:49:29.010 に答える
0

@DSM が指摘するように、機能するコードを次に示します。問題は、統合の境界を制限する整数の定義にあります。「func()」を統合します。

#! /usr/bin/python

def integrate(function, a, b):
    coeff = [7,32,12,32,7]
    result = 0
    for i in range(0,len(coeff)):
        x = a + (i*(b-a))/(len(coeff)-1)
        result += coeff[i]*function(x)
        #print function(x)
    result = result*((b-a)/90.)
    return result

def func(x):
    return x**3-4*x+9

print integrate(func,-7.0,7.0)

私のコンピューターでは126になります。

于 2012-10-20T09:46:29.107 に答える