scipy.integrate.trapz和不连续的功能

时间:2016-07-05 14:01:28

标签: python scipy integral

函数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>

1 个答案:

答案 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值是左右极限,是梯形法则准确性的显着提升。