Как вписать мои данные в экспоненциальную модель, но с дополнительной константой в matlab
Я очень плохо знаком с Matlab, и я не знаю, как вписать мои точки данных в модель по своему выбору. Мои точки данных не являются полностью экспоненциальными, и я хотел бы вписать свои данные в модель, подобную этой: y=a*e^(bx)+c, так как данные не будут идти против 0 для больших значений x, но переходя к константе, с, которая не равна 0.
Мой код для нахождения моих данных и преобразования их в число, а затем подгонки их к экспоненциальной модели:
time = datafile(61608:63907,1);
time = table2array(time);
time = datenum(time).*(24*60*60);
time = time - time(1);
conc = datafile(61608:63907,2);
conc = table2array(conc);
f = fit(time,conc,'exp1');
plot(f,time,conc)
Я понятия не имею, как вписать мои данные в мою собственную модель: y = a * e ^ (bx) + c
2 ответа
Следуя идее Suhas C об использовании nlinfit из MATLAB Statistics Toolbox, вот фрагмент кода, который может служить руководством:
% 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, но поиск минимума может завершиться неудачей, если данные очень шумные, или модель не подходит для данных (например, согласование синусоидальных данных с экспоненциальной моделью), или сама модель допускает несколько локальных минимумы.
Подходит для линейных функций. Попробуйте nlfit ( https://www.mathworks.com/help/stats/nlinfit.html). Пример "Нелинейная регрессия с использованием надежных опций" - это то, что у вас есть. Они имеют константу в экспоненте как отрицательную, но вы изменили бы modelfun, чтобы сделать ее положительной для вашего случая.