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

제약 조건이 있는 비선형 문제 풀기, 솔버 기반

일반적인 최적화 문제

이 예제에서는 Optimization Toolbox™ 솔버를 사용하여 제약 조건이 있는 비선형 문제를 푸는 방법을 보여줍니다. 이 예제에서는 목적 함수를 생성하고, 제약 조건을 생성하고, 문제를 풀고, 결과를 검토하는 일반적인 워크플로를 설명합니다.

이 문제에 대한 문제 기반 접근법은 Solve a Constrained Nonlinear Problem, Problem-Based 항목을 참조하십시오.

문제 정식화: 로젠브록 함수(Rosenbrock Function)

단위 원판, 즉 원점을 중심으로 하고 반지름이 1인 원 안의 영역에서 로젠브록 함수를 최소화하는 문제를 살펴보겠습니다.

f(x)=100(x2x12)2+(1x1)2,

즉, 집합 x12+x221의 영역에서 함수 f(x)를 최소화하는 x를 구한다는 의미입니다. 이 문제는 비선형 제약 조건이 있는 비선형 함수를 최소화하는 문제입니다.

참고

로젠브록 함수는 최적화 분야에서 일반적인 테스트 함수입니다. 이 함수는 점 [1,1]에서 고유한 최솟값 0을 가집니다. 이 함수는 깊게 굽은 밸리 내에서 얕은 최솟값을 갖기 때문에 일부 알고리즘에서는 최솟값을 구하는 것이 쉽지 않을 수 있습니다. 이 문제의 해는 점 [1,1]에 있지 않는데 그 이유는 이 점은 제약 조건을 충족하지 않기 때문입니다.

다음 Figure는 단위 원판에서 로젠브록 함수의 두 가지 보기를 보여줍니다. 세로 축은 로그 스케일링되었습니다. 즉, 이 플롯은 log(1+f(x))를 보여줍니다. 등고선은 곡면 플롯 아래에 있습니다.

로젠브록 함수, 로그 스케일링됨: 두 가지 보기.

 Figure 생성에 사용된 코드

함수 f(x)목적 함수라고 합니다. 목적 함수는 최소화하고자 하는 함수입니다. 부등식 x12+x221제약 조건이라고 합니다. 제약 조건은 솔버가 최솟값을 탐색하는 대상이 되는 x의 집합을 제한합니다. 제약 조건은 부등식 또는 방정식으로 지정되는데 사용자는 제약 조건의 수를 원하는 만큼 지정할 수 있습니다.

모든 Optimization Toolbox 최적화 함수는 목적 함수를 최소화합니다. 함수 f를 최대화하려면 –f를 최소화하는 최적화 루틴을 적용하십시오. 최대화에 대한 자세한 내용은 목적 함수 최대화하기 항목을 참조하십시오.

툴박스의 구문으로 문제 정의하기

Optimization Toolbox를 사용하려면 다음과 같이 문제를 표현하십시오.

  1. MATLAB® 언어에서 목적 함수를 함수 파일 또는 익명 함수로 정의합니다. 이 예제에서는 함수 파일을 사용합니다.

  2. 개별 파일 또는 익명 함수로 제약 조건을 정의합니다.

목적 함수를 정의하는 함수 파일

함수 파일은 MATLAB 명령을 포함하는 텍스트 파일이며 .m 확장자를 가집니다. 아무 텍스트 편집기에서 함수 파일을 생성하거나 이 예제와 같이 내장된 MATLAB 편집기를 사용할 수 있습니다.

  1. 명령줄에서 다음을 입력합니다.

    edit rosenbrock
  2. MATLAB 편집기에서 다음을 입력합니다.

    %% ROSENBROCK(x) expects a two-column matrix and returns a column vector
    % The output is the Rosenbrock function, which has a minimum at
    % (1,1) of value 0, and is strictly positive everywhere else.
    
    function f = rosenbrock(x)
    
    f = 100*(x(:,2) - x(:,1).^2).^2 + (1 - x(:,1)).^2;

    참고

    rosenbrock은 여러 점의 값을 한 번에 계산할 수 있는 벡터화된 함수입니다. 벡터화 (MATLAB) 항목을 참조하십시오. 벡터화된 함수는 플로팅하는 데 가장 적합합니다. 벡터화되지 않은 함수를 원하면 다음을 입력하십시오.

    %% ROSENBROCK1(x) expects a two-element vector and returns a scalar
    % The output is the Rosenbrock function, which has a minimum at
    % (1,1) of value 0, and is strictly positive everywhere else.
    
    function f = rosenbrock1(x)
    
    f = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
  3. 이름을 rosenbrock.m으로 하여 파일을 저장합니다.

제약 조건을 정의하는 함수 파일

