Main Content

솔버가 실패한 경우

반복 횟수나 함수 실행 횟수가 너무 많음

솔버가 요청된 허용오차까지 목적 함수를 최소화하기 전에 반복 횟수나 함수 실행 횟수 제한에 도달했기 때문에 중지되었습니다. 계속 진행하려면 다음 중 하나 이상을 시도해 보십시오.

1. 반복 과정 표시 활성화하기
2. 허용오차 완화시키기
3. 다른 점에서 솔버 시작하기
4. 목적 함수와 제약 조건 함수 정의 확인하기
5. 문제 정규화하기
6. 기울기 또는 야코비 행렬 제공하기
7. 헤세 행렬 제공하기

1. 반복 과정 표시 활성화하기

Display 옵션을 'iter'로 설정하십시오. 이 설정은 솔버 반복의 결과를 표시합니다.

MATLAB® 명령줄에서 반복 과정 표시를 사용하려면 다음을 입력하십시오.

options = optimoptions('solvername','Display','iter');

options 구조체를 사용하여 솔버를 호출합니다.

반복 과정 표시에 대한 예제는 결과 해석하기 항목을 참조하십시오.

반복 과정 표시에서 확인할 사항

  • 목적 함수(Fval 또는 f(x) 또는 Resnorm)가 감소하는지 여부를 확인하십시오. 감소할 경우 제대로 진행되고 있음을 나타냅니다.

  • 제약 조건 위반 값(Max constraint)을 검토하여 0 방향으로 감소하는지 확인하십시오. 감소할 경우 제대로 진행되고 있음을 나타냅니다.

  • 1차 최적성이 0 방향으로 감소하는지 여부를 확인하십시오. 감소할 경우 제대로 진행되고 있음을 나타냅니다.

  • Trust-region radius가 작은 값으로 감소하는지 여부를 확인하십시오. 이렇게 감소할 경우 목적 함수가 매끄럽지 않을 수 있다는 것을 나타냅니다.

수행할 작업

  • 솔버가 제대로 진행되고 있는 것처럼 보이는 경우:

    1. MaxIterations 및/또는 MaxFunctionEvaluations를 디폴트 값보다 큰 값으로 설정하십시오. 솔버의 함수 도움말 페이지의 옵션 표에서 디폴트 값을 확인할 수 있습니다.

    2. 마지막으로 계산한 점에서부터 솔버를 시작합니다.

  • 솔버가 진행되고 있지 않을 경우 여기에 나열된 다른 권장 사항을 시도해 보십시오.

2. 허용오차 완화시키기

예를 들어, StepTolerance 또는 OptimalityTolerance가 너무 작은 경우 솔버가 최솟값에 도달한 때를 인식하지 못할 수 있으며 이로 인해 무의미한 반복을 무한정 실행할 수 있습니다.

명령줄에서 허용오차를 변경하려면 최적화 옵션 설정 및 변경하기에 설명된 대로 optimoptions를 사용하십시오.

FiniteDifferenceStepSize 옵션(또는 DiffMaxChange 옵션과 DiffMinChange 옵션)은 솔버의 진행 상황에 영향을 미칠 수 있습니다. 이러한 옵션은 도함수 추정값에 대한 유한 차분의 스텝 크기를 제어합니다.

3. 다른 점에서 솔버 시작하기

초기점 변경을 참조하십시오.

4. 목적 함수와 제약 조건 함수 정의 확인하기

예를 들어, 목적 함수와 비선형 제약 조건 함수가 몇몇 점에서 올바른 값을 반환하는지 확인합니다. 목적 함수와 제약 조건 함수 확인하기를 참조하십시오. 실현불가능점으로 인해 함수에 오류가 발생하지 않는지 확인합니다. 반복이 제약 조건을 위반할 수 있음 항목을 참조하십시오.

5. 문제 정규화하기

각 좌표가 목적 함수와 제약 조건 함수에 거의 동일한 영향을 미치는 경우 솔버가 더 안정적으로 실행됩니다. 좌표 방향에 적합한 스칼라를 곱하여 각 좌표의 영향을 같게 만듭니다. 특정 좌표에 적합한 값을 더하여 각 좌표의 크기를 같게 만듭니다.

예: 정규화하기.  다음과 같이 1e6*x(1)^2 + 1e-6*x(2)^2을 최소화하는 경우를 살펴봅니다.

