Этот пример показывает сокращение вычислений функции, когда вы обеспечиваете производные для системы нелинейных уравнений. Как объяснено в записи Векторных и Матричных Целевых функций, якобиана из системы уравнений . Обеспечьте эту производную как второй выход вашей целевой функции.
Например, multirosenbrock
функция - размерное обобщение функции Розенброка (см., Решает Ограниченную Нелинейную задачу, Основанную на проблеме) для любого положительного, даже значение :
Решение системы уравнения точка , .
Для этой целевой функции, всех якобиевских терминов нуль кроме терминов где и отличайтесь самое большее один. Для нечетных значений , ненулевые термины
multirosenbrock
функция помощника в конце этого примера создает целевую функцию и его якобиан .
Решите систему уравнений, начинающую с точки для нечетных значений , и для даже значений . Задать .
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