加速 scipy.nquad 计算多重积分
我试图计算这个函数:
这是多重积分的结果。
函数 F_A_、F_B_、F_C_、F_D_ 和 F_FPS_ 是截断的正态函数,包含在设置的间隔之间。我用 scipy.nquad 尝试过,但最终无法完成,因为它太慢了。
我的最后一步如下,其中我尝试将 Fs 视为正常函数(未截断)并调整积分的限制以获得我想要的。
%%time
muA, sigmaA = 303, 1
muB, sigmaB = 517, 2
muC, sigmaC = 1524, 1
muD, sigmaD = 1784, 2
muF, sigmaF = 30, 1
mu1 = muA
sigma1 = sigmaA
mu2 = muB
sigma2 = sigmaB
mu3 = muC
sigma3 = sigmaC
mu4 = muD
sigma4 = sigmaD
mu5 = muF
sigma5 = sigmaF
#overhead
factor = (sigma3*np.sqrt(2*np.pi))**(-1)*\
(sigma1*np.sqrt(2*np.pi))**(-1)*\
(sigma5*np.sqrt(2*np.pi))**(-1)*\
(sigma1*np.sqrt(2*np.pi))**(-1)*\
(sigma2*np.sqrt(2*np.pi))**(-1)*\
(sigma2*np.sqrt(2*np.pi))**(-1)*\
(sigma4*np.sqrt(2*np.pi))**(-1)*\
(sigma4*np.sqrt(2*np.pi))**(-1)*\
(sigma3*np.sqrt(2*np.pi))**(-1)
def pdfV(w, p, m, k, h, q, g, y, n, \
mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return \
np.exp(-0.5*((w-mu3)/sigma3)**2-0.5*((p-mu1)/sigma1)**2-0.5*((m-mu5)/sigma5)**2-0.5*((k-mu1)/sigma1)**2-0.5*((h-mu2)/sigma2)**2-0.5*((q+p-mu2)/sigma2)**2-0.5*((g+h-mu4)/sigma4)**2-0.5*((y/q+w-mu4)/sigma4)**2-0.5*((n/g+k-mu3)/sigma3)**2)
def lim1(p, m, k, h, q, g, y, n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [mu3 - sigma3, mu3 + sigma3]
def lim2(m, k, h, q, g, y, n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [mu1 - sigma1, mu1 + sigma1]
def lim3(k, h, q, g, y, n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [mu5 - sigma5, mu5 + sigma5]
def lim4(h, q, g, y, n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [mu1 - sigma1, mu1 + sigma1]
def lim5(q, g, y, n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [mu2 - sigma2, mu2 + sigma2]
def lim6(g, y, n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [mu2-mu1 - sigma2, mu2-mu1 + sigma2]
def lim7(y, n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [mu4-mu2 - sigma2, mu4-mu2 + sigma2]
def lim8(n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [(mu2-mu1)*(mu4-mu3) - sigma2, (mu2-mu1)*(mu4-mu3) + sigma2]
def lim9(mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [(mu4-mu2)*(mu3-mu1) - sigma2, (mu4-mu2)*(mu3-mu1) + sigma2]
options={'epsabs':0.01,'epsrel':0.01}
result = integrate.nquad(pdfV, [lim1, lim2, lim3, lim4, lim5, lim6, lim7, lim8, lim9], args=(muA, sigmaA, muB, sigmaB, muC, sigmaC, muD, sigmaD, muF, sigmaF), opts=options)
factor*result[0], result[1]
但我无法得到结果,因为算法没有到达终点,rs。
I trying to calculate this function:
Which is the result of multiples integrals.
Functions F_A_, F_B_, F_C_, F_D_ and F_FPS_ is a truncated normal function, contained between intervals seted. I tried it with scipy.nquad, but I can't get in the end because it's too slow.
My last step is this below, in which I tried to consider Fs as a normal functions (not truncated) and adjust the limits of integration to get what I want.
%%time
muA, sigmaA = 303, 1
muB, sigmaB = 517, 2
muC, sigmaC = 1524, 1
muD, sigmaD = 1784, 2
muF, sigmaF = 30, 1
mu1 = muA
sigma1 = sigmaA
mu2 = muB
sigma2 = sigmaB
mu3 = muC
sigma3 = sigmaC
mu4 = muD
sigma4 = sigmaD
mu5 = muF
sigma5 = sigmaF
#overhead
factor = (sigma3*np.sqrt(2*np.pi))**(-1)*\
(sigma1*np.sqrt(2*np.pi))**(-1)*\
(sigma5*np.sqrt(2*np.pi))**(-1)*\
(sigma1*np.sqrt(2*np.pi))**(-1)*\
(sigma2*np.sqrt(2*np.pi))**(-1)*\
(sigma2*np.sqrt(2*np.pi))**(-1)*\
(sigma4*np.sqrt(2*np.pi))**(-1)*\
(sigma4*np.sqrt(2*np.pi))**(-1)*\
(sigma3*np.sqrt(2*np.pi))**(-1)
def pdfV(w, p, m, k, h, q, g, y, n, \
mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return \
np.exp(-0.5*((w-mu3)/sigma3)**2-0.5*((p-mu1)/sigma1)**2-0.5*((m-mu5)/sigma5)**2-0.5*((k-mu1)/sigma1)**2-0.5*((h-mu2)/sigma2)**2-0.5*((q+p-mu2)/sigma2)**2-0.5*((g+h-mu4)/sigma4)**2-0.5*((y/q+w-mu4)/sigma4)**2-0.5*((n/g+k-mu3)/sigma3)**2)
def lim1(p, m, k, h, q, g, y, n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [mu3 - sigma3, mu3 + sigma3]
def lim2(m, k, h, q, g, y, n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [mu1 - sigma1, mu1 + sigma1]
def lim3(k, h, q, g, y, n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [mu5 - sigma5, mu5 + sigma5]
def lim4(h, q, g, y, n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [mu1 - sigma1, mu1 + sigma1]
def lim5(q, g, y, n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [mu2 - sigma2, mu2 + sigma2]
def lim6(g, y, n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [mu2-mu1 - sigma2, mu2-mu1 + sigma2]
def lim7(y, n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [mu4-mu2 - sigma2, mu4-mu2 + sigma2]
def lim8(n, mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [(mu2-mu1)*(mu4-mu3) - sigma2, (mu2-mu1)*(mu4-mu3) + sigma2]
def lim9(mu1, sigma1, mu2, sigma2, mu3, sigma3, mu4, sigma4, mu5, sigma5):
return [(mu4-mu2)*(mu3-mu1) - sigma2, (mu4-mu2)*(mu3-mu1) + sigma2]
options={'epsabs':0.01,'epsrel':0.01}
result = integrate.nquad(pdfV, [lim1, lim2, lim3, lim4, lim5, lim6, lim7, lim8, lim9], args=(muA, sigmaA, muB, sigmaB, muC, sigmaC, muD, sigmaD, muF, sigmaF), opts=options)
factor*result[0], result[1]
But I can't get the result because the algorithm didn't reach the end, rs.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论