f = @(x) 10^6*x(1)^2 + 10^-6*x(2)^2;

다음과 같이 fminunc'quasi-newton' 알고리즘을 사용하여 f를 최소화합니다.

opts = optimoptions('fminunc','Display','none','Algorithm','quasi-newton');
x = fminunc(f,[0.5;0.5],opts)

x =
         0
    0.5000

결과가 잘못되었습니다. 잘못된 스케일링으로 인해 양호한 해를 얻는 데 방해가 되었습니다.

문제를 스케일링합니다. 다음을 설정하십시오.

D = diag([1e-3,1e3]);
fr = @(y) f(D*y);
y = fminunc(fr, [0.5;0.5], opts)

y =
     0
     0 % the correct answer

이와 마찬가지로, 중심화가 잘못되면 해를 구하는 데 방해가 될 수 있습니다.

fc = @(z)fr([z(1)-1e6;z(2)+1e6]); % poor centering
z = fminunc(fc,[.5 .5],opts)

z =
  1.0e+005 *
   10.0000  -10.0000 % looks good, but...

z - [1e6 -1e6] % checking how close z is to 1e6

ans =

   -0.0071    0.0078 % reveals a distance


fcc = @(w)fc([w(1)+1e6;w(2)-1e6]); % centered

w = fminunc(fcc,[.5 .5],opts)

w =
     0     0 % the correct answer

6. 기울기 또는 야코비 행렬 제공하기

기울기 또는 야코비 행렬을 제공하지 않으면 솔버가 유한 차분으로 기울기와 야코비 행렬을 추정합니다. 따라서, 이러한 도함수를 제공하면 계산 시간을 절약하고 정확도를 높일 수 있습니다. 문제 기반 접근법에서는 기울기가 자동으로 제공될 수 있습니다. Automatic Differentiation in Optimization Toolbox 항목을 참조하십시오.

제약 조건이 있는 문제에 대해 기울기를 제공하면 또 다른 이점을 얻을 수 있습니다. 솔버는 x가 실현가능점이 되는 x에 도달할 수 있지만, x 주위의 유한 차분으로 인해 항상 실현불가능점에 이르게 됩니다. 이 경우, 솔버가 실패하거나 도중에 중단될 수 있습니다. 기울기를 제공하면 솔버가 계속 진행할 수 있습니다.

목적 함수와 비선형 제약 조건 함수의 파일에 기울기 또는 야코비 행렬을 제공하십시오. 구문에 대한 자세한 내용은 스칼라 목적 함수 작성하기, 벡터 및 행렬 목적 함수 작성하기, 비선형 제약 조건 항목을 참조하십시오.

기울기 또는 야코비 행렬 함수가 올바른지 확인하려면 Checking Validity of Gradients or Jacobians에 설명된 대로 checkGradients 함수를 사용하십시오.

Symbolic Math Toolbox™ 라이선스가 있는 경우 기울기와 헤세 행렬을 프로그래밍 방식으로 계산할 수 있습니다. 예제는 Calculate Gradients and Hessians Using Symbolic Math Toolbox 항목을 참조하십시오.

기울기와 야코비 행렬을 사용하는 예제는 기울기와 헤세 행렬을 사용한 최소화, 기울기가 포함된 비선형 제약 조건, Calculate Gradients and Hessians Using Symbolic Math Toolbox, 비선형 시스템을 야코비 행렬을 사용하지 않고 풀거나 사용하여 풀기, Large Sparse System of Nonlinear Equations with Jacobian 항목을 참조하십시오. 문제 기반 접근법에서의 자동 미분에 대한 자세한 내용은 Effect of Automatic Differentiation in Problem-Based Optimization 항목을 참조하십시오.

7. 헤세 행렬 제공하기

헤세 행렬을 제공하는 경우 솔버가 대개 더 안정적으로 실행되고 반복 횟수가 더 적습니다.

헤세 행렬을 받는 솔버와 알고리즘은 다음과 같습니다.

Symbolic Math Toolbox 라이선스가 있는 경우 기울기와 헤세 행렬을 프로그래밍 방식으로 계산할 수 있습니다. 예제는 Calculate Gradients and Hessians Using Symbolic Math Toolbox 항목을 참조하십시오. 문제 기반 접근법에서 헤세 행렬을 제공하려면 Supply Derivatives in Problem-Based Workflow 항목을 참조하십시오.

