Main Content

fminunc

비제약 조건 다변수 함수의 최솟값 구하기

설명

비선형 계획법 솔버입니다.

다음으로 지정된 문제의 최솟값을 구합니다.

minxf(x)

여기서 f(x)는 스칼라를 반환하는 함수입니다.

x는 벡터 또는 행렬입니다. 행렬 인수 항목을 참조하십시오.

예제

x = fminunc(fun,x0)은 점 x0에서 시작하여 fun에 정의된 함수의 국소 최솟값 x를 구하려고 시도합니다. 점 x0은 스칼라, 벡터 또는 행렬일 수 있습니다.

참고

추가 파라미터 전달하기에는 필요한 경우 추가 파라미터를 목적 함수와 비선형 제약 조건 함수에 전달하는 방법이 설명되어 있습니다.

fminunc는 제약 조건이 없는 비선형 문제에 사용할 수 있습니다. 문제에 제약 조건이 있는 경우, 일반적으로 fmincon을 사용하십시오. 최적화 의사 결정표 항목을 참조하십시오.

예제

x = fminunc(fun,x0,options)options에 지정된 최적화 옵션을 사용하여 fun을 최소화합니다. 이 옵션을 설정하려면 optimoptions를 사용하십시오.

예제

x = fminunc(problem)problem에 설명되어 있는 구조체인 problem의 최솟값을 구합니다.

예제

[x,fval] = fminunc(___)는 모든 구문에서 해 x에서의 목적 함수 fun의 값을 반환합니다.

예제

[x,fval,exitflag,output] = fminunc(___)fminunc의 종료 상황을 설명하는 값 exitflag와 최적화 과정에 대한 정보가 포함된 구조체 output을 추가로 반환합니다.

[x,fval,exitflag,output,grad,hessian] = fminunc(___)는 추가로 다음을 반환합니다.

  • grad — 해 x에서의 fun의 기울기입니다.

  • hessian — 해 x에서의 fun의 헤세 행렬입니다. fminunc 헤세 행렬 항목을 참조하십시오.

예제

모두 축소

함수 f(x)=3x12+2x1x2+x22-4x1+5x2를 최소화합니다.

이를 위해 목적 함수를 계산하는 익명 함수 fun을 작성합니다.

fun = @(x)3*x(1)^2 + 2*x(1)*x(2) + x(2)^2 - 4*x(1) + 5*x(2);

fminunc를 호출하여 [1,1] 근방에서 fun의 최솟값을 구합니다.

x0 = [1,1];
[x,fval] = fminunc(fun,x0)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

    2.2500   -4.7500

fval = -16.3750

fminunc는 사용자가 도함수를 제공하는 경우 더 빠르고 더 안정적일 수 있습니다.

기울기는 물론, 함수 값도 반환하는 목적 함수를 작성합니다. 기울기와 헤세 행렬 포함시키기에 설명되어 있는 조건화된 형식을 사용합니다. 목적 함수는 다음과 같은 로젠브록 함수(Rosenbrock Function)이며,

f(x)=100(x2-x12)2+(1-x1)2,

기울기는 다음과 같습니다.

f(x)=[-400(x2-x12)x1-2(1-x1)200(x2-x12)].

기울기가 있는 목적 함수의 코드는 이 예제의 마지막 부분에 나와 있습니다.

목적 함수의 기울기를 사용하도록 옵션을 만듭니다. 또한, 알고리즘을 'trust-region'으로 설정합니다.

options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);

초기점을 [-1,2]로 설정합니다. 그런 다음, fminunc를 호출합니다.

x0 = [-1,2];
fun = @rosenbrockwithgrad;
x = fminunc(fun,x0,options)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

    1.0000    1.0000

다음 코드는 기울기를 두 번째 출력값으로 포함하는 rosenbrockwithgrad 함수를 생성합니다.

function [f,g] = rosenbrockwithgrad(x)
% Calculate objective f
f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;

if nargout > 1 % gradient required
    g = [-400*(x(2)-x(1)^2)*x(1) - 2*(1-x(1));
        200*(x(2)-x(1)^2)];
end
end

개별 인수 대신 문제 구조체를 사용하여 기울기 제공하기에 나와 있는 것과 동일한 문제를 풉니다.

