将点拟合到洛伦兹曲线,并在Python中找到中心和一半最大带宽
我正在使用python程序从网络分析器中提取离散值。它提取401个y轴值并计算相应的x轴值,我希望将它们拟合到洛伦兹曲线,并找到y轴最大宽度和半y轴最大宽度的x轴值。将点拟合到洛伦兹曲线,并在Python中找到中心和一半最大带宽,python,python-2.7,numpy,scipy,Python,Python 2.7,Numpy,Scipy,我正在使用python程序从网络分析器中提取离散值。它提取401个y轴值并计算相应的x轴值,我希望将它们拟合到洛伦兹曲线,并找到y轴最大宽度和半y轴最大宽度的x轴值。 我想用洛伦兹函数来拟合这些点 (1/pi)(a/((x-x0)^2+(a)^2)) 我必须找到a和x0,给定从网络分析仪返回的x和y值。使用scipy或numpy是否有一种简单的方法可以做到这一点?我通常会尝试发布我所做的任何尝试,但我甚至不知道从哪里开始。谢谢大家! 有关配件的基本示例,请参见例如 这里有多个示例,介绍如何使用
我想用洛伦兹函数来拟合这些点
(1/pi)(a/((x-x0)^2+(a)^2))
我必须找到
a
和x0
,给定从网络分析仪返回的x
和y
值。使用scipy
或numpy
是否有一种简单的方法可以做到这一点?我通常会尝试发布我所做的任何尝试,但我甚至不知道从哪里开始。谢谢大家! 有关配件的基本示例,请参见例如
这里有多个示例,介绍如何使用scipy.optimize中的(更现代的)曲线拟合
为了一个洛伦兹人,我会
- 放在原木空间里
- 使用数据的最大值作为
x0
作为珍雅,我建议使用。如果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)
我还没有测试代码,但原则上它应该可以工作 太棒了,谢谢你!我也没有试过,但我的主要困惑是最初的猜测,现在我明白了多亏了你的代码。