cumtrapz 的积分偏移量(python/scipy)

Posted

技术标签:

【中文标题】cumtrapz 的积分偏移量(python/scipy)【英文标题】:Integration offset with cumtrapz (python/scipy) 【发布时间】:2021-03-18 22:47:43 【问题描述】:

我希望能够在 Python 中对数组进行数值微分和积分。我知道在 numpy 和 scipy 中有这方面的功能。但是,在集成时,我注意到偏移量。

例如,我从一个初始函数 y=cos(x) 开始。

image, y = cos(x)

然后我使用 numpy.gradient 求导数。它按预期工作(绘图为 -sin(x)):

image, dydx = d/dx(cos(x))

当我将导数与 scipy.cumtrapz 集成时,我希望得到初始函数。但是,有一些偏移量。我意识到 -sin(x) 的积分是 cos(x)+constant,那么 cumtrapz 数值积分不考虑这个常数吗?

image, y = int(dydx)

我担心的是,如果您有一些任意信号,并且不知道初始/边界条件,那么 cumtrapz 是否会忽略 +constant 项? cumtrapz 有解决方案吗?

我使用的代码如下:

import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate

x = np.linspace(-2*np.pi, 2*np.pi,100)

y = np.cos(x) #starting function 
dydx = np.gradient(y, x) #derivative of function 
dydx_int = integrate.cumtrapz(dydx, x, initial = 0) #integral of derivative 

fig, ax  = plt.subplots()
ax.plot(x, y)
ax.plot(x, dydx)
ax.plot(x, dydx_int)
ax.legend(['y = cos(x)', 'dydx = d/dx(cos(x))', 'y = int(dydx)'])
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()

【问题讨论】:

【参考方案1】:

cumtrapz()cumsum() 和类似的人按照他们所说的去做:对输入数组进行累积求和。如果求和数组与输入数组 (dydx) 一样以 0 开头,则求和数组的第一个元素也为零。 要在您的代码中修复它,您应该将偏移量添加到累积总和中: dydx_int = dydx_int + y[0]

但是对于关于积分初始条件的一般问题:

我担心的是,如果您有一些任意信号,并且不知道初始/边界条件,那么 cumtrapz 是否会忽略 +constant 项? cumtrapz 有解决方案吗?

好吧,如果您不知道初始/边界条件,cumtrapz 也不会知道...您的问题不太合理..

【讨论】:

以上是关于cumtrapz 的积分偏移量(python/scipy)的主要内容,如果未能解决你的问题,请参考以下文章

获取积分向量值

Matlab数值数据的整合

什么是偏移量 怎么计算

java中的偏移量和偏移地址是啥

未定义的偏移量错误,但偏移量不是未定义的

如何将 utf-8 字节偏移量转换为 utf-8 字符偏移量