Нелинейный метод наименьших квадратов с и без якобиана

Описание задачи и метод решения

В этом примере показано, как решить задачу нелинейного метода наименьших квадратов двумя способами. Это сначала показывает решение, не используя Функцию Якоби. Затем это показывает, как включать якобиан, и это показывает улучшение КПД, что якобиан дает.

Проблема имеет 10 условий с 2 неизвестными: найдите x, двумерный вектор, который минимизирует

k=110(2+2kekx1ekx2)2,

запуск в точке x0 = [0.3,0.4].

Поскольку lsqnonlin принимает, что сумма квадратов явным образом не формируется в функции пользователя, функция передала lsqnonlin должен вычислить вектор оцененная функция

Fk(x)=2+2kekx1ekx2,

для k = 1 - 10 (то есть, F должен иметь 10 компонентов).

Шаг 1: Запишите файл myfun.m, который вычисляет значения целевой функции.

function F = myfun(x)
k = 1:10;
F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));

Шаг 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

Большинство компьютерных систем может решить намного большие полные проблемы, сказать в сотни уравнений и переменных. Но если существует некоторая структура разреженности в якобиане (или Гессиан), который может быть использован в своих интересах, крупномасштабные методы всегда запускается быстрее, если эта информация предоставляется.

Шаг 3: включайте якобиан.

Целевая функция достаточно проста вычислить свой якобиан. После определения в Якобианах Вектор-функций Функция Якоби представляет матрицу

Jkj(x)=Fk(x)xj.

Здесь, Fk (x является k th компонент целевой функции. Этот пример имеет

Fk(x)=2+2kekx1ekx2,

так

Jk1(x)=kekx1Jk2(x)=kekx2.

Измените файл целевой функции.

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

Похожие темы