Python 用nqad求二重积分

Python 用nqad求二重积分,python,numpy,scipy,integration,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

这里有个问题。以下是我目前的代码:

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变换)。尝试了一些方法,但每次都出现错误,即边界函数中的参数太少或太少


请帮忙

如果编写
integrate.nqad(被积函数,[bounds\u r(r,s02,a\u s,a),bounds\u r(s02,a\u s,a)])
,python希望您影响
r
的值。但您没有这样做,因为集成是通过
R
执行的

此语法应适用于:

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

看看。

中的第二个例子,如果您编写
integrate.nqad(被积函数,[bounds\u r(r,s02,a\u s,a),bounds\u r(s02,a\u s,a)])
,python希望您影响
r的值。但您没有这样做,因为集成是通过
R
执行的

此语法应适用于:

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

请看中的第二个示例。

谢谢,这最终奏效了,但当我实际想将第二个积分的值传递给R时,似乎出现了问题。所以,如果我在边界的定义中加入一个R的数值,它是可以工作的,但是我需要在一个循环中对不同的R值进行积分,除了在循环的每一步重新定义我的边界外,我想不出一种方法。当然,这是通过将这个值作为被积函数中的一个参数来解决的。非常感谢。是的,您需要在被积函数和边界函数中定义一个附加参数,然后在nqad的第三个参数(args=…)中添加迭代值。如果我的回答对你有帮助,请投票表决;)看来我还没有足够的能力去投票:(谢谢,这最终奏效了,但是当我真的想为第二个积分传递一个值给R时,似乎出现了一个问题。因此,如果我在边界的定义中为R输入一个数值,这是可行的,但是我需要在一个循环中为R的不同值执行这个积分,除了重新定义我的bo之外,我想不出一种方法来完成它取消循环中的每一步。这当然可以通过将此值作为被积函数中的参数之一来解决。谢谢!是的,您需要在被积函数和边界函数中定义一个附加参数来完成此操作,然后将迭代值添加到nqad的第三个参数中(args=…)。如果有帮助,请向上投票我的答案;)看来我还没有足够的能力去投票:(我需要计算Abel变换,你可以使用一个已经实现的算法,其中的计算效率比使用
quad
更高。我需要计算Abel变换,你可以使用一个已经实现的算法,其中的计算效率比使用更高e> 四元组