函数scipy.integrate.trapz
使用 Newton-Cotes公式的1阶,如scipy文档中所述。但是,在推导这个公式时,通常假定
但是,我尝试通过调用
来估算f:[0,2] --> [0,2]
定义的函数f(x) = 0 if x < 1 else 2
的积分。
scipy.integrate.trapz([0, 0, 2, 2], [0, 1, 1, 2])
并获得了正确的结果(2.0
)。在上面的电话中,
这个“hack”能否以示例中的方式安全使用?
(对于每个不连续点x
,在点列表中插入x
两次,并将被积函数的左右极限插入值列表中的相应位置。)< / p>
答案 0 :(得分:1)
在trapz
中重复x值的效果与在该值上分割积分的间隔相同,并将trapz
分别应用于每个部分:
from scipy.integrate import trapz
trapz([0, 0, 2, 2], [0, 1, 1, 2])
trapz([0, 0], [0, 1]) + trapz([2, 2], [1, 2])
两个结果都是一样的。事实上,集成像你这样的分段函数的最佳方法是在不连续处分割积分间隔,因为那时你正在集成两个连续函数。你的方法是正确的。
从某种意义上说,你的“黑客”并不是必需的。梯形规则收敛于任何黎曼可积函数的积分的正确值,其涵盖所有分段连续函数等。教科书提供连续功能的证明只是教科书作者的选择,希望有一个更简单的证明。可以证明更一般的定理。
也就是说,对于在实践中出现的任何函数,梯形规则的输出将接近其积分,条件是x值形成积分区间的足够精细的分区。例如,如果采用足够多的点,均匀间隔的点将始终有效。
然而,在实践中,人们关注的是收敛速度,当函数具有不连续性时,收敛速度明显更差。从这个实际的角度来看,包括每个不连续点两次,y值是左右极限,是梯形法则准确性的显着提升。