与 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 也不会知道......你的问题不太有意义..
我希望能够在 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 也不会知道......你的问题不太有意义..