exponenta event banner

Решение нелинейной системы без использования Jacobian

В этом примере показано уменьшение результатов анализа функций при предоставлении производных для системы нелинейных уравнений. Как поясняется в документе Writing Vector and Matrix Objective Functions, якобиановым J (x) системы уравнений F (x) является Jij (x) =∂Fi (x) ∂xj. Предоставьте эту производную как второй вывод целевой функции.

Например, multirosenbrock функция - n-мерное обобщение функции Розенброка (см. Решение ограниченной нелинейной задачи, на основе задачи) для любого положительного, чётного значения n:

F (1) = 1-x1F (2) = 10 (x2-x12) F (3) = 1-x3F (4) = 10 (x4-x32) ⋮F (n-1) = 1-xn-1F (n) = 10 (xn-xn-12).

Решением системы уравнений F (x) = 0 является точка xi = 1, i = 1... n.

Для этой целевой функции все якобинские члены Jij (x) равны нулю, за исключением членов, где i и j отличаются максимум на единицу. Для нечётных значений i < n ненулевые члены равны

Jii (x) = -1J (i + 1) i = -20xiJ (i + 1) (i + 1) = 10.

multirosenbrock вспомогательная функция в конце этого примера создает целевую функцию F (x) и ее Jacobian J (x).

Решите систему уравнений, начиная с точки xi = -1.9 для нечётных значений i < n, и xi = 2 для чётных значений i. Укажите n = 64.

n = 64;  
x0(1:n,1) = -1.9; 
x0(2:2:n,1) = 2;
[x,F,exitflag,output,JAC] = fsolve(@multirosenbrock,x0);
Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.

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

disp(norm(x-ones(size(x))))
     0
disp(output.funcCount)
        1043

fsolve находит решение и принимает более 1000 оценок функций для этого.

Снова решите систему уравнений, на этот раз с помощью якобиана. Для этого установите 'SpecifyObjectiveGradient' опция для true.

opts = optimoptions('fsolve','SpecifyObjectiveGradient',true);
[x2,F2,exitflag2,output2,JAC2] = fsolve(@multirosenbrock,x0,opts);
Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.

Снова проверьте расстояние вычисленного решения x2 от истинного решения и количества оценок функций, которые fsolve используется для вычисления решения.

disp(norm(x2-ones(size(x2))))
     0
disp(output2.funcCount)
    21

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

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

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

function [F,J] = multirosenbrock(x)
% Get the problem size
n = length(x);  
if n == 0, error('Input vector, x, is empty.'); end
if mod(n,2) ~= 0
   error('Input vector, x ,must have an even number of components.');
end
% Evaluate the vector function
odds  = 1:2:n;
evens = 2:2:n;
F = zeros(n,1);
F(odds,1)  = 1-x(odds);
F(evens,1) = 10.*(x(evens)-x(odds).^2); 
% Evaluate the Jacobian matrix if nargout > 1
if nargout > 1
   c = -ones(n/2,1);    C = sparse(odds,odds,c,n,n);
   d = 10*ones(n/2,1);  D = sparse(evens,evens,d,n,n);
   e = -20.*x(odds);    E = sparse(evens,odds,e,n,n);
   J = C + D + E;
end
end

См. также

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