使用nquad进行双积分

时间:2016-02-06 18:36:21

标签: python numpy scipy integration

这里有问题。到目前为止,这是我的代码:

from scipy import integrate
import math
import numpy as np

a = 0.250
s02 = 214.0
a_s = 0.0163

def integrand(r, R, s02, a_s, a):
        return 2.0 * r * (r/a)**(-0.1) * (1.0 + (r**2/a**2))**(-2.45)\\
*(math.sqrt(r**2 - R**2))**(-1.0) * (a_s/(1 + (R-0.0283)**2/a_s**2 ))

def bounds_R(s02, a_s, a):
        return [0, np.inf]
def bounds_r(R, s02, a_s, a):
        return [R, np.inf]

result = integrate.nquad(integrand, [bounds_r(R, s02, a_s, a), bounds_R(s02, a_s, a)])

a,s02和a_s是常量。我需要在r上执行第一个积分,然后在R上执行第二个积分。我认为问题是R出现在第一个积分的极限中(称为Abel变换)。尝试了一些事情,每次都得到一个错误,即边界函数中的参数太少或者太少。

请帮忙!

1 个答案:

答案 0 :(得分:3)

如果你写integrate.nquad(integrand, [bounds_r(R, s02, a_s, a), bounds_R(s02, a_s, a)]),python期望你影响R的值。但你没有,因为整合是在R上进行的。

此语法应该有效:

result = integrate.nquad(integrand, [bounds_r, bounds_R], args=(s02,a_s,a))

查看documentation of integrate.nquad中的第二个示例。