Почему эти результаты не соответствуют кривой?

Я пытаюсь оценить скорость затухания, используя экспоненциальное соответствие, но меня озадачивает, почему два метода не дают одинакового результата.

В первом случае взятие журнала данных для линеаризации проблемы соответствует экспоненциальной аппроксимации трендовой линии Excel. Я ожидал, что подгонка экспоненты напрямую будет такой же.

import numpy as np
from scipy.optimize import curve_fit

def exp_func(x, a, b):
    return a * np.exp(-b * x) 

def lin_func(x, m, b):
    return m*x + b

xdata = [1065.0, 1080.0, 1095.0, 1110.0, 1125.0, 1140.0, 1155.0, 1170.0, 1185.0, 1200.0, 1215.0, 1230.0, 1245.0, 1260.0, 1275.0, 1290.0, 1305.0, 1320.0, 1335.0, 1350.0, 1365.0, 1380.0, 1395.0, 1410.0, 1425.0, 1440.0, 1455.0, 1470.0, 1485.0, 1500.0]
ydata = [21.3934, 17.14985, 11.2703, 13.284, 12.28465, 12.46925, 12.6315, 12.1292, 10.32762, 8.509195, 14.5393, 12.02665, 10.9383, 11.23325, 6.03988, 9.34904, 8.08941, 6.847, 5.938535, 6.792715, 5.520765, 6.16601, 5.71889, 4.949725, 7.62808, 5.5079, 3.049625, 4.8566, 3.26551, 3.50161]

xdata = np.array(xdata)
xdata = xdata - xdata.min() + 1
ydata = np.array(ydata)
lydata = np.log(ydata)

lopt, lcov = curve_fit(lin_func, xdata, lydata)
elopt = [np.exp(lopt[1]),-lopt[0]]

eopt, ecov = curve_fit(exp_func, xdata, ydata, p0=elopt)

print 'elopt: {},{}'.format(*elopt)
print 'eopt: {},{}'.format(*eopt)

Результаты:

elopt: 17.2526204283,0.00343624199064
eopt: 17.1516384575,0.00330590568338

1 ответ

Решение

Вы решаете две разные проблемы оптимизации. curve_fit() предполагает, что шум eps_i является аддитивным (и несколько гауссовским). Иначе это не даст оптимальных результатов.

Предполагая, что вы хотите свести к минимуму Sum (y_i - f(x_i))**2 с:

f(x) = a * Exp(-b * x) + eps_i

где eps_i неизвестная ошибка для iэлемент данных, который вы хотите исключить. Принятие логарифма приводит к

Log(f(x)) = Log(a*Exp(-b*x) + eps_i) знак равно Log(Exp(Log(a) - b*x)) + eps_i

Вы можете интерпретировать экспоненциальное уравнение как имеющее аддитивный шум. Ваша линейная версия имеет мультипликативный шум mu_i, так как:

g(x) = a * mu_i * Exp(-b*x)

результаты в

Log(g(x) = Log(a) - b * x + Log(mu_i)

В заключение, вы получите только идентичные результаты, когда величина ошибок eps_i очень маленький

Другие вопросы по тегам