在值数组上集成两个变量的函数

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.quadargs 关键字参数来将额外的输入传递给函数,因此它看起来像这样:

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 本身也应该是一个函数,因为你不小心在你的被积函数中使用了它(它现在只是一个值)并且你需要在集成之外使用它: )