Следуя идее Suhas C об использовании nlinfit из набора инструментов статистики MATLAB, вот фрагмент кода, который может служить руководством:
% experimental data
xe = []; % replace [] with column vector abscissa
ye = []; % replace [] with column vector ordinate
% model function ::= y=a*e^(bx)+c, coef ::= [a,b,c]
y = @(coef,x) coef(1) .* exp(coef(2).*x) + coef(3);
% initial guess for coefficients (degenerate exponential)
coef0 = [mean(ye) - min(ye), 0, min(ye)];
% do fitting
coef = nlinfit(xe, ye, y, coef0);
В качестве альтернативы, вы можете использовать lsqnonlin из панели инструментов оптимизации.Целевая функция (норму которой необходимо минимизировать) - это остаток модели по сравнению с экспериментальными данными:
% experimental data
xe = []; % replace [] with column vector abscissa
ye = []; % replace [] with column vector ordinate
% residual function ::= r=a*e^(b*xe)+c-ye, coef ::= [a,b,c]
r = @(coef) coef(1) .* exp(coef(2).*xe) + coef(3) - ye;
% initial guess for coefficients (degenerate exponential)
coef0 = [mean(ye) - min(ye), 0, min(ye)];
% do fitting
coef = lsqnonlin(r, coef0);
Если нет, если наборы инструментов доступны, вы можете прибегнуть к стандартному минимизатору MATLB fminsearch
:
% experimental data
xe = []; % replace [] with column vector abscissa
ye = []; % replace [] with column vector ordinate
% residual function ::= rn=||a*e^(b*xe)+c-ye||, coef ::= [a,b,c]
rn = @(coef) norm(coef(1) .* exp(coef(2).*xe) + coef(3) - ye);
% initial guess for coefficients (degenerate exponential)
coef0 = [mean(ye) - min(ye), 0, min(ye)];
% do fitting
coef = fminsearch(rn, coef0);
Примечания:
Ожидается, что вы сможете адаптировать этот код к вашим фактическим данным (т. Е. Изменить xe
и ye
присваивания).
Первоначальное предположение для коэффициентов модели coef0
очень "сырое".Вероятно, вы получите лучшее начальное приближение, если учтете только первые члены экспоненты: e bx = 1 + bx + (bx) 2 / 2 ... иПодходит , что модель в первую очередь.Результат подбора упрощенной модели будет служить исходным предположением для подгонки полной модели.Нужно это или нет, это вопрос экспериментов с данными.
fminsearch
обычно можно минимизировать в R 3 , но поиск минимума может закончиться неудачей, если данные очень шумные, или модель не подходит для данных (например, согласование синусоидальных данных с экспоненциальной моделью), или сама модель допускает несколько локальных минимумов.