Использование модели lmfit для наилучшего соответствия данных с несколькими пиками - PullRequest
0 голосов
/ 24 марта 2019
import matplotlib.pyplot as plt
import numpy as np
from lmfit import Model
x=np.array([4698.031, 4698.027, 4698.024, 4698.021, 4698.017, 4698.014,4698.011, 4698.007, 4698.004, 4698.001, 4697.997, 4697.994, 4697.991, 4697.987, 4697.984, 4697.981, 4697.977, 4697.974, 4697.971, 4697.967, 4697.964, 4697.961, 4697.957, 4697.954, 4697.951, 4697.947, 4697.944, 4697.941, 4697.937, 4697.934, 4697.931, 4697.927, 4697.924, 4697.921, 4697.917])
y=np.array([0.56565, 0.586575, 0.70335, 0.991245, 1.447545, 4.944375, 11.97281, 18.22095, 19.7613, 17.13792, 13.35083, 10.26506, 7.898505, 5.084775, 2.4192, 1.34358, 0.829905, 1.31322, 3.2049, 4.0095, 2.83263, 1.51605, 0.643275, 0.48972, 0.432675, 0.084375, 0.135345, 0.362145, 0.34425, 0.307125, 0.469125, 0.297, 0.183255, 0.528855, 0.523125])
gmodel = Model(gaussian, prefix='p1_') + Model(gaussian, prefix='p2_')
params = gmodel.make_params(p1_amp=0.1, p1_cen=4697.97, p1_wid=0.005, p2_amp=0.5, p2_cen=4698.00, p2_wid=0.005)


params['p1_cen'].min = x.min()
params['p1_cen'].max = 4697.98
params['p2_cen'].min = 4697.98
params['p2_cen'].max = x.max()

result = gmodel.fit(y, params, x=x)

обновленная программа несколько вопросов

  1. Когда я запускаю программу, она выдает ошибку. Traceback (последний вызов был последним):

Файл "", строка 7, в gmodel = модель (гауссовский, префикс = 'p1_') + модель (гауссовский, префикс = 'p2 _')

NameError: имя 'gaussian' не определено

Для которого я включаю from lmfit.lineshapes import gaussian, и это работает.

Это правильно или неправильно ??

  1. После добавления библиотеки / пакета программа говорит Traceback (последний вызов был последним):

Файл "", строка 9, в params ['p1 _']. min = x.min ()

KeyError: 'p1_cen'

помогите мне с этим.

  1. После удаления params программа работает без каких-либо ошибок, но что мне делать, чтобы показать графики для моих данных n данных наилучшего соответствия . Я только что сделал plt.plot(x,y) для своих данных, но не знаю, что делать для моих наилучших данных .....

1 Ответ

0 голосов
/ 24 марта 2019

Вы должны дать лучшие начальные догадки. Ваши данные x варьируются от 4697,8 до 4698,0, но ваше первоначальное предположение для cen составляет 1,0, что выходит за пределы диапазона данных. Измените начальные значения на более разумные значения для ваших данных.

Обновление для решения вопроса о том, как подогнать 2 пика:

Чтобы соответствовать 2 пикам, вы можете создать составную модель, как с

gmodel = Model(gaussian, prefix='p1_') + Model(gaussian, prefix='p2_')

result  = gmodel.fit(y, x=x, p1_amp=0.1, p1_cen=4697.97, p1_wid=0.005,
                     p2_amp=0.5, p2_cen=4698.00, p2_wid=0.005)

Это создаст модель, в которую будут добавлены 2 гауссиана, а имена параметров для одной модели будут иметь префикс p1_, а параметры для другой - префикс p2_. После этого вы можете указать начальные значения для каждого из них.

Обычно рекомендуется создавать экземпляр lmfit.Parameters для каждой модели, поскольку это позволяет вам дополнительно манипулировать настройками параметров, например, устанавливать верхнюю и нижнюю границы. Для этой модели может быть полезно убедиться, что пики не могут перекрываться слишком близко или перекрываться. Вы можете сделать это так:

gmodel = Model(gaussian, prefix='p1_') + Model(gaussian, prefix='p2_')

params = gmodel.make_params(p1_amp=0.1, p1_cen=4697.97, p1_wid=0.005,
                            p2_amp=0.5, p2_cen=4698.00, p2_wid=0.005)
params['p1_cen'].min = x.min()
params['p1_cen'].max = 4697.98
params['p2_cen'].min = 4697.98
params['p2_cen'].max = x.max()

result = gmodel.fit(y, params, x=x)

, который устанавливает значения min / max для параметров cen для каждой модели, чтобы они не могли поменяться местами.

...