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

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

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте