我能够使用峰席将曲线拟合到x/y数据集,如下所示。这是一个线性背景和10个洛伦兹曲线。

由于我需要拟合许多类似的曲线,我编写了一个脚本拟合例程,使用mpfit.py,这是一个莱温伯格-马夸德特算法。然而,这种适应需要更长的时间,而且,在我看来,比峰值的结果更不准确:
起始值

拟合结果与固定线性背景(线性背景值取自峰值-o-mat结果)

所有变量不含的拟合结果

我相信起始值已经非常接近,但即使在固定的线性背景下,左洛伦兹显然是一个退化的契合。
结果是更糟糕的完全自由拟合。
峰值-o-mat似乎使用scipy.odr.odrpack。现在更有可能的是:
对一个更简单的问题(中间有一个峰值的线性数据)的拟合显示,峰值o-mat和我的脚本之间有很好的相关性。另外,我也没有找到很多关于ordpack的东西。
编辑:,我似乎可以自己回答这个问题,但是答案有点令人不安。使用scipy.odr (允许与odr或最小二乘方法进行拟合)都可以将结果作为峰值,即使不受约束。
下图再次显示数据、起始值(几乎完美),然后显示odr和最小匹配值。组分曲线为odr曲线。

我会转到odr,但这还是让我心烦意乱。方法(mpfit.py,scipy.optimize.leastsq,scipy.odr在最少in模式下)‘应该’产生同样的结果。
对于偶然发现这篇文章的人:要完成odr拟合,必须为x和y值指定一个错误。如果没有错误,请与sx << sy一起使用小值。
linear = odr.Model(f)
mydata = odr.RealData(x, y, sx = 1e-99, sy = 0.01)
myodr = odr.ODR(mydata, linear, beta0 = beta0, maxit = 2000)
myoutput1 = myodr.run() 发布于 2012-07-08 12:38:17
您也可以使用peak mat来编写脚本。最简单的方法是创建包含您希望通过GUI进行匹配的所有数据的项目,清理它,转换它并附加(即选择一个模型,提供一个初始猜测并拟合)基本模型到其中一个集合。然后,您可以(深入)复制该模型并将其附加到所有其他数据集。试试这个:
from peak_o_mat.project import Project
from peak_o_mat.fit import Fit
from copy import deepcopy
p = Project()
p.Read('in.lpj')
base = p[2][0] # this is the set which has been fit already
for data in p[2][1:]: # all remaining sets of plot number 2
mod = deepcopy(base.mod)
data.mod = mod
f = Fit(data, data.mod)
res = f.run()
pars = res[0]
err = res[1]
data.mod._newpars(pars, err)
print data.mod.parameters_as_table()
p.Write('out')如果你需要更多细节,请告诉我。
https://stackoverflow.com/questions/11330131
复制相似问题