MATLAB

MATLAB의 fmincon 함수로 최적화 문제 풀기

qlsenddl 2020. 4. 13. 18:50
728x90

1. fmincon: Optimization 문제를 풀 때 사용하는 MATLAB 함수

최적화 문제의 기본 형식

2. MATLAB에서의 기본적인 설명

1) 기본 문법(syntax)

('help fmincon' 입력 시 나오는 내용)

fmincon - 제약 조건이 있는 비선형 다변수 함수의 최솟값 구하기
비선형 계획법 솔버입니다.
    x = fmincon(fun,x0,A,b)
    x = fmincon(fun,x0,A,b,Aeq,beq)
    x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
    x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
    x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
    x = fmincon(problem)
    [x,fval] = fmincon(___)
    [x,fval,exitflag,output] = fmincon(___)
    [x,fval,exitflag,output,lambda,grad,hessian] = fmincon(___)

 

2) input 변수 설명

- fun: 목적함수 -> 함수 호출 방법을 따름: m파일을 정의한 문자열, 함수 핸들, 익명(Anonymous) 함수로 정의된 함수명 등

   ex: 'CostFunc', fun = @CostFunc, fun = @(x) x(1)*x(2) + x(1) + 2*x(2) -6;

- x0: 초기값, 배열 형태로 정의 ex: x0 = [1, 1];

- A: 선형 부등식에서의 행렬

- b: 선형 부등식에서의 벡터

   -> 즉, A*x≤b

- Aeq: 선형 방정식에서의 행렬

- beq: 선형 방정식에서의 벡터

   -> 즉, Aeq*x=beq

- lb(lower bound): 벡터 x의 각 구성요소들의 최소값

- ub(upper bound): 벡터 x의 각 구성요소들의 최대값

   ex: x = [x1, x2, x3]이고 0x1≤10,  -1≤x2≤9, -10≤x3≤5이면, lb=[0, -1, -10], ub=[10, 9, 5]

- nonlcon: constraint 함수 -> 함수 호출 방법을 따름: m파일을 정의한 문자열, 함수 핸들, 익명(Anonymous) 함수로 정의된 함수명 등

   ex: 'ConstFunc', fun = @ConstFunc, fun = @(x) x(1)*x(2) + x(1) + 2*x(2) -6;

- options: optimset 또는 optimoptions로 정의된 struct 구조체 배열

   ex: options = optimset('LargeScale', 'off', 'GradObj', 'on', 'GradConstr', 'on', 'TolCon', 1e-8, 'TolX', 1e-8);

   ex: options = optimoptions('Display', 'iter', 'Algorithm', 'sqp');

 

※ linear constraint가 없으면 A, b, Aeq, beq는 [ ]로 처리한다.

 

3) output 변수 설명

- x: 최적의 x값, optimum solution

- fval: optimum solution에서의 cost function(=object function)의 값

- exitflag: 종료 상황을 설명하는 값으로 해가 local minimum이면 1의 값을 가짐.

- output: iteration, stepsize, algorithm 등의 내용(최적화 과정에 대한 내용)을 담은 struct 구조체 배열

- lambda: optimum solution에서의 선형 방.부등식, 비선형 방.부등식, lower bound, upper bound의 정보를 담은 구조체 배열

- grad: optimum solution에서의 cost function의 기울기 행렬

- hessian: optimum solution에서의 cost function의 헤세 행렬(Hessian 행렬)

 

3. 목적함수를 정의하는 m파일 구성 예시

function [f, gf] = CostFunc(x)

f = x(1) + x(2) + x(3)     % object function 정의

if nargout > 1

    gf(1,1) = 1;             %gf는 gradient of object function

    gf(2,1) = 2;

    gf(3,1) = 3;

end

 

※ nargout: 현재 실행 중인 함수를 호출 시 지정된 함수의 출력 인수 개수 -> 즉 위 예시에서는 gf의 값까지 출력 인수로 지정이 된 경우 gf값을 계산하도록 한다.

 

4. constraint 함수를 정의하는 m파일 구성 예시

-> nonlinear한 constraint의 경우 직접 m파일로 함수를 정의한 후 사용(linear한 constraint는 A, b, Aeq, beq 사용)

function [g, h, gg, gh] = Ex_const(x)  
g(1) = x(1)^2 - x(2)^2;                    % nonlinear inequality constraint
g(2) = (x(1)+1)^2 + (x(2)-2)^2 + 1;  % nonlinear inequality constraint
h = x(1)*x(2)-1;                             % nonlinear equality constraint
if nargout > 2
    gg(1,1) = 2*x(1);                         % gradient of nonlinear inequality constraint -> gg(a, b) = g(b)/∂x(a)
    gg(2,1) = -2*x(2);
    gg(1,2) = 2*(x(1)+1);
    gg(2,2) = 2*(x(2)-2);
    gh(1,1) = x(2);                               % gradient of nonlinear equality constraint

    gh(2,1) = x(1);
end

 

예제1 - linear constraint 문제

1-1. 목적 함수 정의

 % ObjFunc.m file
 function [f, gf] = ObjFunc(x)
 x1 = x(1); x2 = x(2);
 f = -x1-x2;
 if nargout > 1
     gf(1,1) = -1;
     gf(2,1) = -1;
 end

1-2. fmincon 사용하기

 x0 = [0, 0];
 fun = @ObjFunc;
 A = [2, 3; 2, 1];
 b = [12; 8];
 Aeq = [];
 beq = [];
 lb = [0, 0];
 ub = [inf, inf];
 [x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub)

 

예제2 - nonlinear constraint 문제

2-1. 목적 함수 정의

 % ObjFunc.m file

 function [f, gf] = ObjFunc(x)
 f = x(1)*x(2);            %Cost Func
 if nargout > 1
     gf(1,1) = x(2);
     gf(2,1) = x(1);
 end

2-2. constraint 함수 정의

 % ConstFunc.m file

 function [g, h, gg, gh] = ConstFunc(x)
 g(1) = x(1)+x(2)^2;
 g(2) = x(1)^2+x(2)^2-9;
 h = [];
 if nargout > 2
     gg(1,1) = 1;
     gg(2,1) = 2*x(2);
     gg(1,2) = 2*x(1);
     gg(2,2) = 2*x(2);
     gh = [];
 end

2-3. fmincon 사용하기

 % Set bounds
 Lb = []; Ub = [];

 % Set initial design

 x0 = [-1, -1];  % fmincon
 [x, Funval, ExitFlag, Output, lambda, grad, hessian] = fmincon('ObjFunc', x0, [ ], [ ], [ ], [ ], Lb, Ub, 'ConstFunc')

728x90