在值数组上集成两个变量的函数
Integrating a function of two variables over an array of values
我目前正在尝试使用 SciPy:
求解这个积分
我首先被建议使用插值法,我尝试过但由于某种原因无法弄清楚,但这可能是一个好方法。我发现 关于使用 np.vectorize
并且我认为它可能仍然有效,但我遇到了错误。这是我到目前为止编写的代码(还要注意 n 和 n,eq 不是索引,它们只是变量名):
import numpy as np
from scipy import integrate
def K(x): #This is a function in the integral.
b = 0.252
return b*(((4/(x**3))+(3/(x**2))+1/x) + (4/(x**3) + 1/(x**2))*np.exp(-x))
def Xntot_integrand(x,z): #Defining the integrand
Xneq_x = (1+np.exp(x))**(-1) #This is the term outside the integral and squared within it.
return Xneq_x(x)**2 * np.exp(K(z) - K(x)) * np.exp(x)
Xntot_integrand = np.vectorize(Xntot_integrand)
def Xntot_integrated(x,z):
return quad(Xntot_integrand, 0, z)
Xntot_integrated=np.vectorize(Xntot_integrated)
T_narrow = np.linspace(1,0.01,100) #Narrow T range from 1 to 0.01 MeV
z_narrow = Q/T_narrow
final_integrated_Xneq = Xntot_integrated(z_narrow)
我在调用 Xntot_integrated
时收到错误消息,我缺少位置参数(这是有道理的,我认为它仍在两个变量 x 和 z 中)。
所以我想问题出在我使用 quad()
的地方,因为在集成后,x 应该消失。有什么建议吗?我应该改用 tabulation/interpolation 吗?
您需要使用 integrate.quad
的 args
关键字参数来将额外的输入传递给函数,因此它看起来像这样:
def Xntot_integrated(z):
return integrate.quad(Xntot_integrand, 0, z, args=(z,))
注意这里x
不是积分函数的输入,只有z
,被积函数的第一个输入是积分变量,任何额外的信息都通过args=(z,)
传递元组。
或者,您可以定义一个从上下文中知道 z 的包装器,并且只将积分变量作为输入:
def Xntot_integrated(z):
def integrand(x):return Xntot_integrand(x,z)
return integrate.quad(integrand, 0, z)
但大多数采用函数的 API 通常有一个关键字参数来指定这些输入。 (想到 threading.Thread
。)
你的 Xneq_x
本身也应该是一个函数,因为你不小心在你的被积函数中使用了它(它现在只是一个值)并且你需要在集成之外使用它: )
我目前正在尝试使用 SciPy:
求解这个积分我首先被建议使用插值法,我尝试过但由于某种原因无法弄清楚,但这可能是一个好方法。我发现 np.vectorize
并且我认为它可能仍然有效,但我遇到了错误。这是我到目前为止编写的代码(还要注意 n 和 n,eq 不是索引,它们只是变量名):
import numpy as np
from scipy import integrate
def K(x): #This is a function in the integral.
b = 0.252
return b*(((4/(x**3))+(3/(x**2))+1/x) + (4/(x**3) + 1/(x**2))*np.exp(-x))
def Xntot_integrand(x,z): #Defining the integrand
Xneq_x = (1+np.exp(x))**(-1) #This is the term outside the integral and squared within it.
return Xneq_x(x)**2 * np.exp(K(z) - K(x)) * np.exp(x)
Xntot_integrand = np.vectorize(Xntot_integrand)
def Xntot_integrated(x,z):
return quad(Xntot_integrand, 0, z)
Xntot_integrated=np.vectorize(Xntot_integrated)
T_narrow = np.linspace(1,0.01,100) #Narrow T range from 1 to 0.01 MeV
z_narrow = Q/T_narrow
final_integrated_Xneq = Xntot_integrated(z_narrow)
我在调用 Xntot_integrated
时收到错误消息,我缺少位置参数(这是有道理的,我认为它仍在两个变量 x 和 z 中)。
所以我想问题出在我使用 quad()
的地方,因为在集成后,x 应该消失。有什么建议吗?我应该改用 tabulation/interpolation 吗?
您需要使用 integrate.quad
的 args
关键字参数来将额外的输入传递给函数,因此它看起来像这样:
def Xntot_integrated(z):
return integrate.quad(Xntot_integrand, 0, z, args=(z,))
注意这里x
不是积分函数的输入,只有z
,被积函数的第一个输入是积分变量,任何额外的信息都通过args=(z,)
传递元组。
或者,您可以定义一个从上下文中知道 z 的包装器,并且只将积分变量作为输入:
def Xntot_integrated(z):
def integrand(x):return Xntot_integrand(x,z)
return integrate.quad(integrand, 0, z)
但大多数采用函数的 API 通常有一个关键字参数来指定这些输入。 (想到 threading.Thread
。)
你的 Xneq_x
本身也应该是一个函数,因为你不小心在你的被积函数中使用了它(它现在只是一个值)并且你需要在集成之外使用它: )