В этом примере получение оценки методом наименьших квадратов является хорошей идеей. Другие ответы используют этот подход.
Существует быстрый и грязный подход, гибкий и удобный.
Просто численно. Вы можете использовать fminsearch
а> чтобы выполнить задание.
% MATLAB R2019a
x = [1 2 3 4 5 6 7];
y = [9 6 4 2 4 6 9];
% Create anonymous function (your supposed model to fit)
fh =@(params) params(1).*exp(-params(2).*x);
% Create anonymous function for Least Squares Error with single input
SSEh =@(params) sum((fh(params)-y).^2); % Sum of Squared Error (SSE)
p0 = [1 0.5]; % Initial guess for [alpha, beta]
[p, SSE] = fminsearch(SSEh,p0);
alpha = p(1); % 5.7143
beta = p(2); % 1.2366e-08 (AKA zero)
Всегда полезно отображать результаты в качестве проверки работоспособности (я часто ошибаюсь, и это снова и снова спасает меня).
yhath=@(params,xval) params(1).*exp(-params(2).*xval);
Xrng = min(x)-1:.2:max(x)+1;
figure, hold on, box on
plot(Xrng,p(1).*exp(-p(2).*Xrng),'r--','DisplayName','Fit')
plot(x,y,'ks','DisplayName','Data')
legend('show')
Примечание о нелинейности.
Это прекрасно работает с линейными моделями из-за < strong>выпуклость. Если ваша функция ошибок нелинейна, но выпукла, как сумма квадратов ошибок (SSE), то это также возвращает глобальный оптимум.
Обратите внимание, что для невыпуклой функции потребуется несколько начальных точек, чтобы попытаться зафиксировать множество локальных оптимумов, тогда выбор наилучшего все равно не будет давать гарантий оптимальности. Добавление ограничений к решению потребует штрафных функций или переключения на решатель с ограничениями, поскольку fminsearch решает неограниченную проблему (если вы не накажете ее должным образом).
Легко изменить:
легко изменить модель и функцию ошибки. Например, если вместо этого вы хотите минимизировать сумму абсолютной ошибки, это можно сделать просто, используя abs
.
% Create anonymous function for Least Absolute Error with single input
SAEh =@(params) sum(abs(fh(params)-y)); % Sum of Absolute Error
person
SecretAgentMan
schedule
21.11.2019
lsqnonlin
. - person obchardon   schedule 06.12.2018