В этом примере показано, как подогнать нелинейную функцию к данным. Для этого примера нелинейная функция является стандартной экспоненциальной кривой затухания
λ t),
где ) - отклик в момент времени t, а A и λ - параметры для подгонки. Подгонка кривой означает поиск параметров A и λ, которые минимизируют сумму квадратичных ошибок
2,
где время равно , а ответы равны ..., n. Сумма квадратичных ошибок является целевой функцией.
Обычно у вас есть данные измерений. Для этого примера создайте искусственные данные на основе модели с 40 0,5, с нормально распределенными псевдослучайными ошибками.
rng default % for reproducibility tdata = 0:0.1:10; ydata = 40*exp(-0.5*tdata) + randn(size(tdata));
Записать функцию, принимающую параметры A и lambda и данные tdata и ydataи возвращает сумму квадратичных ошибок для модели ). Поместите все переменные для оптимизации (A и lambda) в одной векторной переменной (x). Дополнительные сведения см. в разделе Минимизация функций нескольких переменных.
type ssevalfunction sse = sseval(x,tdata,ydata) A = x(1); lambda = x(2); sse = sum((ydata - A*exp(-lambda*tdata)).^2);
Сохранить эту целевую функцию как файл с именем sseval.m на пути MATLAB ®.
fminsearch решатель применяется к функциям одной переменной, x. Тем не менее, sseval функция имеет три переменные. Дополнительные переменные tdata и ydata не являются переменными для оптимизации, а являются данными для оптимизации. Определение целевой функции для fminsearch как функция x один:
fun = @(x)sseval(x,tdata,ydata);
Для получения информации о включении дополнительных параметров, таких как tdata и ydata, см. раздел Параметризация функций.
Начать со случайного положительного набора параметров x0, и иметь fminsearch найдите параметры, которые минимизируют целевую функцию.
x0 = rand(2,1); bestx = fminsearch(fun,x0)
bestx = 2×1
40.6877
0.4984
Результат bestx достаточно близко к параметрам, которые генерировали данные, A = 40 и lambda = 0.5.
Чтобы проверить качество посадки, постройте график данных и результирующей кривой соответствия. Создайте кривую отклика на основе возвращенных параметров модели.
A = bestx(1); lambda = bestx(2); yfit = A*exp(-lambda*tdata); plot(tdata,ydata,'*'); hold on plot(tdata,yfit,'r'); xlabel('tdata') ylabel('Response Data and Curve') title('Data and Best Fitting Exponential Curve') legend('Data','Fitted Curve') hold off
