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

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

где ответ во время, и и параметры должны соответствовать. Подбор кривой кривой означает находить параметры и которые минимизируют сумму ошибок в квадрате

где времена, и ответы. Сумма ошибок в квадрате является целевой функцией.

Создание демонстрационных данных

Обычно, у вас есть данные от измерений. Для этого примера создайте искусственные данные на основе модели с и с нормально распределенными псевдослучайными ошибками.

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

Решатель 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

Похожие темы

Была ли эта тема полезной?