Этот пример показывает аппроксимацию нелинейной функции к данным. В данном примере нелинейная функция является стандартным экспоненциалом распада
где - ответ в момент времени , и и являются параметрами, которые нужно подогнать. Подбор кривой означает нахождение параметров и которые минимизируют сумму квадратичных невязок
где время и ответы на следующие вопросы: . Сумма квадратичных невязок является целевой функцией.
Обычно у вас есть данные измерений. В данном примере создайте искусственные данные на основе модели с и , с нормально распределенными псевдослучайными ошибками.
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 sseval
function sse = sseval(x,tdata,ydata) A = x(1); lambda = x(2); sse = sum((ydata - A*exp(-lambda*tdata)).^2);
Сохраните эту целевую функцию как файл с именем sseval.m
на пути MATLAB ®.
The 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