通过梯形规则集成函数 - Python

时间:2017-10-01 21:15:56

标签: python loops

这是我正在努力解决的家庭作业:

  

上一个问题的近似积分方法的进一步改进是将f(x)曲线下的面积划分为n个等间距的梯形。

     

基于这个想法,可以导出以下公式来近似积分:

     

!(https://www.dropbox.com/s/q84mx8r5ml1q7n1/Screenshot%202017-10-01%2016.09.32.png?dl=0)!

     

其中h是梯形的宽度h=(b−a)/nxi=a+ih,i∈0,...,n,是梯形边的坐标。上图显示了梯形规则的概念。

     

在Python函数trapezint( f,a,b,n )中实现此公式。您可能需要检查并查看是否b> a,否则你可能需要交换变量。

     

例如,trapezint( math.sin,0,0.5*math.pi,10 )的结果应为0.9979(有一些数字错误)。 trapezint( abs,-1,1,10 )的结果应为2.0

这是我的代码,但它似乎没有返回正确的值 对于print ((trapezint( math.sin,0,0.5*math.pi,10)))
当我想要获得0.9979时,我得到0.012286334153465965 对于print (trapezint(abs, -1, 1, 10))
当我想要获得1.0时,我得到0.18000000000000002。

import math
def trapezint(f,a,b,n):

    g = 0
    if b>a:
        h = (b-a)/float(n)
        for i in range (0,n):
            k = 0.5*h*(f(a+i*h) + f(a + (i+1)*h))
            g = g + k
            return g
    else:
        a,b=b,a
        h = (b-a)/float(n)
        for i in range(0,n):
            k = 0.5*h*(f(a + i*h) + f(a + (i + 1)*h))
            g = g + k
            return g

print ((trapezint( math.sin,0,0.5*math.pi,10)))
print (trapezint(abs, -1, 1, 10))

2 个答案:

答案 0 :(得分:1)

基本上,你的return g语句是缩进的,不应该是。

此外,我删除了您的重复代码,因此它会遵循“干”“不要重复自己”的原则,这可以防止错误,并使代码简化并更易读。

import math
def trapezint(f, a, b, n):

    g = 0
    if b > a:
        h = (b-a)/float(n)
    else:
        h = (a-b)/float(n)

    for i in range (0, n):
        k = 0.5 * h * ( f(a + i*h) + f(a + (i+1)*h) )
        g = g + k

    return g


print ( trapezint( math.sin, 0, 0.5*math.pi, 10) )
print ( trapezint(abs, -1, 1, 10) )
  

0.9979429863543573
  1.0000000000000002

答案 1 :(得分:1)

这种变化降低了分支的复杂性并减少了操作次数。最后一步的求和减少为阵列上的单个操作。

from math import pi, sin
def trapezoid(f, a, b, n):
    if b < a:
        a,b = b, a
    h = (b - a)/float(n)
    g = [(0.5 * h * (f(a + (i * h)) + f(a  + ((i + 1) * h)))) for i in range(0, n)]
    return sum(g)

assert trapezoid(sin, 0, 0.5*pi, 10) == 0.9979429863543573
assert trapezoid(abs, -1, 1, 10) == 1.0000000000000002
相关问题