有没有办法在 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 application把fermi
和DoS
的乘积变成新的Pythonlambda
.
只是为了给出一些需要做这样的事情的数学理由...
从数学上讲,只能积分(可积)函数(或从可积函数导出的函数空间的元素)。要整合两个函数的product,我们必须说出它们的乘积是指哪个函数。过了一会儿,这可能感觉很明显,但在这里我认为值得注意的是人类 defined
(fg)(x) := f(x)g(x).
以同样的方式,必须赋予函数乘积以数学意义,必须赋予两个 Python 函数的乘积以意义。特别是因为 Python 函数可以 return 各种各样的东西,其中很多乘法没有意义,所以不可能有一个通用的定义。
我有两个带有多个参数的函数:
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 application把fermi
和DoS
的乘积变成新的Pythonlambda
.
只是为了给出一些需要做这样的事情的数学理由...
从数学上讲,只能积分(可积)函数(或从可积函数导出的函数空间的元素)。要整合两个函数的product,我们必须说出它们的乘积是指哪个函数。过了一会儿,这可能感觉很明显,但在这里我认为值得注意的是人类 defined
(fg)(x) := f(x)g(x).
以同样的方式,必须赋予函数乘积以数学意义,必须赋予两个 Python 函数的乘积以意义。特别是因为 Python 函数可以 return 各种各样的东西,其中很多乘法没有意义,所以不可能有一个通用的定义。