适合指向洛伦兹曲线,并在Python中找到中心和半最大带宽

时间:2014-06-26 17:50:38

标签: python python-2.7 numpy scipy

我正在使用python程序从网络分析器中提取谨慎的值。它拉出401个y轴值并计算相应的x轴值,我希望将它们拟合到洛伦兹曲线,找到y轴最大值和半个y轴最大宽度的x轴值。 /> 我希望适合这些要点的洛伦兹函数是

(1/pi)(a/((x-x0)^2+(a)^2))

我必须找到ax0给定网络分析器返回的xy值。有没有一种简单的方法可以使用scipynumpy执行此操作?我经常尝试发布我所做的任何尝试,但我不知道从哪里开始。谢谢!

2 个答案:

答案 0 :(得分:2)

作为振亚,我建议使用curve_fit。如果xdataydata是您的值,则可以

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
  • 的起始猜测