使用 nquad 进行二重积分
Using nquad for a double integral
这里有问题。到目前为止,这是我的代码:
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.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 中的第二个示例。
这里有问题。到目前为止,这是我的代码:
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.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 中的第二个示例。