我试图在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
答案 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.希望有所帮助。