기울기는 물론, 함수 값도 반환하는 목적 함수를 작성합니다. 기울기와 헤세 행렬 포함시키기에 설명되어 있는 조건화된 형식을 사용합니다. 목적 함수는 다음과 같은 로젠브록 함수(Rosenbrock Function)이며,

f(x)=100(x2-x12)2+(1-x1)2,

기울기는 다음과 같습니다.

f(x)=[-400(x2-x12)x1-2(1-x1)200(x2-x12)].

기울기가 있는 목적 함수의 코드는 이 예제의 마지막 부분에 나와 있습니다.

목적 함수의 기울기를 사용하도록 옵션을 만듭니다. 또한, 알고리즘을 'trust-region'으로 설정합니다.

options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);

초기점 x0 = [-1,2]를 포함하는 문제 구조체를 만듭니다. 이 구조체의 필수 필드는 problem 항목을 참조하십시오.

problem.options = options;
problem.x0 = [-1,2];
problem.objective = @rosenbrockwithgrad;
problem.solver = 'fminunc';

문제를 풉니다.

x = fminunc(problem)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

    1.0000    1.0000

다음 코드는 기울기를 두 번째 출력값으로 포함하는 rosenbrockwithgrad 함수를 생성합니다.

function [f,g] = rosenbrockwithgrad(x)
% Calculate objective f
f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;

if nargout > 1 % gradient required
    g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));
        200*(x(2)-x(1)^2)];
end
end

비선형 함수가 최소가 되는 위치와 그 위치에서의 함수 값을 모두 구합니다. 목적 함수는 다음과 같습니다.

f(x)=x(1)e-x22+x22/20.

fun = @(x)x(1)*exp(-(x(1)^2 + x(2)^2)) + (x(1)^2 + x(2)^2)/20;

x0 = [1,2]에서 시작하여 최소점의 위치와 목적 함수 값을 구합니다.

x0 = [1,2];
[x,fval] = fminunc(fun,x0)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

   -0.6691    0.0000

fval = -0.4052

풀이 과정을 검토하려면 fminunc 옵션과 출력값을 선택해야 합니다.

반복 과정을 표시하고 'quasi-newton' 알고리즘을 사용하도록 옵션을 설정합니다.

options = optimoptions(@fminunc,'Display','iter','Algorithm','quasi-newton');

목적 함수는 다음과 같습니다.

f(x)=x(1)e-x22+x22/20.

fun = @(x)x(1)*exp(-(x(1)^2 + x(2)^2)) + (x(1)^2 + x(2)^2)/20;

x0 = [1,2]에서 최소화를 시작하고 해의 품질과 풀이 과정을 검토할 수 있는 출력값을 얻습니다.

x0 = [1,2];
[x,fval,exitflag,output] = fminunc(fun,x0,options)
                                                        First-order 
 Iteration  Func-count       f(x)        Step-size       optimality
     0           3         0.256738                         0.173
     1           6         0.222149              1          0.131  
     2           9          0.15717              1          0.158  
     3          18        -0.227902       0.438133          0.386  
     4          21        -0.299271              1           0.46  
     5          30        -0.404028       0.102071         0.0458  
     6          33        -0.404868              1         0.0296  
     7          36        -0.405236              1        0.00119  
     8          39        -0.405237              1       0.000252  
     9          42        -0.405237              1       7.97e-07  

Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

   -0.6691    0.0000

fval = -0.4052
exitflag = 1
output = struct with fields:
       iterations: 9
        funcCount: 42
         stepsize: 2.9343e-04
     lssteplength: 1
    firstorderopt: 7.9721e-07
        algorithm: 'quasi-newton'
          message: 'Local minimum found....'

  • 종료 플래그 1은 해가 국소 최적해임을 보여줍니다.

  • output 구조체는 반복 횟수와 함수 실행 횟수, 그리고 기타 정보를 표시합니다.

  • 반복 횟수와 함수 실행 횟수도 반복 과정에 표시됩니다.

문제에 변수가 많은 경우 HessianApproximation의 디폴트 값을 사용하면 fminunc가 대용량의 메모리를 사용하고 느리게 실행될 수 있습니다. 메모리를 더 적게 사용하고 실행 속도를 높이려면 HessianApproximation="lbfgs"를 지정하십시오.

