1

我试图在 python 中编写一个函数,该函数将使用 Newton-Cotes 方法集成给定的函数,并返回一些非常奇怪的结果,有时它会给出正确的答案而其他的则不会(大多与 -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

我一直遵循的牛顿科特公式来自wikipedia

例子:

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, or '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 回答