如何设置变量以使其不适合它

时间:2017-11-22 14:47:38

标签: python lmfit gauss

我想要适合高斯,但变量cen和cen2必须不断。

from pylab import *
import matplotlib.mlab
from lmfit import Model

def gaussian(x, amp, cen, wid,amp2,cen2,wid2):

return (amp/(sqrt(2*pi)*wid)) * exp(-(x-cen)**2 /(2*wid**2))+
(amp2/(sqrt(2*pi)*wid2)) * exp(-(x-cen2)**2 /(2*wid**2))

model = Model(gaussian) 
model.set_param_hint('amp',min=1.4, max=1.48)
model.set_param_hint('amp2',min=0.00003,max=0.00005)
parameters  = model.make_params( amp=1.46, cen=0, wid=1, amp2=0.00005, 
cen2=10,wid2=5)

result = model.fit(y, parameters, x=x)

模型拟合高斯但设定中心为f.ex. 5。

print(result.fit_report())
#plt.yscale('log')
#plt.ylim(((0,0.0004)))
plt.scatter(x, y, s=0.7)
plt.plot(x, result.best_fit, 'r-')
plt.fill_between(x, result.best_fit-0.03, result.best_fit+0.03, 
color="#ABABAB",alpha=0.5)
plt.show()

我该怎么做?

1 个答案:

答案 0 :(得分:0)

在你的评论中,你说你更新了脚本,但我没有看到。

二维高斯通常被定义为

#!/usr/bin/env python
import numpy as np
def gaussian2d(x, y, amplitude=1, centerx=0, centery=0, sigmax=1, sigmay=1):
    gauss_x = np.exp(-(1.0*x-centerx)**2 / (2.0*sigmax**2))
    gauss_y = np.exp(-(1.0*y-centery)**2 / (2.0*sigmay**2))
    return amplitude * np.outer(gauss_x, gauss_y) / (2*np.pi*sigmax*sigmay)

其中xy预计是2个不同轴的1-D数组。当然,要拟合的数据必须位于同一网格上 - 您可能需要查看其他numpy轴技巧(meshgrid等),具体取决于数据的结构。

要将其转换为lmfit.Model,您需要更改该定义,以便传入单个二维数组,或将xy指定为独立与

一样创建Model时的变量
model = Model(gaussian2d, independent_vars=['x', 'y'])

我认为你的实际问题是:

如果你想在这里设置参数界限或约束,你可以(如你的例子中那样)

model.set_param_hint('amplitude', min=0, max=2)
model.set_param_hint('centery', value=10, vary=False)

或者您可以先创建参数,然后应用边界和约束:

model = Model(gaussian2d, independent_vars=['x', 'y'])
parameters =model.make_params(centerx=0, sigmax=1, ...)
parameters['amplitude'].min = 0
parameters['amplitude'].max = 10
parameters['centery'].value = 5.0
parameters['centery'].vary = False

等等。