【问题标题】:Using scipy to perform discrete integration of the sample使用 scipy 对样本进行离散积分
【发布时间】:2012-06-04 13:46:48
【问题描述】:

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

在labview中有一个函数“Integral x(t) VI”,它将一组样本作为输入,执行样本的离散积分并根据辛普森规则返回一个值列表(曲线下的区域) .

我试图在 scipy 中找到一个等效的函数,例如scipy.integrate.simps,但这些函数以浮点数形式返回整个样本集的总积分

如何获得综合值列表而不是综合值的总和?

我只是在错误地看待问题吗?

【问题讨论】:

    标签: python integration scipy integral


    【解决方案1】:

    我认为您可能使用 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 数组可能会更快,并且对于某些函数,它们是必需的,特别是在使用特殊轴功能等时。但在这个例子中,它适用于常规列表:)
    • 谢谢!我不是在海上,我不能使用循环,但谢谢你的小费。 numpy 数组的事情和我想的一样。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-12-16
      • 2015-02-20
      • 2012-04-10
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 2019-05-03
      相关资源
      最近更新 更多