Функция minimize()
минимизирует массив в смысле наименьших квадратов, настраивая параметры переменной, чтобы минимизировать (resid**2).sum()
для массива resid
, возвращаемого вашей целевой функцией.Он действительно ничего не знает о неопределенности в ваших данных или даже о ваших данных.Чтобы использовать неопределенности в вашей аппроксимации, вы должны передать свой массив eV
точно так же, как вы передаете t
и V1
, а затем использовать это при вычислении минимизируемого массива.
Обычно требуется минимизировать Sum[ (data-model)^2/epsilon^2 ]
, где epsilon
- это неопределенность данных (ваш eV
), поэтому остаточный массив следует изменить с data-model
на (data-model)/epsilon
.Для вашей подгонки, вы хотели бы
def funcion(parametros, x, y, eps):
R = parametros['R'].value
C = parametros['C'].value
modelo = 4/((1+(x**2)*(R**2)*(C**2))**1/2)
return (modelo - y)/eps
, а затем использовать это с
fit = Minimizer(funcion, parametros, fcn_args=(t, V1, eV))
resultado = fit.minimize()
...
Если вы используете интерфейс lmfit.Model
(разработан для подгонки кривой), то вы можете передатьв массиве weights
, который умножается на data -model
, и поэтому будет 1.0 / eV
для представления весов для неопределенностей (как указано выше с minimize
).Использование интерфейса lmfit.Model
и предоставление неопределенностей будет выглядеть следующим образом:
from lmfit import Model
# model function, to model the data
def func(t, r, c):
return 4/((1+(t**2)*(r**2)*(c**2))**1/2)
model = Model(func)
parametros = model.make_params(r=1000, c=1.e-6)
parametros['r'].set(min=900, max=1100)
parametros['c'].set(min=1.e-7, max=1.e-5)
resultado = model.fit(V1, parametros, t=t, weights=1.0/eV)
print(resultado.fit_report())
plt.errorbar(t, V1, eV, 'k+', label='data')
plt.plot(t, resultado.best_fit, 'r', label='fit')
plt.legend()
plt.show()
надеюсь, что это поможет ....