对于我的数值课程,我必须使用辛普森规则近似列出下面列出的三个不同函数的积分。...我的代码运行,但是没有给我正确的近似值,我也不知道为什么。 ...
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)
答案 0 :(得分:0)
在使用Python 2.x的情况下,问题可能是由变量类型引起的。表达式h = (b-a)/n
右侧的所有变量均为int
,因此解释器假定h
也必须为int
。该问题可以通过类型转换来解决
a = float(a)
b = float(b)
在该表达式之前插入。
上述行为特定于Python 2,并且在这种情况下,假设float
在Python 3中已得到修复。有关Python中类型转换的更多示例,请参见here。
未经转换的输出:
0.0
0
-1.36541969235
具有转换的输出:
0.208501009808
0.577327327327
-1.36541969235
答案 1 :(得分:0)
我相信问题是您的wrapped
通话的上限已被减1。该上限从未达到,因此应该超出您想要的上限。我包括一个额外的测试用例range()
,为此我知道了正确的答案(〜1):
sin(x)
输出
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)