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