我有这个二维积分,有相关的极限。该函数可以在Python中定义为
def func(gamma, u2, u3):
return (1-1/(1+gamma-u3-u2))*(1/(1+u2)**2)*(1/(1+u3)**2)
其中u3
的范围是从0到gamma
(正实数),而u2
的范围是从0到gamma-u3
。
如何使用scipy.integrate.nquad来实现呢?我试图阅读该文档,但是要遵循它并不容易,尤其是我对Python还是比较陌生。
扩展:我想为一个K
实现数值积分,其中在这种情况下,被积分数由(1-1/(1+gamma-uk-....-u2))*(1/(1+uK)**2)*...*(1/(1+u2)**2)
给出。我编写的函数采用了动态数量的参数,如下所示:
def integrand(gamma, *args):
'''
inputs:
- gamma
- *args = (uK, ..., u2)
Output:
- (1-1/(1+gamma-uk-....-u2))*(1/(1+uK)**2)*...*(1/(1+u2)**2)
'''
L = len(args)
for ll in range(0, L):
gamma -= args[ll]
func = 1-1/(1+gamma)
for ll in range(0, L):
func *= 1/((1+args[ll])**2)
return func
但是,我不确定如何对范围执行相同的操作,其中我将为范围提供一个功能,其中uK
的范围从0到gamma
,u_{K-1}
的范围从0到gamma-uK
,....,u2
的范围从0到gamma-uK-...-u2
。
答案 0 :(得分:0)
这是使用scipy.integrate.dblquad
而不是nquad
的简单方法:
从x = a..b返回func(y,x)的双精度(整数)积分,然后 y = gfun(x).. hfun(x)。
from scipy.integrate import dblquad
def func(u2, u3, gamma):
return (1-1/(1+gamma-u3-u2))*(1/(1+u2)**2)*(1/(1+u3)**2)
gamma = 10
def gfun(u3):
return 0
def hfun(u3):
return gamma-u3
dblquad(func, 0, gamma, gfun, hfun, args=(gamma,))
gfun
和hfun
似乎不接受多余的参数,因此gamma
必须是全局变量。
经过多次反复试验后,使用nquad
:
from scipy.integrate import nquad
def func(u2, u3, gamma):
return (1-1/(1+gamma-u3-u2))*(1/(1+u2)**2)*(1/(1+u3)**2)
def range_u3(gamma):
return (0, gamma)
def range_u2(u3, gamma):
return (0, gamma-u3)
gamma = 10
nquad(func, [range_u2, range_u3], args=(gamma,) )
tplquad
的源代码中的有用引号:
# nquad will hand (y, x, t0, ...) to ranges0
# nquad will hand (x, t0, ...) to ranges1
从nquad
文档中,变量的顺序颠倒了(与dblquad
相同):
按顺序进行集成。也就是说,x0上的积分是最里面的积分,xn是最外面的
带有k
嵌套集成的通用案例:
from scipy.integrate import nquad
import numpy as np
def func(*args):
gamma = args[-1]
var = np.array(args[:-1])
return (1-1/(1+gamma-np.sum(var)))*np.prod(((1+var)**-2))
def range_func(*args):
gamma = args[-1]
return (0, gamma-sum(args[:-1]))
gamma, k = 10, 2
nquad(func, [range_func]*k, args=(gamma,) )