python的辛普森规则

时间:2019-04-20 04:57:09

标签: python python-3.x

对于我的数值课程,我必须使用辛普森规则近似列出下面列出的三个不同函数的积分。...我的代码运行,但是没有给我正确的近似值,我也不知道为什么。 ...

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)

2 个答案:

答案 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)