python numpy.convolve解决卷积积分,限制从0到t而不是-t到t

Fau*_*ier 5 python numpy numeric

我有一个类型的卷积积分:

卷积积分\ int_0 ^ t

为了在数字上解决这个问题,我想用numpy.convolve().现在,正如您在在线帮助中看到的那样,卷积从-infinity到+ infinity正式完成,意味着数组完全相互移动以进行评估 - 这不是我需要的.我显然需要确保选择卷积的正确部分 - 你能否确认这是正确的方法,或者告诉我如何正确地做(也许更重要)为什么?

res = np.convolve(J_t, dF, mode="full")[:len(dF)]
Run Code Online (Sandbox Code Playgroud)

J_t是一个分析函数,我可以根据需要评估多个点,dF是测量数据的衍生物.对于我选择的这种尝试,len(J_t) = len(dF)因为根据我的理解,我不需要更多.

谢谢你的想法,一如既往,感谢你的帮助!


背景信息(对于那些可能感兴趣的人)

这些类型的积分可用于评估物体的粘弹性行为(或电压变化期间电路的响应,如果您对此主题更熟悉).对于粘弹性,J(t)是蠕变柔量函数,F(t)可以是随时间推移的偏应变,然后该积分将产生偏应力.如果你现在有例如以下形式的J(t):

J_t = lambda p, t: p[0] + p[1]*N.exp(-t/p[2])
Run Code Online (Sandbox Code Playgroud)

p = [J_elastic, J_viscous, tau]这将是"著名的" 标准线性固体.积分限制是测量的开始t_0 = 0和感兴趣的时刻t.

Jai*_*ime 5

为了正确起见,我选择了以下两个功能:

a(t) = t
b(t) = t**2
Run Code Online (Sandbox Code Playgroud)

很容易进行数学运算,并发现您所定义的“卷积”具有以下值:

c(t) = t**4 / 12
Run Code Online (Sandbox Code Playgroud)

因此,让我们尝试一下:

>>> delta = 0.001
>>> t = np.arange(1000) * delta
>>> a = t
>>> b = t**2
>>> c = np.convolve(a, b) * delta
>>> d = t**4 / 12
>>> plt.plot(np.arange(len(c)) * delta, c)
[<matplotlib.lines.Line2D object at 0x00000000025C37B8>]
>>> plt.plot(t[::50], d[::50], 'o')
[<matplotlib.lines.Line2D object at 0x000000000637AB38>]
>>> plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

因此,通过执行上述操作,如果ab都具有n元素,则可以在的前n几个元素中获得正确的卷积值c

不知道下面的解释是否有意义,但是可以理解...如果您认为卷积是沿y轴镜像功能之一,然后沿x轴滑动并计算乘积的积分,每个点都很容易看到,因为在numpy定义区域之外,它们就像用零填充一样,因此您实际上是在设置从0到t的积分间隔,​​因为第一个函数是零以下的零,第二个函数是零。在t上方为零,因为它最初在零以下为零,但已被镜像并向右移动t。