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

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

где времена
, и ответы
. Сумма ошибок в квадрате является целевой функцией.
Обычно, у вас есть данные от измерений. Для этого примера создайте искусственные данные на основе модели с
и
с нормально распределенными псевдослучайными ошибками.
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 ssevalfunction 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
