带 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) = tmp1
、f(x) = gpeaks1
和 g(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)
.
上一个答案,实际上并没有回答问题
因此,给定两个表示函数的一维数组 f
和 g
,
你想要数组 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 的内容。
我必须对两个数组(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) = tmp1
、f(x) = gpeaks1
和 g(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)
.
上一个答案,实际上并没有回答问题
因此,给定两个表示函数的一维数组 f
和 g
,
你想要数组 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 的内容。