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

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

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®.

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 object. The axes object with title Data and Best Fitting Exponential Curve contains 2 objects of type line. These objects represent Data, Fitted Curve.

Похожие темы