Теперь у меня проблемы с использованием minimize
в LMFIT-модуле.Пожалуйста, смотрите случай ниже:
Случай 1: параметр без ограничений
import numpy as np
import matplotlib.pyplot as plt
from lmfit import Model, minimize, Parameters, Parameter, report_fit
noise = np.random.randn(100)
def func_model(para, x, data):
''' Model: y = a*sin(2*k*pi*x+theta)'''
a = para['a']
k = para['k']
theta = para['theta']
model= a*np.sin(2*k*np.pi*x+theta)
return model-data # thas's what I want to minimize
def func_noise(x, para):
a, k, theta = para
return a*np.sin(2*k*np.pi*x+theta) + noise
x_steps = np.linspace(-2*np.pi, 0, 100)
para_true = [10, 0.34, np.pi/6]
datas = func_noise(x_steps, para_true)
params = Parameters()
params.add('a', value=7)
params.add('k', value=0.2)
params.add('theta', value=0)
result = minimize(func_model, params, args=(x_steps, datas))
report_fit(result)
Получите результат:
a: 10.0054134 +/- 0.14334401 (1.43%) (init = 7)
k: 0.33954301 +/- 0.00110337 (0.32%) (init = 0.2)
theta: 0.52071533 +/- 0.02546636 (4.89%) (init = 0)
сравните с фактическим параметром[10, 0,34, пи / 6] результаты верны.
Случай 2: Параметр с ограничениями
просто изменить на:
params.add('a', value=7, min=5, max=15) # should be 10
params.add('k', value=0.2, min=0, max=1) # should be 0.34
params.add('theta', value=0)
и оставьте другой код таким же, затем получите неправильный результат:
a: 14.9999918 +/- 51.0737691 (340.49%) (init = 7)
k: 0.01305462 +/- 0.58283692 (4464.60%) (init = 0.2)
theta: -2.90461833 +/- 10.5723936 (363.99%) (init = 0)
Как это могло произойти?Заранее спасибо