Main Content

기울기와 헤세 행렬을 사용한 최소화

이 예제에서는 명시적 삼중대각 헤세 행렬 H(x)를 사용하여 비선형 최소화 문제를 푸는 방법을 보여줍니다. 다음을 최소화하여 x를 구하는 문제입니다.

f(x)=i=1n-1((xi2)(xi+12+1)+(xi+12)(xi2+1)),

여기서 n = 1000입니다.

이 예제의 마지막 부분에 있는 헬퍼 함수 brownfghf(x), 기울기 g(x), 헤세 행렬 H(x)를 계산합니다. fminunc 솔버가 미분 정보를 사용하도록 지정하려면 optimoptions를 사용하여 SpecifyObjectiveGradient 옵션과 HessianFcn 옵션을 설정하십시오. fminunc에 헤세 행렬을 사용하려면 'trust-region' 알고리즘을 사용해야 합니다.

options = optimoptions(@fminunc,'Algorithm','trust-region',...
    'SpecifyObjectiveGradient',true,'HessianFcn','objective');

파라미터 n을 1000으로 설정하고, 초기점 xstart를 –1(성분 개수가 홀수인 경우) 또는 +1(성분 개수가 짝수인 경우)로 설정합니다.

n = 1000;
xstart = -ones(n,1);
xstart(2:2:n) = 1;

f의 최솟값을 구합니다.

[x,fval,exitflag,output] = fminunc(@brownfgh,xstart,options);
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.

해와 풀이 과정을 검토합니다.

disp(fval)
   2.8709e-17
disp(exitflag)
     1
disp(output)
         iterations: 7
          funcCount: 8
           stepsize: 0.0039
       cgiterations: 7
      firstorderopt: 4.7948e-10
          algorithm: 'trust-region'
            message: 'Local minimum found....'
    constrviolation: []

함수 f(x)는 제곱의 거듭제곱 합이므로 음수가 아닙니다. 해 fval이 거의 0에 가깝기 때문에 최솟값이 확실합니다. 종료 플래그 1 또한 fminunc가 해를 구했음을 나타냅니다. output 구조체는 fminunc가 해에 도달하기 위해 7번의 반복을 수행했음을 보여줍니다.

해의 가장 큰 요소와 가장 작은 요소를 표시합니다.

disp(max(x))
   1.1987e-10
disp(min(x))
  -1.1987e-10

x의 모든 요소가 0(x = 0)인 지점 가까이 해가 있습니다.

헬퍼 함수

다음 코드는 brownfgh 헬퍼 함수를 생성합니다.

function [f,g,H] = brownfgh(x)
%BROWNFGH  Nonlinear minimization problem (function, its gradients
% and Hessian)
% Documentation example        

%   Copyright 1990-2008 The MathWorks, Inc.

% Evaluate the function.
  n=length(x); y=zeros(n,1);
  i=1:(n-1);
  y(i)=(x(i).^2).^(x(i+1).^2+1)+(x(i+1).^2).^(x(i).^2+1);
  f=sum(y);
%
% Evaluate the gradient.
  if nargout > 1
     i=1:(n-1); g = zeros(n,1);
     g(i)= 2*(x(i+1).^2+1).*x(i).*((x(i).^2).^(x(i+1).^2))+...
             2*x(i).*((x(i+1).^2).^(x(i).^2+1)).*log(x(i+1).^2);
     g(i+1)=g(i+1)+...
              2*x(i+1).*((x(i).^2).^(x(i+1).^2+1)).*log(x(i).^2)+...
              2*(x(i).^2+1).*x(i+1).*((x(i+1).^2).^(x(i).^2));
  end
%
% Evaluate the (sparse, symmetric) Hessian matrix
  if nargout > 2
     v=zeros(n,1);
     i=1:(n-1);
     v(i)=2*(x(i+1).^2+1).*((x(i).^2).^(x(i+1).^2))+...
            4*(x(i+1).^2+1).*(x(i+1).^2).*(x(i).^2).*((x(i).^2).^((x(i+1).^2)-1))+...
            2*((x(i+1).^2).^(x(i).^2+1)).*(log(x(i+1).^2));
     v(i)=v(i)+4*(x(i).^2).*((x(i+1).^2).^(x(i).^2+1)).*((log(x(i+1).^2)).^2);
     v(i+1)=v(i+1)+...
              2*(x(i).^2).^(x(i+1).^2+1).*(log(x(i).^2))+...
              4*(x(i+1).^2).*((x(i).^2).^(x(i+1).^2+1)).*((log(x(i).^2)).^2)+...
              2*(x(i).^2+1).*((x(i+1).^2).^(x(i).^2));
     v(i+1)=v(i+1)+4*(x(i).^2+1).*(x(i+1).^2).*(x(i).^2).*((x(i+1).^2).^(x(i).^2-1));
     v0=v;
     v=zeros(n-1,1);
     v(i)=4*x(i+1).*x(i).*((x(i).^2).^(x(i+1).^2))+...
            4*x(i+1).*(x(i+1).^2+1).*x(i).*((x(i).^2).^(x(i+1).^2)).*log(x(i).^2);
     v(i)=v(i)+ 4*x(i+1).*x(i).*((x(i+1).^2).^(x(i).^2)).*log(x(i+1).^2);
     v(i)=v(i)+4*x(i).*((x(i+1).^2).^(x(i).^2)).*x(i+1);
     v1=v;
     i=[(1:n)';(1:(n-1))'];
     j=[(1:n)';(2:n)'];
     s=[v0;2*v1];
     H=sparse(i,j,s,n,n);
     H=(H+H')/2;
  end
end

관련 항목