Как вписать мои данные в экспоненциальную модель, но с дополнительной константой в matlab - PullRequest
0 голосов
/ 14 февраля 2019

Я очень плохо знаком с Matlab, и я не знаю, как вписать мои точки данных в модель по своему выбору.Мои точки данных не являются полностью экспоненциальными, и я хотел бы вписать свои данные в модель, подобную этой: y = a * e ^ (bx) + c, так как данные не будут идти против 0 для больших значений x, нопереход к константе, c не 0. 0. 1001 *

Мой код для нахождения моих данных и их преобразования в число, а затем подгонки их к экспоненциальной модели:

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 ]

0 голосов
/ 14 февраля 2019

Следуя идее 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);

Примечания:

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

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

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

0 голосов
/ 14 февраля 2019

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

...