Python 使用scipy.integrate.nqad的二重积分解不';t匹配integrate.dblquad
下面代码中的第一个函数使用与Python 使用scipy.integrate.nqad的二重积分解不';t匹配integrate.dblquad,python,math,scipy,integral,mismatch,Python,Math,Scipy,Integral,Mismatch,下面代码中的第一个函数使用与scipy.integrate.dblquad的二重积分来计算copula密度函数c的微分熵c*np.log(c),该函数有一个依赖参数,theta,通常为正 下面代码中的第二个函数尝试解决与上面相同的问题,但使用多重积分解算器scipy.integrate.nqad from scipy import integrate import numpy as np def dblquad_(theta): "Double integration&qu
scipy.integrate.dblquad
的二重积分来计算copula密度函数c
的微分熵c*np.log(c)
,该函数有一个依赖参数,theta
,通常为正
下面代码中的第二个函数尝试解决与上面相同的问题,但使用多重积分解算器scipy.integrate.nqad
from scipy import integrate
import numpy as np
def dblquad_(theta):
"Double integration"
c = lambda v, u: ((1+theta)*(u*v)**(-1-theta)) * (u**(-theta)+v**(-theta)-1)**(-1/theta-2)
return -integrate.dblquad(
lambda u,v: c(v,u)*np.log(c(v,u)),
0, 1, lambda u: 0, lambda u: 1
)[0]
def nquad_(n,theta):
"Multiple integration"
c = lambda *us: ((1+theta)*np.prod(us)**(-1-theta)) * (np.sum(np.power(us,-theta))-1)**(-1/theta-2)
return -integrate.nquad(
func = lambda *us : c(*us)*np.log(c(*us)),
ranges = [(0,1) for i in range(n)],
args = (theta,)
)[0]
n=2
theta = 1
print(dblquad_(theta))
print(nquad_(n,theta))
基于
dblquad
的函数给出的答案为-0.7127
,而nqad
给出的答案为-0.5823
,并且明显需要更长的时间。为什么即使我已将两者设置为解决n=2
维问题,解决方案也会不同?使用您提供的n
和theta
值,您的代码输出为:
-0.1931471805597395
0.17055845832017144,
不是-0.7127
和-0.5823
第一个值(-0.1931471805597395
)是正确的(您可以自己检查)
nqad\uu
中的问题在于theta
参数的处理。感谢@mikuszefski提供的解释;为了清晰起见,我将其复制到这里:
nqad
根据需要将lambda
传递给函数。lambda是
以这样一种方式编程,它可以接受任意数量的
争论,所以它很乐意接受它并把它放在权力列表中
和总数。因此您不会得到,例如,1/u**t+1/v**t-1
1/u**t+1/v**t+1/t**t-1
。函数调用与
预期功能用途。如果您改为编写us[0]**()+us[1]**()-1
,它会工作
以下是修改后的代码:
from scipy import integrate
import numpy as np
def dblquad_(theta):
"Double integration"
c = lambda v, u: ((1+theta)*(u*v)**(-1-theta)) * (u**(-theta)+v**(-theta)-1)**(-1/theta-2)
return -integrate.dblquad(
lambda u,v: c(v,u)*np.log(c(v,u)),
0, 1, lambda u: 0, lambda u: 1
)[0]
def nquad_(n,theta):
"Multiple integration"
c = lambda *us: ((1+theta)*np.prod((us[0], us[1]))**(-1-theta)) * (np.sum(np.power((us[0], us[1]),-theta))-1)**(-1/theta-2)
return -integrate.nquad(
func = lambda *us : c(*us)*np.log(c(*us)),
ranges = [(0,1) for i in range(n)],
args=(theta,)
)[0]
n=2
theta = 1
print(dblquad_(theta))
print(nquad_(n,theta))
输出:
-0.1931471805597395
-0.1931471805597395
假设您发现使用参数输入存在二重积分的确定解,
c(θ)
,您认为这表明可以为所示的数学公式导出封闭形式的解吗?顺便说一句,参数θ
没有被误用nqad
根据需要将其传递给函数。lambda
的编程方式可以接受任意数量的参数,因此它很乐意接受这些参数并将其放入幂和和的列表中。因此,您不会得到,例如1/u**t+1/v**t-1
,但1/u**t+1/v**t+1/t**t-1
。函数调用与预期的函数用途不匹配。如果你改为写us[0]**()+us[1]**()-1
,它就行了。@develistc(u,v)
的积分实际上是一个封闭形式c*logc
可能不是。你看过c
关于其积分的闭式解的哪篇文章?从数学上讲,为什么nqad_uuu(n=3,θ)
给出的解与二元copulanqad_uu(n=2,θ)
的解完全相同,而计算时间是前者的两倍?同一水平的theta
对高维连词的影响不应该不同吗?如果不是的话,这是否意味着求解二元copula就已经给出了更高维的copula结果?