我无法确定我的python梯形规则函数有什么问题

时间:2016-12-15 17:11:04

标签: python

我无法理解为什么函数给我一个不正确的结果1,000,100,000.7423575,而不是原来的结果应该是1,000,000,000.75。 工作已经给了我们,我们需要实现Python的功能,高阶函数并构建我的代码。只需提一下,代码的某些部分在社区中使用了其他代码。 如果你能帮我解决问题,我会很高兴。

谢谢

def summ(a, b, f, nextt):
    total = f(a) / 2.0
    while a <= b:
        total += f(a)
        a = nextt(a)
    total += f(b) / 2.0   
    return total

def Tr(fx, a, b, n):
    h = float(b - a) / n
    return summ(a, b, fx, lambda a:a + h)

print(Tr(lambda x:x**9, 0.0, 10.0, 100000)) 

2 个答案:

答案 0 :(得分:0)

这应该有效:

def trapezoidal(a, b, next, f = lambda x:x**9):
     h = float(b - a) / next
     s = 0.0
     s += f(a)/2.0

     for i in range(1, next):
         s += f(a + i * h)

     s += f(b)/2.0

     return s * h

答案 1 :(得分:0)

首先,您要添加f(a)f(b)两次的值,给出值的1.5倍,而不是您想要的值的一半。尝试

def summ(a, b, f, nextt):
    total = f(a) / 2.0
    a = nextt(a)
    while a < b - 1e-9:
        total += f(a)
        a = nextt(a)
    total += f(b) / 2.0   
    return total

这可以消除你的结果中额外的100,000。

其次,您应该将总和乘以每个矩形的宽度,即h

def Tr(fx, a, b, n):
    h = float(b - a) / n
    return summ(a, b, fx, lambda a:a + h) * h

否则,您的示例中的结果会超过10000倍(与您发布的结果相反。)

现在我得到的结果是1,000,000,000.7423584。你说它应该是1,000,000,000.75。差异可能是舍入错误。也许你可以通过使用内置和函数来减少这个:

def Tr(fx, a, b, n):
    h = float(b - a) / n
    tot = sum(fx(a + h*i) for i in range(1, n))
    tot += (fx(a) + fx(b)) / 2.
    return tot * h

现在我得到1,000,000,000.7500008,这与你陈述的结果非常接近。