微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决有没有办法在 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的乘积转化为一个新的Python lambda

只是为需要做这样的事情提供一些数学上的理由......

从数学上讲,只能对(可积)函数(或从可积函数导出的函数空间元素)进行积分。要集成两个功能的产品,我们必须说明它们的产品意味着哪个功能。一段时间后,这可能会感觉很明显,但在这里我认为值得注意的是人类定义

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。