제약 조건 함수는 c(x) ≤ 0 또는 ceq(x) = 0. 형식을 갖습니다. 제약 조건 x12+x221은 솔버가 취급하는 형식이 아닙니다. 올바른 구문을 지정하려면 제약 조건을 x12+x2210으로 다시 작성하십시오.

또한, 비선형 제약 조건 구문은 등식 제약 조건과 부등식 제약 조건을 모두 반환합니다. 이 예제는 부등식 제약 조건만 포함하므로 빈 배열 []을 등식 제약 조건 함수 ceq로 전달해야 합니다.

이러한 고려 사항을 염두에 두고 비선형 제약 조건을 정의하는 함수 파일을 작성하십시오.

  1. 다음 코드를 포함하는 unitdisk.m이라는 이름의 파일을 만듭니다.

    function [c,ceq] = unitdisk(x)
    c = x(1)^2 + x(2)^2 - 1;
    ceq = [ ];
  2. 파일 unitdisk.m을 저장합니다.

최적화 실행하기

최적화를 실행하는 방법에는 다음 두 가지가 있습니다.

최적화 앱을 사용하여 로젠브록 함수 최소화하기

참고

최적화 앱은 향후 릴리스에서 제거될 예정입니다. 이에 대한 대안은 Optimization App Alternatives 항목을 참조하십시오.

  1. 명령줄에 optimtool을 입력하여 최적화 앱을 시작합니다. 이 툴에 대한 자세한 내용은 최적화 앱 항목을 참조하십시오.

    디폴트 솔버(Solver)fmincon - 제약 조건이 있는 비선형 최소화(fmincon - Constrained nonlinear minimization)가 선택되어 있습니다. 로젠브록 함수는 비선형이고 문제에 제약 조건이 있으므로 이 솔버는 이 문제에 적합합니다. 솔버 선택에 대한 자세한 내용은 최적화 의사 결정표 항목을 참조하십시오.

    디폴트 알고리즘(Algorithm)Interior point도 선택되어 있습니다.

  2. 목적 함수(Objective function) 상자에 @rosenbrock을 입력합니다. @ 문자는 파일 rosenbrock.m함수 핸들 (MATLAB)을 나타냅니다.

  3. 시작점(Start point) 상자에 [0 0]을 입력하여 fmincon이 최솟값 탐색을 시작하는 초기점을 지정합니다.

  4. 비선형 제약 조건 함수(Nonlinear constraint function) 상자에 unitdisk.m의 함수 핸들을 나타내는 @unitdisk를 입력합니다.

    문제 설정 및 결과(Problem Setup and Results) 창이 아래 그림과 일치하는지 확인합니다.

  5. 옵션(Options) 창의 맨 아래에 있는 명령 창에 표시(Display to Command Window)에서 표시 수준(Level of display)의 목록 중 모든 반복(Iterations)을 선택합니다. 이 옵션이 보이지 않는 경우 명령 창에 표시(Display to Command Window)를 클릭하십시오. 이 설정은 명령 창에 fmincon의 진행 상황을 표시합니다.

  6. 문제 설정 및 결과(Problem Setup and Results) 창의 솔버 실행 및 결과 보기(Run solver and view results) 아래에서 시작(Start)을 클릭합니다.

다음 메시지가 솔버 실행 및 결과 보기(Run solver and view results) 상자에 표시됩니다.

Optimization running.
Objective function value: 0.04567482475812774
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
목적 함수 값은 컴퓨터 시스템 및 Optimization Toolbox의 버전에 따라 약간 다를 수 있습니다.

이 메시지는 다음을 알려줍니다.

  • 목적 함수의 도함수가 제약 조건으로 허용되는 방향에서 거의 0에 가까우므로 제약 조건이 있는 최적값 탐색이 종료되었습니다.

  • 제약 조건이 필수 정확도를 충족합니다.

문제 설정 및 결과(Problem Setup and Results) 창 맨 아래의 최종점(Final point) 아래에 최소점 x가 나타납니다. 종료 메시지에 대한 자세한 내용은 종료 플래그와 종료 메시지 항목을 참조하십시오.

명령줄에서 로젠브록 함수 최소화하기

동일한 최적화를 명령줄에서 실행할 수 있습니다.

  1. 반복 과정 표시 화면과 interior-point 알고리즘을 선택하는 options 구조체를 만듭니다.

    options = optimoptions(@fmincon,...
        'Display','iter','Algorithm','interior-point');
  2. 최소점의 위치 x와 목적 함수로 얻은 값 fval 모두를 보고하는 options 구조체와 함께 fmincon 솔버를 실행합니다.

    [x,fval] = fmincon(@rosenbrock,[0 0],...
        [],[],[],[],[],[],@unitdisk,options)

    빈 대괄호 여섯 쌍은 이 예제에서 사용되지 않는 선택적 제약 조건을 나타냅니다. 구문은 fmincon 함수 도움말 페이지를 참조하십시오.

