이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

해석적 헤세 행렬을 사용하는 fmincon Interior-Point 알고리즘

fmincon interior-point 알고리즘은 헤세 행렬 함수를 입력값으로 받을 수 있습니다. 헤세 행렬을 제공하는 경우 제약 조건이 있는 최소화 문제에 대해 더 정확한 해를 더 빠르게 얻을 수 있습니다.

이 예제에 대한 제약 조건 세트는 하나는 위쪽으로 뾰족하고 하나는 아래쪽으로 뾰족한 모양의 두 원뿔 내부의 교점입니다. 제약 조건 함수 c는 각 원뿔에 대해 성분이 하나씩, 두 개 성분을 갖는 벡터입니다. 이는 3차원 예제이므로, 제약 조건 c의 기울기는 3x2 행렬입니다.

function [c ceq gradc gradceq] = twocone(x)
% This constraint is two cones, z > -10 + r
% and z < 3 - r

ceq = [];
r = sqrt(x(1)^2 + x(2)^2);
c = [-10+r-x(3);
    x(3)-3+r];

if nargout > 2

    gradceq = [];
    gradc = [x(1)/r,x(1)/r;
       x(2)/r,x(2)/r;
       -1,1];

end
x(1) 좌표가 음수가 되면 목적 함수가 음의 방향으로 빠르게 증가합니다. 기울기는 요소를 3개 가진 벡터입니다.
function [f gradf] = bigtoleft(x)
% This is a simple function that grows rapidly negative
% as x(1) gets negative
%
f=10*x(1)^3+x(1)*x(2)^2+x(3)*(x(1)^2+x(2)^2);

if nargout > 1

   gradf=[30*x(1)^2+x(2)^2+2*x(3)*x(1);
       2*x(1)*x(2)+2*x(3)*x(2);
       (x(1)^2+x(2)^2)];

end
다음은 이 문제에 대한 플롯입니다. 음영은 목적 함수의 값을 나타냅니다. 목적 함수가 x = [-6.5,0,-3.5] 근방에서 최소화되는 것을 알 수 있습니다.

 Figure 생성에 사용된 코드

라그랑주에 대한 헤세 행렬은 다음 방정식으로 지정됩니다.

xx2L(x,λ)=2f(x)+λi2ci(x)+λi2ceqi(x).

다음 함수는 라그랑주 승수 구조체 lambda를 사용해 점 x에서 헤세 행렬을 계산합니다.

function h = hessinterior(x,lambda)

h = [60*x(1)+2*x(3),2*x(2),2*x(1);
    2*x(2),2*(x(1)+x(3)),2*x(2);
    2*x(1),2*x(2),0];% Hessian of f
r = sqrt(x(1)^2+x(2)^2);% radius
rinv3 = 1/r^3;
hessc = [(x(2))^2*rinv3,-x(1)*x(2)*rinv3,0;
    -x(1)*x(2)*rinv3,x(1)^2*rinv3,0;
    0,0,0];% Hessian of both c(1) and c(2)
h = h + lambda.ineqnonlin(1)*hessc + lambda.ineqnonlin(2)*hessc;

fmincon에서 interior-point 알고리즘을 사용하여 이 문제를 실행합니다. 최적화 앱을 사용하여 이를 실행하는 방법은 다음과 같습니다.

  1. 다음 Figure와 같이 문제를 설정합니다.

  2. 반복 출력값의 경우 옵션(Options) 창의 맨 아래로 스크롤하고 표시 수준(Level of display), 모든 반복(Iterations)을 선택합니다.

  3. 옵션(Options) 창에서 해석적 헤세 행렬 함수 핸들을 제공합니다.

  4. 솔버 실행 및 결과 보기(Run solver and view results)에서 시작(Start)을 클릭합니다.

명령줄에서 최소화를 수행하려면 다음과 같이 하십시오.

  1. options를 다음과 같이 설정합니다.

    options = optimoptions(@fmincon,'Algorithm','interior-point',...
            'Display','off','SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true,...
            'HessianFcn',@hessinterior);
  2. options 구조체를 사용하여 시작점 [–1,–1,–1]로 fmincon을 실행합니다.

    [x,fval,mflag,output] = fmincon(@bigtoleft,[-1,-1,-1],...
               [],[],[],[],[],[],@twocone,options);

해, 목적 함수 값, 종료 플래그, 함수 실행 횟수, 반복 횟수를 검토합니다.

x,fval,mflag,output.funcCount,output.iterations
x =

   -6.5000   -0.0000   -3.5000


fval =

  -2.8941e+03


mflag =

     1


ans =

     7


ans =

     6

헤세 행렬 함수를 사용하지 않을 경우 fmincon은 6회가 아니라 9회 반복하여 수렴합니다.

options = optimoptions(@fmincon,'Algorithm','interior-point',...
        'Display','off','SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true);

[x fval mflag output]=fmincon(@bigtoleft,[-1,-1,-1],...
           [],[],[],[],[],[],@twocone,options);

x,output.funcCount,output.iterations

x =

   -6.5000   -0.0000   -3.5000


ans =

    13


ans =

     9
두 실행 모두 비슷한 해를 구하지만, 해석적 헤세 행렬을 사용할 때는 F-count와 반복 횟수가 더 낮습니다.

관련 항목