Как установить переменную, чтобы она не подходила
Я хочу соответствовать Гауссу, но переменные 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 ответ
В своем комментарии вы говорите, что обновили скрипт, но я этого не вижу.
Двумерный гауссиан обычно определяется как
#!/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)
где x
а также y
Ожидается, что это одномерные массивы для двух разных осей. Конечно, данные, которые должны быть установлены, должны быть в той же самой сетке - вы можете проверить другие приемы с осевыми осями (meshgrid
и т. д.) в зависимости от того, как структурированы ваши данные.
Чтобы превратить это в lmfit.Model
, вам нужно будет либо изменить это определение, чтобы вы передали в одном двумерном массиве, либо указать оба x
а также y
в качестве независимых переменных при создании 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
и так далее.