我是stackoverflow的新手,也是Python的新手。因此,我希望以适当的方式提出我的问题。 我正在运行一个类似于这个最小化示例的Python代码,其中包含一个洛伦兹函数和余弦函数的乘积需要进行数值积分:
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad
#minimal example:
omega_loc = 15
gamma = 5
def Lorentzian(w):
#print(w)
return (w**3)/((w/omega_loc) + 1)**2*(gamma/2)/((w-omega_loc)**2+(gamma/2)**2)
def intRe(t):
return quad(lambda w: w**(-2)*Lorentzian(w)*(1-np.cos(w*t)),0,np.inf,limit=10000)[0]
plt.figure(1)
plot_range = np.linspace(0,100,1000)
plt.plot(plot_range, [intRe(t) for t in plot_range])
无论积分上限为何,我都无法运行代码并得到结果。当我启用#print(w)
这一行时,似乎代码只是在无限循环中随机地探测不同的w值。此外,控制台还给出了一个舍入误差的检测。在Python中,是否有更适合这种函数的数值积分的不同方法,比quad函数更好,或者我犯了更基本的错误?
100
而不是np.inf
,积分结果会更快,并且与np.inf
的结果相差不大。不确定原因,但可能是无穷大转换的检测对你的函数效果不佳。我会把这个问题留给专家们来解决。 - hesham_EE