exponenta event banner

Фитинг кривой с помощью оптимизации

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

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.

Связанные темы