在python中使用Newton-Cotes方法进行集成

时间:2012-10-20 09:26:46

标签: python algorithm

我试图在python中编写一个函数,它将使用Newton-Cotes方法集成一个给定的函数,并返回一些非常奇怪的结果,它有时会给出正确的答案而其他的不是(大多数错误的-ve bounds) 。这是我的代码,如果有人能指出任何错误,将不胜感激:)

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

我一直关注的牛顿cotes公式来自wikipedia

示例:

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

当实际答案为-38

时,返回126

2 个答案:

答案 0 :(得分:2)

神秘的数学行为通常是忘记在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是一个糟糕的设计选择,但它不是bug的来源。

答案 1 :(得分: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.希望有所帮助。