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

Этот пример показывает сокращение вычислений функции, когда вы обеспечиваете производные для системы нелинейных уравнений. Как объяснено в записи Векторных и Матричных Целевых функций, якобиана J(x) из системы уравнений F(x) Jij(x)=Fi(x)xj. Обеспечьте эту производную как второй выход вашей целевой функции.

Например, мультифункция Розенброка 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

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

Похожие темы