예를 들어, 디폴트 파라미터를 사용하여 1e5개의 변수를 갖는 multirosenbrock 함수(아래 나열됨)를 최소화하려고 하면 fminunc가 오류를 발생시킵니다.

N = 1e5;
x0 = -2*ones(N,1);
x0(2:2:N) = 2;
[x,fval] = fminunc(@multirosenbrock,x0)
Error using eye
Requested 100000x100000 (74.5GB) array exceeds maximum array size preference (63.9GB). This might cause MATLAB to become
unresponsive.

Error in optim.internal.fminunc.AbstractDenseHessianApproximation (line 21)
        this.Value = eye(nVars);

Error in optim.internal.fminunc.BFGSHessianApproximation (line 14)
        this = this@optim.internal.fminunc.AbstractDenseHessianApproximation(nVars);

Error in fminusub (line 73)
    HessApprox = optim.internal.fminunc.BFGSHessianApproximation(sizes.nVar);

Error in fminunc (line 488)
   [x,FVAL,GRAD,HESSIAN,EXITFLAG,OUTPUT] = fminusub(funfcn,x, ...

이 문제를 풀려면 HessianApproximation 옵션을 "lbfgs"로 설정하십시오. 풀이 속도를 높이려면 제공된 기울기를 사용하도록 옵션을 설정하십시오.

N = 1e5;
x0 = -2*ones(N,1);
x0(2:2:N) = 2;
options = optimoptions("fminunc",HessianApproximation="lbfgs",...
    SpecifyObjectiveGradient=true);
[x,fval] = fminunc(@multirosenbrock,x0,options);
Local minimum found.

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

모든 i에 대해 이론적인 해는 x(i) = 1입니다. 반환된 해의 정확도를 확인합니다.

max(abs(x-1))
ans =

   1.3795e-04

다음 코드는 multirosenbrock 함수를 생성합니다.

function [f,g] = 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); 
f = sum(F.^2);
if nargout >= 2 % Calculate gradient
    g = zeros(n,1);
    g(evens) = 200*(x(evens)-x(odds).^2);
    g(odds) = -2*(1 - x(odds)) - 400*(x(evens)-x(odds).^2).*x(odds);
end
end

입력 인수

모두 축소

최소화할 함수로, 함수 핸들이나 함수 이름으로 지정됩니다. fun은 벡터 또는 배열 x를 받고 실수형 스칼라 f를 반환하는 함수입니다. 즉, x에서 계산되는 목적 함수입니다.

fminunc 함수는 xx0 인수 형태로 목적 함수에 전달합니다. 예를 들어, x0이 5×3 배열이면 fminunc 함수는 x를 5×3 배열로 fun에 전달합니다.

다음과 같이 fun을 파일에 대한 함수 핸들로 지정합니다.

x = fminunc(@myfun,x0)

여기서 myfun은 다음과 같은 MATLAB® 함수입니다.

function f = myfun(x)
f = ...            % Compute function value at x

다음과 같이 fun을 익명 함수에 대한 함수 핸들로 지정할 수도 있습니다.

x = fminunc(@(x)norm(x)^2,x0);

fun의 기울기를 계산할 수 있고 다음 설정처럼 SpecifyObjectiveGradient 옵션이 true로 설정된 경우

options = optimoptions('fminunc','SpecifyObjectiveGradient',true)
fun은 두 번째 출력 인수에 기울기 벡터 g(x)를 반환해야 합니다.

헤세 행렬도 계산할 수 있고 options = optimoptions('fminunc','HessianFcn','objective')를 통해 HessianFcn 옵션이 'objective'로 설정되어 있고 Algorithm 옵션이 'trust-region'으로 설정된 경우, fun은 세 번째 출력 인수로 대칭 행렬인 헤세 행렬 값 H(x)를 반환해야 합니다. fun은 희소 헤세 행렬을 제공할 수 있습니다. 자세한 내용은 fminunc의 trust-region 알고리즘 또는 fmincon의 trust-region-reflective 알고리즘에 대한 헤세 행렬 항목을 참조하십시오.

trust-region 알고리즘에서는 사용자가 헤세 행렬의 곱셈 함수를 제공할 수 있습니다. 이 함수는 헤세 행렬을 직접 계산하지 않고 헤세 행렬과 벡터의 곱에 대한 결과를 제공합니다. 따라서 메모리를 절약할 수 있습니다. 헤세 행렬의 곱셈 함수 항목을 참조하십시오.

