Аппроксимирование кривыми через Оптимизацию

Этот пример показывает аппроксимацию нелинейной функции к данным. В данном примере нелинейная функция является стандартным экспоненциалом распада

y(t)=Aexp(-λt),

где y(t) - ответ в момент времени t, и A и λ являются параметрами, которые нужно подогнать. Подбор кривой означает нахождение параметров A и λ которые минимизируют сумму квадратичных невязок

i=1n(yi-Aexp(-λti))2,

где время ti и ответы на следующие вопросы: yi,i=1,,n. Сумма квадратичных невязок является целевой функцией.

Создание выборочных данных

Обычно у вас есть данные измерений. В данном примере создайте искусственные данные на основе модели с A=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, и возвращает сумму квадратичных невязок для модели y(t). Поместите все переменные для оптимизации (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

Figure contains an axes. The axes with title Data and Best Fitting Exponential Curve contains 2 objects of type line. These objects represent Data, Fitted Curve.

Похожие темы