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