예: fun = @(x)sin(x(1))*cos(x(2))

데이터형: char | function_handle | string

초기점으로, 실수형 벡터나 실수형 배열로 지정됩니다. 솔버는 x0의 요소 개수와 x0의 크기를 사용하여 fun이 받는 변수의 개수와 크기를 확인합니다.

예: x0 = [1,2,3,4]

데이터형: double

최적화 옵션으로, optimoptions의 출력값 또는 optimset 등이 반환하는 구조체로 지정됩니다.

옵션에 따라 모든 알고리즘에 적용되는 옵션이 있고 특정 알고리즘에만 유효한 옵션이 있습니다. 자세한 내용은 최적화 옵션 참조 항목을 참조하십시오.

일부 옵션은 optimoptions 표시에 나타나지 않습니다. 이러한 옵션은 다음 표에서 기울임꼴로 표시되어 있습니다. 자세한 내용은 최적화 옵션 보기 항목을 참조하십시오.

모든 알고리즘

Algorithm

fminunc 알고리즘을 선택합니다. 'quasi-newton'(디폴트 값) 또는 'trust-region'을 선택할 수 있습니다.

'trust-region' 알고리즘을 사용하는 경우 기울기를 제공해야 하며(fun의 설명 참조), 그렇지 않을 경우 fminunc'quasi-newton' 알고리즘을 사용합니다. 알고리즘을 선택하는 방법에 대한 자세한 내용은 알고리즘 선택하기 항목을 참조하십시오.

CheckGradients

사용자 제공 도함수(목적 함수의 기울기)를 유한 차분 도함수와 비교합니다. false(디폴트 값) 또는 true를 선택할 수 있습니다.

optimset의 경우, 이 이름은 DerivativeCheck이고 값은 'on' 또는 'off'입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

CheckGradients 옵션은 향후 릴리스에서 제거될 예정입니다. 도함수를 검사하려면 checkGradients 함수를 사용하십시오.

Diagnostics

최소화하거나 풀려는 함수에 대한 진단 정보를 표시합니다. 'off'(디폴트 값) 또는 'on'을 선택할 수 있습니다.

DiffMaxChange

유한 차분 기울기에 대한 변수의 최대 변화량입니다(양의 스칼라). 디폴트 값은 Inf입니다.

DiffMinChange

유한 차분 기울기에 대한 변수의 최소 변화량입니다(양의 스칼라). 디폴트 값은 0입니다.

Display

표시 수준입니다(반복 과정 표시 참조):

  • 'off' 또는 'none'은 출력값을 표시하지 않습니다.

  • 'iter'는 각 반복마다 출력값을 표시하고 디폴트 종료 메시지를 제공합니다.

  • 'iter-detailed'는 각 반복마다 출력값을 표시하고 기술적인 종료 메시지를 제공합니다.

  • 'notify'는 함수가 수렴하지 않는 경우에만 출력값을 표시하고 디폴트 종료 메시지를 제공합니다.

  • 'notify-detailed'는 함수가 수렴하지 않는 경우에만 출력값을 표시하고 기술적인 종료 메시지를 제공합니다.

  • 'final'(디폴트 값)은 최종 출력값만 표시하고 디폴트 종료 메시지를 제공합니다.

  • 'final-detailed'는 최종 출력값만 표시하고 기술적인 종료 메시지를 제공합니다.

FiniteDifferenceStepSize

유한 차분에 대한 스칼라 또는 벡터 스텝 크기 인자입니다. FiniteDifferenceStepSize를 벡터 v로 설정하는 경우 전향 유한 차분 delta는 다음과 같습니다.

delta = v.*sign′(x).*max(abs(x),TypicalX);

여기서 sign′(x) = sign(x)입니다(단, sign′(0) = 1임). 중심 유한 차분은 다음과 같습니다.

delta = v.*max(abs(x),TypicalX);

스칼라 FiniteDifferenceStepSize는 벡터로 확장됩니다. 디폴트 값은 전향 유한 차분의 경우 sqrt(eps)이고 중심 유한 차분의 경우 eps^(1/3)입니다.

trust-region 알고리즘은 CheckGradientstrue로 설정된 경우에만 FiniteDifferenceStepSize를 사용합니다.

