Как вписать мои данные в экспоненциальную модель, но с дополнительной константой в 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);

Заметки:

  1. Ожидается, что вы можете адаптировать этот код к вашим фактическим данным (т.е. изменить xe а также ye задания).

  2. Начальное предположение для коэффициентов модели coef0 очень "сырой" Возможно, вы бы получили лучшее начальное приближение, если бы вы рассматривали только первые члены экспоненты: e bx = 1 + bx + (bx) 2/2... и сначала подгоняли эту модель. Результат подбора упрощенной модели будет служить исходным предположением для подгонки полной модели. Нужно это или нет - вопрос экспериментов с данными.

  3. fminsearch обычно может минимизировать в R 3, но поиск минимума может завершиться неудачей, если данные очень шумные, или модель не подходит для данных (например, согласование синусоидальных данных с экспоненциальной моделью), или сама модель допускает несколько локальных минимумы.

Подходит для линейных функций. Попробуйте nlfit ( https://www.mathworks.com/help/stats/nlinfit.html). Пример "Нелинейная регрессия с использованием надежных опций" - это то, что у вас есть. Они имеют константу в экспоненте как отрицательную, но вы изменили бы modelfun, чтобы сделать ее положительной для вашего случая.

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