我正在尝试用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我一直遵循的牛顿柯特斯公式来自wikipedia。
示例:
print integrate("x**3-4*x+9", -7, 7)返回:当实际答案为126时返回-38
发布于 2012-10-20 17:49:29
神秘的数学行为通常是因为忘记了在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.0eval是一个糟糕的设计选择,但它不是bug的根源。
发布于 2012-10-20 17:46:29
这里有一些有效的代码,正如@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。希望这能有所帮助。
https://stackoverflow.com/questions/12987072
复制相似问题