optimset의 경우, 이 이름은 FinDiffRelStep입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

FiniteDifferenceType

기울기를 추정하는 데 사용되는 유한 차분으로, 'forward'(디폴트 값) 또는 'central'(중심화됨)입니다. 'central'은 함수 실행 횟수가 2배 더 많지만 더 정확합니다. trust-region 알고리즘은 CheckGradientstrue로 설정된 경우에만 FiniteDifferenceType을 사용합니다.

optimset의 경우, 이 이름은 FinDiffType입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

FunValCheck

목적 함수 값이 유효한지 여부를 확인합니다. 디폴트 설정 'off'는 검사를 수행하지 않습니다. 'on' 설정은 목적 함수가 complex, Inf 또는 NaN 값을 반환하는 경우에 오류를 표시합니다.

MaxFunctionEvaluations

허용되는 최대 함수 실행 횟수로, 양의 정수입니다. 디폴트 값은 100*numberOfVariables입니다. 허용오차와 중지 기준 항목과 반복 횟수와 함수 실행 횟수 항목을 참조하십시오.

optimset의 경우, 이 이름은 MaxFunEvals입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

MaxIterations

허용되는 최대 반복 횟수로, 양의 정수입니다. 디폴트 값은 400입니다. 허용오차와 중지 기준 항목과 반복 횟수와 함수 실행 횟수 항목을 참조하십시오.

optimset의 경우, 이 이름은 MaxIter입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

OptimalityTolerance

1차 최적성에 대한 종료 허용오차입니다(양의 스칼라). 디폴트 값은 1e-6입니다. 1차 최적성 측정값 항목을 참조하십시오.

optimset의 경우, 이 이름은 TolFun입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

OutputFcn

각 반복마다 최적화 함수가 호출하는 하나 이상의 사용자 정의 함수를 지정합니다. 함수 핸들 또는 함수 핸들 셀형 배열을 전달합니다. 디폴트 값은 없음([])입니다. Output Function and Plot Function Syntax 항목을 참조하십시오.

PlotFcn

알고리즘이 실행되는 동안 다양한 진행률 측정값을 플로팅합니다. 미리 정의된 플롯에서 선택하거나 사용자가 직접 작성할 수 있습니다. 내장 플롯 함수 이름, 함수 핸들 또는 내장 플롯 함수 이름이나 함수 핸들로 구성된 셀형 배열을 전달하십시오. 사용자 지정 플롯 함수의 경우, 함수 핸들을 전달하십시오. 디폴트 값은 없음([])입니다.

  • 'optimplotx'는 현재 점을 플로팅합니다.

  • 'optimplotfunccount'는 함수 실행 횟수를 플로팅합니다.

  • 'optimplotfval'은 함수 값을 플로팅합니다.

  • 'optimplotstepsize'는 스텝 크기를 플로팅합니다.

  • 'optimplotfirstorderopt'는 1차 최적성 측정값을 플로팅합니다.

사용자 지정 플롯 함수는 출력 함수와 동일한 구문을 사용합니다. Optimization Toolbox의 출력 함수 항목과 Output Function and Plot Function Syntax 항목을 참조하십시오.

optimset의 경우, 이 이름은 PlotFcns입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

SpecifyObjectiveGradient

사용자가 정의하는 목적 함수의 기울기입니다. fun에 기울기를 정의하는 방법을 보려면 fun에 대한 설명을 참조하십시오. fminunc가 목적 함수에 대한 사용자 정의 기울기를 사용하도록 하려면 true로 설정하십시오. 디폴트 값 false를 사용하면 fminunc가 유한 차분을 사용하여 기울기를 추정합니다. trust-region 알고리즘을 사용하려면 기울기를 제공하고 SpecifyObjectiveGradienttrue로 설정해야 합니다. quasi-Newton 알고리즘에는 이 옵션이 필요하지 않습니다.

optimset의 경우, 이 이름은 GradObj이고 값은 'on' 또는 'off'입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

StepTolerance

x에 대한 종료 허용오차로, 양의 스칼라입니다. 디폴트 값은 1e-6입니다. 허용오차와 중지 기준 항목을 참조하십시오.

optimset의 경우, 이 이름은 TolX입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

TypicalX

