有没有办法在 Python 中对两个函数的乘积进行数值积分?

Is there a way to integrate the product of two functions numerically in Python?

我有两个带有多个参数的函数:

import numpy as np
from scipy.integrate import quad

gamma_s=0.1 #eV
gamma_d=0.1 #eV
T=298 #K
homo=-5.5 #eV
Ef=-5 #eV
mu=0 #eV just displaces the function

#Fermi-Dirac distribution
k=8.617333262e-5 #eV/K
def fermi (E:float, mu:float, T:float) -> float:
    return 1/(1+np.exp((E-mu)/(k*T)))

#Lorentzian density of states
gamma=gamma_d+gamma_s
def DoS (E:float, gamma:float, homo:float, Ef:float) -> float:
    epsilon=homo-Ef
    v=E-epsilon
    u=gamma/2
    return gamma/(np.pi*((v*v)+(u*u)))

我知道如果我只想集成其中一个,比如说 fermi,那么我会使用

quad(fermi, -np.inf, np.inf, args=(mu,T))

但是我需要他们的乘积 fermi*DoS 关于他们的公共变量 E 的积分,我无法想象如何用 quad 来做,因为有documentation.

中没有提及

我想我可以定义另一个函数 integrand 作为它们的乘积并计算其积分,但这听起来有些混乱,我更喜欢更简洁的方法。

如果内联函数对您更有吸引力,您不必定义新的独立函数:

quad(lambda e: fermi(e, mu, T) * DoS(e, gamma, homo, T), -np.inf, np.inf)

也就是我们use partial applicationfermiDoS的乘积变成新的Pythonlambda.

只是为了给出一些需要做这样的事情的数学理由...

从数学上讲,只能积分(可积)函数(或从可积函数导出的函数空间的元素)。要整合两个函数的product,我们必须说出它们的乘积是指哪个函数。过了一会儿,这可能感觉很明显,但在这里我认为值得注意的是人类 defined

(fg)(x) := f(x)g(x).

以同样的方式,必须赋予函数乘积以数学意义,必须赋予两个 Python 函数的乘积以意义。特别是因为 Python 函数可以 return 各种各样的东西,其中很多乘法没有意义,所以不可能有一个通用的定义。