실현불가능점으로 수렴됨

일반적으로, 이 결과는 솔버가 ConstraintTolerance 허용오차 내에서 모든 제약 조건을 충족하는 점을 찾을 수 없기 때문에 발생합니다. 하지만, 솔버가 실현가능점을 찾았거나 실현가능점에서 시작했는데 실현불가능점으로 수렴되었을 수 있습니다. 솔버가 실현가능성을 잃어버린 경우 솔버가 실현가능성을 잃음 항목을 참조하십시오. quadprog가 이 결과를 반환하는 경우 quadprog가 실현불가능점으로 수렴됨 항목을 참조하십시오.

솔버가 실현가능점을 발견하지 못한 경우 계속 진행하려면 다음 중 하나 이상을 시도해 보십시오.

1. 선형 제약 조건 확인하기
2. 비선형 제약 조건 확인하기

1. 선형 제약 조건 확인하기

선형 계획법 문제를 풀어 범위와 선형 제약 조건을 충족하는 점을 찾아보십시오.

  1. 다음과 같이 항상 값이 0인 목적 함수를 사용하여 선형 계획법 문제를 정의합니다.

    f = zeros(size(x0)); % assumes x0 is the initial point
  2. 선형 계획법 문제를 풀어 실현가능점이 있는지 봅니다.

    xnew = linprog(f,A,b,Aeq,beq,lb,ub);
  3. 실현가능점 xnew가 있으면 xnew를 초기점으로 사용하여 원래 문제를 다시 실행합니다.

  4. 실현가능점이 없으면 문제가 제대로 정식화되지 않은 것입니다. 범위와 선형 제약 조건의 정의를 확인하십시오. 선형 제약 조건을 확인하는 방법에 대한 자세한 내용은 Investigate Linear Infeasibilities 항목을 참조하십시오.

2. 비선형 제약 조건 확인하기

범위와 선형 제약 조건이 실현 가능(모든 제약 조건을 충족하는 하나의 점을 포함함)하다는 것을 확인했으면 비선형 제약 조건을 확인해야 합니다.

  • 다음과 같이 목적 함수를 0으로 설정합니다.

    @(x)0

    모든 제약 조건을 적용하고 값이 0인 목적 함수를 사용하여 최적화를 실행합니다. 실현가능점 xnew를 찾으면 x0 = xnew를 설정하고 원래 문제를 다시 실행하십시오.

  • 값이 0인 목적 함수를 사용하여 실현가능점을 찾지 못할 경우 여러 개의 초기점으로 값이 0인 목적 함수를 사용하십시오.

    • 실현가능점 xnew를 찾으면 x0 = xnew를 설정하고 원래 문제를 다시 실행하십시오.

    • 실현가능점을 찾지 못한 경우 EnableFeasibilityMode 옵션을 true로 설정하고 SubproblemAlgorithm 옵션을 'cg'로 설정하여 fmincon을 사용해 보십시오(Obtain Solution Using Feasibility Mode 참조). 이러한 옵션을 사용하는 여러 개의 초기점을 시도해 보십시오.

    • 여전히 실현가능점을 찾지 못한 경우 제약 조건을 완화해 보십시오. 이에 대해서는 다음에 설명되어 있습니다.

비선형 부등식 제약 조건을 완화시켜 본 다음 강화시켜 봅니다.

  1. c-Δ를 반환하도록 비선형 제약 조건 함수 c를 변경합니다. 여기서 Δ는 양수입니다. 이렇게 변경하면 비선형 제약 조건을 더욱 쉽게 충족하게 됩니다.

  2. 원래 목적 함수 또는 값이 0인 목적 함수를 사용하여 새 제약 조건 함수에 대한 실현가능점을 찾습니다.

    1. 실현가능점을 찾으면 다음을 수행하십시오.

      1. Δ를 줄입니다.

      2. 앞에서 발견한 점부터 시작하여 새 제약 조건 함수에 대한 실현가능점을 찾습니다.

    2. 실현가능점을 찾지 못한 경우 Δ를 높이고 다시 확인해 보십시오.

실현가능점을 찾지 못한 경우 문제가 정말로 실현 가능하지 않은 것일 수 있으며, 이는 해가 존재하지 않음을 의미합니다. 모든 제약 조건 정의를 다시 확인하십시오.

솔버가 실현가능성을 잃음