MATLAB은 반복 과정과 최적화 결과로 구성된 표를 출력합니다.

Local minimum found that satisfies the constraints.

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

x =
    0.7864    0.6177

fval =
    0.0457

이 메시지는 목적 함수의 도함수가 제약 조건으로 허용되는 방향에서 거의 0에 가까우므로 제약 조건이 있는 최적값 탐색이 종료되었으며 제약 조건이 필수 정확도를 충족함을 알려줍니다. 이 메시지는 메시지에서 사용된 용어에 대한 자세한 정보를 제공하는 여러 링크를 담고 있습니다. 이러한 링크에 대한 자세한 내용은 향상된 종료 메시지 항목을 참조하십시오.

결과 해석하기

명령 창에 표시된 반복 과정을 나타낸 표는 MATLAB이 단위 원판에서 로젠브록 함수의 최솟값을 탐색한 방식을 보여줍니다. 이 표는 최적화 앱을 사용하든지 또는 명령줄을 사용하든지 관계없이 동일합니다. MATLAB은 다음과 같이 최소화를 보고합니다.

                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
    0       3    1.000000e+00    0.000e+00    2.000e+00
    1      13    7.753537e-01    0.000e+00    6.250e+00    1.768e-01
    2      18    6.519648e-01    0.000e+00    9.048e+00    1.679e-01
    3      21    5.543209e-01    0.000e+00    8.033e+00    1.203e-01
    4      24    2.985207e-01    0.000e+00    1.790e+00    9.328e-02
    5      27    2.653799e-01    0.000e+00    2.788e+00    5.723e-02
    6      30    1.897216e-01    0.000e+00    2.311e+00    1.147e-01
    7      33    1.513701e-01    0.000e+00    9.706e-01    5.764e-02
    8      36    1.153330e-01    0.000e+00    1.127e+00    8.169e-02
    9      39    1.198058e-01    0.000e+00    1.000e-01    1.522e-02
   10      42    8.910052e-02    0.000e+00    8.378e-01    8.301e-02
   11      45    6.771960e-02    0.000e+00    1.365e+00    7.149e-02
   12      48    6.437664e-02    0.000e+00    1.146e-01    5.701e-03
   13      51    6.329037e-02    0.000e+00    1.883e-02    3.774e-03
   14      54    5.161934e-02    0.000e+00    3.016e-01    4.464e-02
   15      57    4.964194e-02    0.000e+00    7.913e-02    7.894e-03
   16      60    4.955404e-02    0.000e+00    5.462e-03    4.185e-04
   17      63    4.954839e-02    0.000e+00    3.993e-03    2.208e-05
   18      66    4.658289e-02    0.000e+00    1.318e-02    1.255e-02
   19      69    4.647011e-02    0.000e+00    8.006e-04    4.940e-04
   20      72    4.569141e-02    0.000e+00    3.136e-03    3.379e-03
   21      75    4.568281e-02    0.000e+00    6.437e-05    3.974e-05
   22      78    4.568281e-02    0.000e+00    8.000e-06    1.083e-07
   23      81    4.567641e-02    0.000e+00    1.601e-06    2.793e-05
   24      84    4.567482e-02    0.000e+00    1.996e-08    6.916e-06

표시되는 표는 툴박스 버전과 컴퓨팅 플랫폼에 따라 다를 수 있습니다. 다음은 위에 표시된 표에 적용되는 설명입니다.

  • Iter라는 레이블이 지정된 첫 번째 열은 0에서 24까지의 반복 횟수입니다. fmincon은 수렴하기까지 24회의 반복을 거쳤습니다.

  • F-count라는 레이블이 지정된 두 번째 열은 로젠브록 함수가 실행된 누적 횟수를 보고합니다. 마지막 행은 F-count가 84임을 보여주며, 이는 fmincon이 최솟값을 구하는 과정에서 로젠브록 함수를 84회 실행했음을 나타냅니다.

  • f(x)라는 레이블이 지정된 세 번째 열은 목적 함수의 값을 표시합니다. 최종 값 0.04567482는 최적화 앱의 솔버 실행 및 결과 보기(Run solver and view results) 상자에서 보고된 최솟값이며 명령 창의 종료 메시지 끝에 있습니다.

  • 네 번째 열 Feasibility는 모든 반복에 대해 0입니다. 이 열은 제약 조건이 양수인 각 반복에서 제약 조건 함수 unitdisk의 값을 보여줍니다. unitdisk의 값이 모든 반복에서 음수였기 때문에 매 반복마다 제약 조건을 충족했습니다.

반복 테이블의 다른 열에 대해서는 반복 과정 표시에 설명되어 있습니다.

참고 항목

관련 항목