일반적인 x 값입니다. TypicalX의 요소 개수는 시작점 x0의 요소 개수와 같습니다. 디폴트 값은 ones(numberofvariables,1)입니다. fminunc는 기울기 추정을 위해 유한 차분을 스케일링하는 데 TypicalX를 사용합니다.

trust-region 알고리즘은 CheckGradients 옵션에 대해서만 TypicalX를 사용합니다.

trust-region 알고리즘
FunctionTolerance

함수 값에 대한 종료 허용오차로, 양의 스칼라입니다. 디폴트 값은 1e-6입니다. 허용오차와 중지 기준 항목을 참조하십시오.

optimset의 경우, 이 이름은 TolFun입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

HessianFcn

[](디폴트 값)로 설정된 경우, fminunc는 유한 차분을 사용하여 헤세 행렬의 근삿값을 계산합니다.

'objective'로 설정된 경우, fminunc는 목적 함수에 대해 사용자 정의 헤세 행렬을 사용합니다. 헤세 행렬은 목적 함수의 세 번째 출력값입니다(fun 참조).

optimset의 경우, 이 이름은 HessFcn입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

HessianMultiplyFcn

헤세 행렬의 곱셈 함수로, 함수 핸들로 지정됩니다. 특정 구조를 가진 대규모 문제의 경우, 이 함수는 H를 실제로 구성하지 않고 헤세 행렬 곱 H*Y를 계산합니다. 이 함수의 형식은 다음과 같습니다.

W = hmfun(Hinfo,Y)

여기서 HinfoH*Y를 계산하는 데 사용되는 행렬을 포함합니다.

첫 번째 인수는 목적 함수 fun이 반환하는 세 번째 인수와 같습니다. 예를 들어 다음과 같습니다.

[f,g,Hinfo] = fun(x)

Y는 문제의 차원과 동일한 개수의 행을 갖는 행렬입니다. 행렬 W = H*Y입니다. 단, H가 명시적으로 구성되지는 않습니다. fminuncHinfo를 사용하여 선조건자를 계산합니다. hmfun에 필요한 추가 파라미터의 값을 제공하는 방법에 대한 자세한 내용은 추가 파라미터 전달하기 항목을 참조하십시오.

참고

HessianMultiplyFcn 옵션을 사용하려면 HessianFcn[]로 설정되어야 합니다.

예제는 Minimization with Dense Structured Hessian, Linear Equalities 항목을 참조하십시오.

optimset의 경우, 이 이름은 HessMult입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

HessPattern

유한 차분에 대한 헤세 행렬의 희소성 패턴입니다. ∂2fun/∂x(i)x(j) ≠ 0이 성립하는 경우 HessPattern(i,j) = 1을 설정합니다. 그렇지 않은 경우 HessPattern(i,j) = 0을 설정합니다.

HessPatternfun의 헤세 행렬 H를 계산하는 것이 번거롭고 fun의 기울기의 i번째 성분이 x(j)에 종속된다는 사실은 (조사를 통해) 확인할 수 있는 경우에 사용합니다. H희소성 구조HessPattern의 값으로 제공하는 경우 fminunc는 (기울기의) 희소 유한 차분을 통해 H의 근삿값을 계산할 수 있습니다. 다시 말해서 0이 아닌 성분의 위치를 제공합니다.

구조를 알 수 없는 경우 HessPattern을 설정하지 마십시오. 이 경우 기본적으로 HessPattern이 1로 구성된 조밀 행렬인 것처럼 동작합니다. 그러면 fminunc가 각 반복마다 비희소 유한 차분 근삿값을 계산합니다. 이 계산 과정은 대규모 문제의 경우 시간이 오래 걸릴 수 있으므로 희소성 구조를 확인하는 것이 일반적으로 더 좋습니다.

MaxPCGIter

최대 선조건 적용 켤레 기울기(PCG) 반복 횟수로, 양의 스칼라입니다. 디폴트 값은 max(1,floor(numberOfVariables/2))입니다. 자세한 내용은 신뢰 영역 알고리즘 항목을 참조하십시오.

PrecondBandWidth

