这是我正在努力解决的家庭作业:
上一个问题的近似积分方法的进一步改进是将f(x)曲线下的面积划分为n个等间距的梯形。
基于这个想法,可以导出以下公式来近似积分:
!(https://www.dropbox.com/s/q84mx8r5ml1q7n1/Screenshot%202017-10-01%2016.09.32.png?dl=0)!
其中h是梯形的宽度
h=(b−a)/n
和xi=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))
答案 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