Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将点拟合到洛伦兹曲线,并在Python中找到中心和一半最大带宽_Python_Python 2.7_Numpy_Scipy - Fatal编程技术网

将点拟合到洛伦兹曲线,并在Python中找到中心和一半最大带宽

将点拟合到洛伦兹曲线,并在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是否有一种简单的方法可以做到这一点?我通常会尝试发布我所做的任何尝试,但我甚至不知道从哪里开始。谢谢大家! 有关配件的基本示例,请参见例如 这里有多个示例,介绍如何使用

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

(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)

我还没有测试代码,但原则上它应该可以工作

太棒了,谢谢你!我也没有试过,但我的主要困惑是最初的猜测,现在我明白了多亏了你的代码。