带 scipy.trapz 的数组的二重积分(无解析函数)

Double integral over arrays w/ scipy.trapz (no analytic function)

我必须对两个数组(f(x) 和 g(x+r))和函数 wfg(r) = triangular function 进行积分,积分如下:

f(x) 和 g(x) 的解析形式未知。

我最初的尝试是使用 scipy.trapz 对 f(x)g(x+r) w.r.t dx 求积分,然后将此结果乘以 wfg(r) [=32 的积分=]博士:

for ri in r:
    if np.abs(ri) < l:
        term1 = lambda ri, l : (1 - np.abs(ri)/l) 
        tmp1 += integrate.quad(term1, r[-1],r[0] ,args = (l))[0]
    else:
        tmp1 += 0

return np.abs(tmp1 * integrate.trapz(gpeaks1*gpeaks2_r,x_fg))

其中 wfg(r) = tmp1f(x) = gpeaks1g(x+r) = gpeaks2 的积分。

但这在数学上似乎不正确。我该怎么做?

好的,所以我的理解是这样的(如果我错了请纠正我):

你有什么:

  • 数组 x_fg,形状为 (x_size, 1)
  • 数组 r_fg,形状为 (1, r_size)
  • 数组 gpeaks1[i] = f(x_fg[i]),形状为 (x_size, 1)
  • 数组 gpeaks2[i, j] = g(x_fg[i] + r_fg[j]),形状为 (x_size, r_size)

作为中间结果,您还有:

  • 数组 h[j] = ∫_i gpeaks1[i] * gpeaks2[i, j],形状 (1, r_size)
    • h = integrate.trapz(gpeaks1 * gpeaks2, x_fg, axis=-2)
    • 计算

关于 w_fg:按照您的代码,w_fg 是一个 数字 ,而不是 数组 . 但是你的问题似乎表明 w_fg 是一个权重函数,因此应该用数组表示。

所以,我的第一个问题是 "what is w_fg?"

假设:

  • 数组 w_fg[j] = w(r[j]),形状为 (1, r_size)

我的第二个问题是"what do you want to calculate?"

如果是 ∫_j w_fg[j] h[j] 则只需 integrate.trapz(w_fg * h).


上一个答案,实际上并没有回答问题

因此,给定两个表示函数的一维数组 fg, 你想要数组 h 代表 h(r)=∫f(x)g(x+r)dx.

你完全可以用 scipy.trapz 来做到这一点,但是形式的积分 使用 np.correlate 可以更容易地计算 h(r)=∫f(x)g(x+r)dx 或 scipy.

中的等效项

最有效的方法是使用 FFT。我现在没有时间写解释,但我稍后会添加一个。

我建议您阅读有关 convolutions and cross-correlations 的内容。