exponenta event banner

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

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

Задача имеет 10 членов с двумя неизвестными: найти x, двумерный вектор, который минимизирует

∑k=110 (2 + 2k-ekx1-ekx2) 2,

начиная с точки x0 = [0.3,0.4].

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

Fk (x) = 2 + 2k-ekx1-ekx2,

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

Решить проблему без якобиана

Вспомогательная функция myfun определенный в конце этого примера реализует целевую функцию с векторными значениями без производной информации. Решение минимизации, начиная с точки x0.

x0 = [0.3,0.4]; % Starting guess
[x,resnorm,res,eflag,output] = lsqnonlin(@myfun,x0); % Invoke optimizer
Local minimum possible.
lsqnonlin stopped because the size of the current step is less than
the value of the step size tolerance.

Проверьте решение и количество оценок функций.

disp(x)
    0.2578    0.2578
disp(resnorm)
  124.3622
disp(output.funcCount)
    72

Решить проблему, включая якобианскую

Целевая функция достаточно проста, чтобы можно было вычислить её якобиан. Следуя определению в якобианах векторных функций, якобинская функция представляет матрицу

Jkj (x) =∂Fk (x) ∂xj.

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

Fk (x) = 2 + 2k-ekx1-ekx2,

так

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

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

opts = optimoptions(@lsqnonlin,'SpecifyObjectiveGradient',true);

Запустите решатель.

lb = []; % No bounds
ub = [];
[x2,resnorm2,res2,eflag2,output2] = lsqnonlin(@myfun2,x0,lb,ub,opts);
Local minimum possible.
lsqnonlin stopped because the size of the current step is less than
the value of the step size tolerance.

Решение совпадает с предыдущим решением.

disp(x2)
    0.2578    0.2578
disp(resnorm2)
  124.3622

Преимущество использования Jacobian заключается в том, что решатель принимает гораздо меньше оценок функций.

disp(output2.funcCount)
    24

Вспомогательные функции

Этот код создает myfun функция помощника.

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

Этот код создает myfun2 функция помощника.

function [F,J] = myfun2(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
end

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