对于我的数字课程,我必须使用simpsons规则来近似下面列出的三个不同函数的积分....我的代码运行但它没有给我正确的近似值,我不知道为什么....
import math
def F(x):
c = x * math.log(x)
return c
def G(x):
g = 2 / (x**2 + 4)
return g
def H(x):
h = x**2 * math.cos(x)
return h
def simpsonRule(f, a, b, n):
h = (b-a)/n
k = 0
z = 0
for i in range(1, (n//2) - 1):
k += 2*f(a+(2*i*h))
for i in range(1, (n//2)):
z += 4*f(a+((2*i)-1)*h)
return (h*(f(a) + k + z + f(b))) / 3
AA = simpsonRule(F, 1, 2, 4)
CC = simpsonRule(G, 0, 2, 6)
DD = simpsonRule(H, 0, math.pi, 6)
print(AA)
print(CC)
print(DD)
我相信问题是你的range()
呼叫的上限被关闭1.上限永远不会达到,所以它应该超出你想要的一个。我已经包含了一个额外的测试用例sin(x)
,我知道正确答案(~1):
import math
def E(x):
return math.sin(x)
def F(x):
return x * math.log(x)
def G(x):
return 2 / (x**2 + 4)
def H(x):
return x**2 * math.cos(x)
def simpsonRule(f, a, b, n):
h = (b - a) / n
k = 0
z = 0
for i in range(1, n // 2):
k += 2 * f(a + 2 * i * h)
for i in range(1, n // 2 + 1):
z += 4 * f(a + (2 * i - 1) * h)
return h * (f(a) + k + z + f(b)) / 3.0
AA = simpsonRule(F, 1, 2, 4)
CC = simpsonRule(G, 0, 2, 6)
DD = simpsonRule(H, 0, math.pi, 6)
EE = simpsonRule(E, 0, math.pi / 2, 100)
print(AA)
print(CC)
print(DD)
print(EE)
OUTPUT
> python3 test.py
0.6363098297969493
0.7853979452340107
-6.274868388453119
1.0000000003382359
>
在使用Python 2.x的情况下,问题可能是由变量类型引起的。在h = (b-a)/n
的右侧的所有变量都是int
,因此解释者假设h
也必须是int
。问题可以通过类型转换来解决
a = float(a)
b = float(b)
在该表达式之前插入。
上面提到的行为是特定于Python 2的,并且已经在Python 3中修复,假设在这种情况下使用float
。有关Python中的类型转换,请参阅here更多示例。
没有转换的输出:
0.0
0
-1.36541969235
带转换的输出:
0.208501009808
0.577327327327
-1.36541969235