与 cumtrapz 的集成偏移量 (python/scipy)

Integration offset with cumtrapz (python/scipy)

我希望能够在 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)+ 常数,那么 cumtrapz 数值积分是否不考虑常数?

image, y = int(dydx)

我担心的是,如果您有一些任意信号,并且不知道 initial/boundary 条件,+常数项是否会被 cumtrapz 计算在内?有 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()

cumtrapz()cumsum() 和类似的做他们声明的事情:累加输入数组。如果求和数组与输入数组一样以 0 开头 (dydx),则求和数组中的第一个元素也为零。
要在您的代码中修复它,您应该将偏移量添加到累计和: dydx_int = dydx_int + y[0]

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

My concern is, if you have some arbitrary signal, and did not know the initial/boundary conditions, will the +constant term be unaccounted for with cumtrapz? Is there a solution for this with cumtrapz?

好吧,如果你不知道 initial/boundry 条件,cumtrapz 也不会知道......你的问题不太有意义..