PCG에 대한 선조건자의 상부 대역폭으로, 음이 아닌 정수입니다. 기본적으로, fminunc는 대각 선조건 지정을 사용합니다(상부 대역폭: 0). 일부 문제에서는 대역폭을 늘리면 PCG 반복 횟수가 줄어듭니다. PrecondBandWidthInf로 설정하면 켤레 기울기(CG)가 아닌 직접 분해(촐레스키)가 사용됩니다. 직접 분해는 CG보다 계산량이 더 많지만 해에 다가가는 데 있어 더 나은 품질의 스텝을 생성합니다.

SubproblemAlgorithm

반복 스텝이 계산되는 방식을 결정합니다. 디폴트 값 'cg''factorization'보다 더 빠르지만 정확도가 떨어지는 스텝을 실행합니다. fminunc의 trust-region 알고리즘 항목을 참조하십시오.

TolPCG

PCG 반복에 대한 종료 허용오차로, 양의 스칼라입니다. 디폴트 값은 0.1입니다.

quasi-newton 알고리즘
HessianApproximation

fminunc 함수가 헤세 행렬을 계산하는 방법을 지정합니다. 선택 가능한 설정은 다음과 같습니다.

  • "bfgs"(디폴트 값)

  • "lbfgs"

  • {"lbfgs",Positive Integer}

설정 "lbfgs"{"lbfgs",10}과 동일합니다. 즉, 디폴트 "lbfgs" 메모리 값이 10입니다. 많은 변수를 갖는 문제에는 "lbfgs"를 사용하십시오. Solve Nonlinear Problem with Many Variables 항목을 참조하십시오.

optimset의 경우, 이 옵션 이름은 HessUpdate이고 값은 "bfgs", "lbfgs", {"lbfgs",Positive Integer}, "dfp""steepdesc"입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

참고

일반적으로, "dfp""steepdesc" 값은 잘 동작하지 않습니다. 이들 값은 교육용으로 제공되는 것입니다. 바나나 함수 최소화 항목을 참조하십시오.

ObjectiveLimit

허용오차(중지 기준)로, 스칼라입니다. 반복에서 계산된 목적 함수 값이 ObjectiveLimit보다 작거나 같으면 반복이 중단됩니다. 문제가 비유계이기 때문일 수 있습니다. 디폴트 값은 -1e20입니다.

UseParallel

true인 경우 fminunc는 기울기를 병렬로 추정합니다. 디폴트 값 false로 설정하면 비활성화됩니다. trust-region에서는 목적 함수에 기울기를 제공해야 하므로, UseParallel이 적용되지 않습니다. 병렬 연산 항목을 참조하십시오.

예: options = optimoptions('fminunc','SpecifyObjectiveGradient',true)

문제 구조체로, 다음 필드를 가진 구조체로 지정됩니다.

필드 이름항목

objective

목적 함수

x0

x의 초기점

solver

'fminunc'

options

optimoptions로 생성되는 옵션

데이터형: struct

출력 인수

모두 축소

해로, 실수형 벡터나 실수형 배열로 반환됩니다. x의 크기는 x0의 크기와 같습니다. 일반적으로 xexitflag가 양수인 경우 문제에 대한 국소해입니다. 해의 품질에 대한 자세한 내용은 솔버가 성공한 경우 항목을 참조하십시오.

해에서 계산된 목적 함수 값으로, 실수로 반환됩니다. 일반적으로 fval = fun(x)입니다.

fminunc가 중지된 이유로, 정수로 반환됩니다.

1

기울기 크기가 OptimalityTolerance 허용오차보다 작습니다.

2

x의 변화량이 StepTolerance 허용오차보다 작습니다.

3

목적 함수 값의 변화량이 FunctionTolerance 허용오차보다 작습니다.

5

목적 함수의 예측된 감소량이 FunctionTolerance 허용오차보다 작습니다.

0

반복 횟수가 MaxIterations를 초과하거나, 함수 실행 횟수가 MaxFunctionEvaluations를 초과했습니다.

-1

출력 함수에 의해 알고리즘이 종료되었습니다.

-3

현재 반복에서 목적 함수가 ObjectiveLimit 아래로 떨어졌습니다.

최적화 과정에 대한 정보로, 다음 필드를 가진 구조체로 반환됩니다.

iterations

수행된 반복 횟수

funcCount

함수 실행 횟수

firstorderopt

1차 최적성에 대한 측정값

algorithm

사용된 최적화 알고리즘

cgiterations

