Решите нелинейную систему без и включая якобиан

Этот пример показывает сокращение вычислений функции, когда вы обеспечиваете производные для системы нелинейных уравнений. Как объяснено в записи Векторных и Матричных Целевых функций, якобиана 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=1n.

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

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

multirosenbrock функция помощника в конце этого примера создает целевую функцию F(x) и его якобиан 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 находит решение и принимает 1 000 вычислений функции, чтобы сделать так.

Решите систему уравнений снова, на этот раз с помощью якобиана. Для этого установите '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 вычислений функции для этого, а не более чем 1 000. В общем случае использование якобиана может понизить количество вычислений функции и обеспечить увеличенную робастность, несмотря на то, что этот пример не показывает улучшенную робастность.

Функция помощника

Этот код создает 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

Смотрите также

Похожие темы