使用scipy进行样本的离散积分

9

我正在尝试从labview迁移到python。

在labview中,有一个名为“Integral x(t) VI”的函数,它将一组样本作为输入,执行样本的离散积分,并根据Simpsons规则返回一系列值(曲线下的面积)。

我尝试在scipy中找到等效的函数,例如scipy.integrate.simps,但这些函数返回一组样本的总积分,作为一个浮点数。

如何获得集成值列表,而不是集成后的值之和?

我是不是只是从错误的角度考虑这个问题?

2个回答

10

我认为你可能有些不正确地使用了scipy.integrate.simps。由scipy.integrate.simps返回的面积是y(传递的第一个参数)下的总面积。第二个参数是可选的,并且是x轴的样本值(每个y值的实际x值)。例如:

>>> import numpy as np
>>> import scipy
>>> a=np.array([1,1,1,1,1])
>>> scipy.integrate.simps(a)
4.0
>>> scipy.integrate.simps(a,np.array([0,10,20,30,40]))
40.0

我认为你想要计算在不同限制下相同曲线下的面积?要做到这一点,你需要传递你想要的曲线部分,像这样:

>>> a=np.array([0,1,1,1,1,10,10,10,10,0])
>>> scipy.integrate.simps(a)
44.916666666666671
>>> scipy.integrate.simps(a[:5])
3.6666666666666665
>>> scipy.integrate.simps(a[5:])
36.666666666666664

是的,这就是我想要实现的。我猜我期望使用数学的魔力会有一种更“快速”的方法。另外,你将Python列表强制转换为numpy.array的原因是什么? - user1425750
如果你有一堆起点和终点,你可以这样做:[scipy.integrate.simps(y[s:e]) for s,e in [(s1,e1),(s2,e2),...etc.]]。使用numpy数组可能更快,在某些函数中它们是必要的,特别是在使用特殊轴特性等时。但在此示例中,它适用于普通列表 :) - fraxel
谢谢!我并不是完全不懂循环,但还是感谢你的提示。至于numpy数组,和我想的一样。 - user1425750

4

在SciPy中只有一种累积积分的方法,即scipy.integrate.cumtrapz(),只要您不需要特别使用辛普森规则或其他方法,它就能满足您的需求。如果需要,您可以按建议自己编写循环。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接