Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用scipy.integrate.nqad的二重积分解不';t匹配integrate.dblquad_Python_Math_Scipy_Integral_Mismatch - Fatal编程技术网

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
,它就行了。@develist
c(u,v)
的积分实际上是一个封闭形式
c*logc
可能不是。你看过
c
关于其积分的闭式解的哪篇文章?从数学上讲,为什么
nqad_uuu(n=3,θ)
给出的解与二元copula
nqad_uu(n=2,θ)
的解完全相同,而计算时间是前者的两倍?同一水平的
theta
对高维连词的影响不应该不同吗?如果不是的话,这是否意味着求解二元copula就已经给出了更高维的copula结果?