我正在使用python程序从网络分析器中提取谨慎的值。它拉出401个y轴值并计算相应的x轴值,我希望将它们拟合到洛伦兹曲线,找到y轴最大值和半个y轴最大宽度的x轴值。 /> 我希望适合这些要点的洛伦兹函数是
(1/pi)(a/((x-x0)^2+(a)^2))
我必须找到a
和x0
给定网络分析器返回的x
和y
值。有没有一种简单的方法可以使用scipy
或numpy
执行此操作?我经常尝试发布我所做的任何尝试,但我不知道从哪里开始。谢谢!
答案 0 :(得分:2)
作为振亚,我建议使用curve_fit。如果xdata
和ydata
是您的值,则可以
import numpy as np
import scipy as sp
from scipy.optimize import curve_fit
def lorentzian(x, a, x0):
return a / ((x-x0)**2 + a**2) / np.pi
# Obtain xdata and ydata
...
# Initial guess of the parameters (you must find them some way!)
pguess = [a_guess, x0_guess]
# Fit the data
popt, pcov = curve_fit(lorentzian, xdata, ydata, p0 = pguess)
# Results
a, x0 = popt[0], popt[1]
进行初步猜测的建议可能是:
a_guess = 1 / (np.pi * max(ydata))
x0_guess = sum(xdata * ydata) / sum(ydata)
我没有测试过代码,但原则上它应该可行。
答案 1 :(得分:0)
有关拟合的基本示例,请参阅例如http://wiki.scipy.org/Cookbook/FittingData
这里有关于如何使用scipy.optimize中的(更现代的)curve_fit
的多个示例。
对于洛伦兹人,我会
x0