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

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

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

Похожие темы