Main Content

기울기가 포함된 비선형 제약 조건

이 예제에서는 도함수 정보를 사용하여 비선형 제약 조건이 있는 비선형 문제를 푸는 방법을 보여줍니다.

보통 최소화 루틴은 유한 차분 근사로 계산된 수치적 기울기를 사용합니다. 이 절차에서는 함수와 제약 조건 편도함수를 계산하기 위해 각 변수를 체계적으로 섭동합니다. 또는 편도함수를 해석적으로 계산하기 위한 함수를 제공할 수 있습니다. 일반적으로 도함수 정보를 제공하면 솔버가 보다 정확하고 효율적으로 작동합니다.

목적 함수와 비선형 제약 조건

다음 방정식을 푸는 문제입니다.

minxf(x)=ex1(4x12+2x22+4x1x2+2x2+1),

여기에는 다음 제약 조건이 적용됩니다.

x1x2-x1-x2-1.5x1x2-10.

fmincon 솔버에서 제약 조건을 c(x) 0 형식으로 작성하도록 요구하기 때문에, 다음 값을 반환하는 제약 조건 함수를 작성합니다.

c(x)=[x1x2-x1-x2+1.5-10-x1x2].

기울기가 있는 목적 함수

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

f(x)=ex1(4x12+2x22+4x1x2+2x2+1).

변수 x1x2에 대한 f(x)의 기울기를 계산합니다.

f(x)=[f(x)+exp(x1)(8x1+4x2)exp(x1)(4x1+4x2+2)].

이 예제의 마지막 부분에 있는 objfungrad 헬퍼 함수가 목적 함수 f(x)와 해당 기울기(두 번째 출력값 gradf에 반환)를 모두 반환합니다. @objfungrad를 목적 함수로 설정합니다.

fun = @objfungrad;

기울기가 있는 제약 조건 함수

헬퍼 함수 confungrad는 비선형 제약 조건 함수로, 이 예제의 마지막 부분에 나와 있습니다.

부등식 제약 조건에 대한 도함수 정보의 경우 각 열이 하나의 제약 조건에 대응됩니다. 다시 말해서, 제약 조건의 기울기는 다음 형식으로 되어 있습니다.

[c1x1c2x1c1x2c2x2]=[x2-1-x2x1-1-x1].

@confungrad를 비선형 제약 조건 함수로 설정합니다.

nonlcon = @confungrad;

도함수 정보를 사용하기 위한 옵션 설정하기

fmincon 솔버에 목적 함수와 제약 조건 함수가 도함수 정보를 제공한다는 점을 나타냅니다. 이를 위해 optimoptions를 사용하여 SpecifyObjectiveGradientSpecifyConstraintGradient 옵션 값을 true로 설정합니다.

options = optimoptions('fmincon',...
    'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true);

문제 풀기

초기점을 [-1,1]로 설정합니다.

x0 = [-1,1];

문제에 범위 또는 선형 제약 조건이 없으므로, 이러한 인수 값을 []로 설정합니다.

A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];

fmincon을 호출하여 문제를 풉니다.

[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
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 = 1×2

   -9.5473    1.0474

fval = 0.0236

해는 도함수 정보를 사용하지 않고 문제를 푼 예제 비선형 부등식 제약 조건에서와 동일합니다. 이 예제에서는 분명히 드러나지 않지만, 도함수 사용 시 이점은 문제를 풀 때 함수 실행 횟수는 더 적으면서도 견고성이 확보된다는 점입니다. 해석적 헤세 행렬을 사용하는 fmincon Interior-Point 알고리즘에서처럼, 도함수 정보를 더 많이 사용하면 솔버 반복 횟수가 줄어드는 등 더 많은 이점을 얻게 됩니다.

헬퍼 함수

다음 코드는 objfungrad 헬퍼 함수를 생성합니다.

function [f,gradf] = objfungrad(x)
f = exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);
% Gradient of the objective function:
if nargout  > 1
    gradf = [ f + exp(x(1)) * (8*x(1) + 4*x(2)), 
    exp(x(1))*(4*x(1)+4*x(2)+2)];
end
end

다음 코드는 confungrad 헬퍼 함수를 생성합니다.

function [c,ceq,DC,DCeq] = confungrad(x)
c(1) = 1.5 + x(1) * x(2) - x(1) - x(2); % Inequality constraints
c(2) = -x(1) * x(2)-10; 
% No nonlinear equality constraints
ceq=[];
% Gradient of the constraints:
if nargout > 2
    DC= [x(2)-1, -x(2);
        x(1)-1, -x(1)];
    DCeq = [];
end
end

관련 항목