솔버가 실현가능점에서 시작했지만 실현불가능점으로 수렴된 경우 다음 기법을 사용해 보십시오.

  • 다른 알고리즘을 사용해 봅니다. fmincon'sqp' 알고리즘과 'interior-point' 알고리즘이 일반적으로 가장 견고하므로 그중 하나 또는 둘 모두를 사용해 보십시오.

  • 범위를 줄입니다. 할 수 있는 한 가장 큰 lb 벡터와 가장 작은 ub 벡터를 제공합니다. 그러면 솔버가 실현가능성을 유지하는 데 도움이 될 수 있습니다. fmincon'sqp' 알고리즘과 'interior-point' 알고리즘은 매 반복마다 범위를 따르므로 범위를 줄이면 최적화 작업 전체에 도움이 됩니다.

quadprog가 실현불가능점으로 수렴됨

일반적으로, 이 메시지는 선형 제약 조건이 모순되거나 특이 행렬에 가깝기 때문에 표시됩니다. 실현가능점이 존재하는지 확인하려면 제약 조건은 그대로 유지하되 값이 0인 목적 함수 벡터 f를 사용하여 선형 계획법 문제를 만드십시오. 다음과 같이 linprog'dual-simplex' 알고리즘을 사용하여 문제를 풉니다.

options = optimoptions('linprog','Algorithm','dual-simplex');
x = linprog(f,A,b,Aeq,beq,lb,ub,options)

linprog가 실현가능점을 찾지 못하면 문제가 정말로 실현 불가능한 것입니다.

linprog가 실현가능점을 찾는다면 다른 quadprog 알고리즘을 사용해 보십시오. 또는, StepTolerance 또는 ConstraintTolerance와 같은 허용오차를 변경하고 문제를 다시 푸십시오.

비유계 문제

목적 함수가 목적 제한 허용오차보다 작은 점에 솔버가 도달했습니다.

  • 문제가 정말로 비유계 문제일 수 있습니다. 즉, 다음을 충족하는 일련의 점 xi가 있고

    lim f(xi) = –∞.

    그리고 모든 xi가 문제 제약 조건을 충족하는 것입니다.

  • 문제가 올바르게 정식화되었는지 확인하십시오. 솔버는 목적 함수를 최소화하려고 합니다. 최댓값을 원한다면 목적 함수의 부호를 변환하십시오. 예제는 목적 함수 최대화하기 항목을 참조하십시오.

  • 문제를 스케일링 또는 중심화해 봅니다. 문제 정규화하기를 참조하십시오.

  • optimoptions를 사용하여 ObjectiveLimit 허용오차의 값을 줄여 목적 제한 허용오차를 완화시킵니다.

fsolve가 방정식을 풀 수 없음

fsolve는 다양한 이유로 방정식을 풀지 못할 수 있습니다 진행 방법에 대한 몇 가지 권장 사항은 다음과 같습니다.

  1. 초기점 변경하기를 시도해 봅니다. fsolve는 초기점에 의존합니다. 여러 다른 초기점을 제공하면 성공 가능성을 높일 수 있습니다.

  2. 방정식에 대한 정의를 점검하여 매끄러운지 확인합니다. fsolve는 절댓값과 같은 불연속 기울기를 갖는 방정식에 대해 수렴하지 못할 수 있습니다. fsolve는 불연속 지점을 갖는 함수에 대해 수렴하지 못할 수 있습니다.

  3. 방정식이 “정사각”인지 확인합니다. 이는 입력값과 출력값의 차원이 같음(방정식의 수와 동일한 개수의 미지수를 가짐)을 의미합니다.

  4. 허용오차, 특히 OptimalityToleranceStepTolerance를 변경하십시오. 허용오차를 매우 작은 값으로 설정하여 정확도를 높이려고 하는 경우 fsolve가 수렴하지 못할 수 있습니다. 허용오차를 너무 높게 설정하면 fsolve가 방정식을 정확히 풀지 못할 수 있습니다.

  5. 문제 정의를 확인합니다. 문제에 따라 실수 해를 갖지 않는 경우가 있습니다(예: x^2 + 1 = 0). 복소수 해를 허용할 수 있다면 초기점을 복소수 값으로 설정해 보십시오. fsolve는 초기점이 실수일 때 복소수 해를 찾으려고 하지 않습니다.

관련 항목