총 PCG 반복 횟수('trust-region' 알고리즘만 해당)

lssteplength

탐색 방향을 기준으로 한 직선 탐색 스텝의 크기('quasi-newton' 알고리즘만 해당)

stepsize

x의 최종 변위

message

종료 메시지

해에서의 기울기로, 실수 벡터로 반환됩니다. grad는 점 x(:)에서 fun의 기울기를 제공합니다.

근사 헤세 행렬로, 실수 행렬로 반환됩니다. hessian의 의미는 헤세 행렬 출력값 항목을 참조하십시오.

HessianApproximation 옵션이 "lbfgs" 또는 {"lbfgs" n}인 경우 반환되는 hessian[]입니다.

데이터형: double

알고리즘

모두 축소

Quasi-Newton 알고리즘

기본적으로 quasi-newton 알고리즘은 3차 직선 탐색 절차와 함께 BFGS 준뉴턴(Quasi-Newton) 방법을 사용합니다. 이 준뉴턴 방법은 헤세 행렬의 근삿값을 업데이트하는 데 BFGS([1],[5],[8], [9]) 식을 사용합니다. HessianApproximation 옵션으로 low-memory BFGS 알고리즘("lbfgs")을 지정할 수도 있습니다. 권장되지는 않지만, 이 옵션을 'dfp'로 설정하여 역헤세 행렬의 근사를 구하는 DFP([4], [6], [7]) 식을 지정할 수 있습니다. 이 옵션을 'steepdesc'로 설정하여 최속강하법을 지정할 수 있습니다. 하지만 이 설정은 일반적으로 비효율적입니다. fminunc의 quasi-newton 알고리즘 항목을 참조하십시오.

신뢰 영역 알고리즘

trust-region 알고리즘을 사용하는 경우 fun에 기울기를 제공하고 optimoptions를 사용하여 SpecifyObjectiveGradienttrue로 설정해야 합니다. 이 알고리즘은 부분공간 trust-region 방법이며 interior-reflective 뉴턴 방법([2][3]에 설명되어 있음)을 기반으로 합니다. 각 반복에는 선조건 적용 켤레 기울기(PCG) 방법을 사용한 대규모 선형 시스템의 근사해 풀이 작업이 포함됩니다. fminunc의 trust-region 알고리즘, 비선형 최소화를 위한 Trust-Region 방법, 선조건 적용 켤레 기울기법(Preconditioned Conjugate Gradient Method) 항목을 참조하십시오.

대체 기능

최적화 라이브 편집기 작업은 fminunc에 대한 시각적 인터페이스를 제공합니다.

참고 문헌

[1] Broyden, C. G. “The Convergence of a Class of Double-Rank Minimization Algorithms.” Journal Inst. Math. Applic., Vol. 6, 1970, pp. 76–90.

[2] Coleman, T. F. and Y. Li. “An Interior, Trust Region Approach for Nonlinear Minimization Subject to Bounds.” SIAM Journal on Optimization, Vol. 6, 1996, pp. 418–445.

[3] Coleman, T. F. and Y. Li. “On the Convergence of Reflective Newton Methods for Large-Scale Nonlinear Minimization Subject to Bounds.” Mathematical Programming, Vol. 67, Number 2, 1994, pp. 189–224.

[4] Davidon, W. C. “Variable Metric Method for Minimization.” A.E.C. Research and Development Report, ANL-5990, 1959.

[5] Fletcher, R. “A New Approach to Variable Metric Algorithms.” Computer Journal, Vol. 13, 1970, pp. 317–322.

[6] Fletcher, R. “Practical Methods of Optimization.” Vol. 1, Unconstrained Optimization, John Wiley and Sons, 1980.

[7] Fletcher, R. and M. J. D. Powell. “A Rapidly Convergent Descent Method for Minimization.” Computer Journal, Vol. 6, 1963, pp. 163–168.

[8] Goldfarb, D. “A Family of Variable Metric Updates Derived by Variational Means.” Mathematics of Computing, Vol. 24, 1970, pp. 23–26.

[9] Shanno, D. F. “Conditioning of Quasi-Newton Methods for Function Minimization.” Mathematics of Computing, Vol. 24, 1970, pp. 647–656.

확장 기능

버전 내역

R2006a 이전에 개발됨

모두 확장