기울기와 헤세 행렬을 사용한 최소화
이 예제에서는 명시적 삼중대각 헤세 행렬 를 사용하여 비선형 최소화 문제를 푸는 방법을 보여줍니다. 다음을 최소화하여 를 구하는 문제입니다.
여기서 = 1000입니다.
이 예제의 마지막 부분에 있는 헬퍼 함수 brownfgh
가 , 기울기 , 헤세 행렬 를 계산합니다. 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;
의 최솟값을 구합니다.
[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: []
함수 는 제곱의 거듭제곱 합이므로 음수가 아닙니다. 해 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