Simpson规则与python

问题描述 投票:0回答:2

对于我的数字课程,我必须使用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)
python python-3.x
2个回答
0
投票

我相信问题是你的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
> 

0
投票

在使用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
© www.soinside.com 2019 - 2024. All rights reserved.