Шаг 1: Запишите файл myfun.m, который вычисляет значения целевой функции.
Шаг 2: Вызовите стандартную программу нелинейного метода наименьших квадратов.
В этом примере показано, как решить задачу нелинейного метода наименьших квадратов двумя способами. Это сначала показывает решение, не используя Функцию Якоби. Затем это показывает, как включать якобиан, и это показывает улучшение КПД, что якобиан дает.
Проблема имеет 10 условий с 2 неизвестными: найдите x, двумерный вектор, который минимизирует
запуск в точке x0 = [0.3,0.4].
Поскольку lsqnonlin принимает, что сумма квадратов явным образом не формируется в функции пользователя, функция передала lsqnonlin должен вычислить вектор оцененная функция
для k = 1 - 10 (то есть, F должен иметь 10 компонентов).
function F = myfun(x) k = 1:10; F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));
x0 = [0.3,0.4]; % Starting guess [x,resnorm,res,eflag,output1] = lsqnonlin(@myfun,x0); % Invoke optimizer
Поскольку якобиан не вычисляется в myfun.m, lsqnonlin вызывает доверительную область отражающий алгоритм с полным конечным дифференцированием. Обратите внимание на то, что SpecifyObjectiveGradient опция в options установлен в false по умолчанию.
После 72 функциональных оценок этот пример дает решение
x,resnorm
x =
0.2578 0.2578
resnorm =
124.3622Большинство компьютерных систем может решить намного большие полные проблемы, сказать в сотни уравнений и переменных. Но если существует некоторая структура разреженности в якобиане (или Гессиан), который может быть использован в своих интересах, крупномасштабные методы всегда запускается быстрее, если эта информация предоставляется.
Целевая функция достаточно проста вычислить свой якобиан. После определения в Якобианах Вектор-функций Функция Якоби представляет матрицу
Здесь, Fk (x является k th компонент целевой функции. Этот пример имеет
так
Измените файл целевой функции.
function [F,J] = myfun(x)
k = 1:10;
F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));
if nargout > 1
J = zeros(10,2);
J(k,1) = -k.*exp(k*x(1));
J(k,2) = -k.*exp(k*x(2));
endУстановите опции, таким образом, решатель использует якобиан.
opts = optimoptions(@lsqnonlin,'SpecifyObjectiveGradient',true);
Запустите решатель.
x0 = [0.3 0.4]; % Starting guess [x,resnorm,res,eflag,output2] = lsqnonlin(@myfun,x0,[],[],opts);
Решение эквивалентно прежде.
x,resnorm
x =
0.2578 0.2578
resnorm =
124.3622Преимущество для использования якобиана состоит в том, что решатель берет меньше функциональных оценок, 24 вместо 72.
[output1.funcCount,output2.funcCount]
ans =
72 24