使用梯形法则定义积分(初学者)

时间:2014-12-06 22:00:36

标签: python

我的程序旨在使用n个梯形来定义两个数字(x1,x2)之间给定函数的积分。看来,我部门的自动评估程序给出了与我的不同的答案。问题是我不能在我的代码中发现任何错误......

def funct(x):
    val= -(1./6)*(x-1)*(x-2)*(x+2)*(x-4)
    return val


x1,x2,n=input()
Dx=float(x2-x1)/n
Sum=0
i=x1+Dx
while i<x2:
    val=funct(i)
    Sum+=val
    i+=Dx
Sum=2*Sum
val1=funct(x1)
val2=funct(x2)
S=(Dx/2)*(val1+val2+Sum)
print "%.3f" %S  

2 个答案:

答案 0 :(得分:1)

由于四舍五入问题,您的while周期始终包含x的最后一个值,请尝试使用精确整数算法

x0, x1 = -88.787529, 83.494648
n = 1942

dx = (x1-x0)/n
s = 0
i = 1
while i < n:

   # if we allow i == n, in the following row we'll have
   #   x0 + n*dx = x0 + n * (x1-x0) / n = x0 + x1 - x0 = x1
   # but we want to exclude the last term

   s = s + funct(x0+i*dx)
   i = i + 1
result = (s + funct(x0)/2.0 + funct(x1)/2.0)*dx

答案 1 :(得分:0)

我知道这可能是某种功课问题,但总的来说,不要重新发明轮子:

import numpy

def funct(x):
    return -(1./6)*(x-1)*(x-2)*(x+2)*(x-4)

x1, x2 = -88.787529, 83.494648
n = 1942
# n "panels", n+1 points
x = numpy.linspace(x1, x2, n+1)
y = funct(x)

result = numpy.trapz(y, x)
相关问题