Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

솔버가 성공한 경우

솔버가 성공하더라도 잘못된 사항이 있을 수 있나요?

솔버가 최소화에 성공했다고 보고할 수 있지만, 보고된 해가 정확하지 않을 수 있습니다. 비교적 자명한 예제로서, 다음과 같이 점 1/3에서 시작하여 –2와 2 사이의 x에 대해 함수 f(x) = x3을 최소화한다고 가정하겠습니다.

options = optimoptions('fmincon','Algorithm','active-set');
ffun = @(x)x^3;
xfinal = fmincon(ffun,1/3,[],[],[],[],-2,2,[],options)         

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is
non-decreasing in feasible directions, to within the default  
valueof the function tolerance, and constraints were satisfied 
to within the default value of the constraint tolerance.

No active inequalities.

xfinal =
 -1.5056e-008

참 최솟값은 x = -2에서 발생합니다. fmincon이 위와 같이 보고하는 이유는 함수 f(x)가 x = 0 근처에서 상당히 평탄하기 때문입니다.

흔히 볼 수 있는 또 다른 문제는 솔버가 국소 최솟값을 구했지만 필요한 것은 전역 최솟값인 경우입니다. 자세한 내용은 국소 최적해와 전역 최적해 항목을 참조하십시오.

교훈: 솔버가 국소 최솟값을 “찾았다”거나 방정식을 “풀었다”고 보고하더라도 결과를 확인하십시오.

이 섹션에서는 결과를 확인하는 기법에 대해 설명합니다.

1. 초기점 변경하기

초기점은 해에 커다란 영향을 미칠 수 있습니다. 다양한 초기점으로부터 동일하거나 더 부정확한 해를 얻는다면 자신이 구한 해를 더 확신할 수 있게 됩니다.

예를 들어, 다음과 같이 점 1/4에서 시작하여 f(x) = x3 + x4을 최소화합니다.

ffun = @(x)x^3 + x^4;
options = optimoptions('fminunc','Algorithm','quasi-newton');
[xfinal fval] = fminunc(ffun,1/4,options)

Local minimum found.

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

x =
 -1.6764e-008

fval =
 -4.7111e-024

초기점을 조금 변경하면 솔버가 더 나은 해를 구합니다.

[xfinal fval] = fminunc(ffun,1/4+.001,options)

Local minimum found.

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

xfinal =
   -0.7500

fval =
   -0.1055

x = -0.75는 전역해이므로, 다른 점에서 시작해도 해가 개선되지 못합니다.

자세한 내용은 국소 최적해와 전역 최적해 항목을 참조하십시오.

2. 주변에 있는 점 확인하기

보고된 해보다 더 나은 값이 있는지 확인하기 위해 주변에 있는 다양한 점에서 목적 함수와 제약 조건을 실행합니다.

예를 들어 다음과 같이 솔버가 성공하더라도 잘못된 사항이 있을 수 있나요? 항목의 목적 함수 ffun과 최종점 xfinal = -1.5056e-008을 사용하여 어떤 Δ에 대해 ffun(xfinal±Δ)를 계산합니다.

delta = .1;
[ffun(xfinal),ffun(xfinal+delta),ffun(xfinal-delta)]

ans =
   -0.0000    0.0011   -0.0009

목적 함수의 값이 ffun(xfinal-Δ)에서 더 낮습니다. 따라서 솔버가 부정확한 해를 보고한 것입니다.

비교적 자명하지 않은 예제:

options = optimoptions(@fmincon,'Algorithm','active-set');
lb = [0,-1]; ub = [1,1];
ffun = @(x)(x(1)-(x(1)-x(2))^2);
[x fval exitflag] = fmincon(ffun,[1/2 1/3],[],[],[],[],...
                           lb,ub,[],options)

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is
non-decreasing in feasible directions, to within the default  
valueof the function tolerance, and constraints were satisfied 
to within the default value of the constraint tolerance.

Active inequalities (to within options.ConstraintTolerance = 1e-006):
  lower      upper     ineqlin   ineqnonlin
    1                                 

x =
  1.0e-007 *
         0    0.1614

fval =
 -2.6059e-016

exitflag =
     1

주변에 있는 실현가능점에서 ffun을 실행하면 해 x가 참 최솟값이 아님을 알 수 있습니다.

[ffun([0,.001]),ffun([0,-.001]),...
    ffun([.001,-.001]),ffun([.001,.001])]

ans =
  1.0e-003 *
   -0.0010   -0.0010    0.9960    1.0000

나열된 처음 두 개의 값은 계산된 최솟값 fval보다 작습니다.

Global Optimization Toolbox 라이선스가 있으면 patternsearch (Global Optimization Toolbox) 함수를 사용하여 근처에 있는 점을 확인할 수 있습니다.

3. 목적 함수와 제약 조건 함수 확인하기

목적 함수와 제약 조건 함수를 이중으로 확인하여, 풀려는 문제에 이들 함수가 대응되는지 확인합니다. 제안 사항은 다음과 같습니다.

  • 몇몇 점에서 목적 함수의 값을 확인합니다.

  • 각 부등식 제약 조건의 부호가 올바른지 확인합니다.

  • 최대화를 수행한 경우 보고된 해에 음을 취해야 합니다. (이 제안은 사용자가 목적 함수에 음을 취해 함수를 최대화했다고 가정합니다.) 예를 들어 f(x) = x – x2을 최대화하려면 다음과 같이 g(x) = –x + x2을 최소화합니다.

    options = optimoptions('fminunc','Algorithm','quasi-newton');
    [x fval] = fminunc(@(x)-x+x^2,0,options)
    
    Local minimum found.
    
    Optimization completed because the size of the gradient is 
    less than the default value of the function tolerance.
    
    x =
        0.5000
    
    fval =
       -0.2500

    f의 최댓값은 fval의 값에 음을 취한 0.25입니다.

  • 실현불가능점으로 인해 함수에 오류가 발생하지 않는지 확인합니다. 반복이 제약 조건을 위반할 수 있음 항목을 참조하십시오.