기울기가 포함된 비선형 제약 조건
이 예제에서는 도함수 정보를 사용하여 비선형 제약 조건이 있는 비선형 문제를 푸는 방법을 보여줍니다.
보통 최소화 루틴은 유한 차분 근사로 계산된 수치적 기울기를 사용합니다. 이 절차에서는 함수와 제약 조건 편도함수를 계산하기 위해 각 변수를 체계적으로 섭동합니다. 또는 편도함수를 해석적으로 계산하기 위한 함수를 제공할 수 있습니다. 일반적으로 도함수 정보를 제공하면 솔버가 보다 정확하고 효율적으로 작동합니다.
목적 함수와 비선형 제약 조건
다음 방정식을 푸는 문제입니다.
여기에는 다음 제약 조건이 적용됩니다.
fmincon
솔버에서 제약 조건을 형식으로 작성하도록 요구하기 때문에, 다음 값을 반환하는 제약 조건 함수를 작성합니다.
.
기울기가 있는 목적 함수
목적 함수는 다음과 같습니다.
.
변수 및 에 대한 의 기울기를 계산합니다.
.
이 예제의 마지막 부분에 있는 objfungrad
헬퍼 함수가 목적 함수 와 해당 기울기(두 번째 출력값 gradf
에 반환)를 모두 반환합니다. @objfungrad
를 목적 함수로 설정합니다.
fun = @objfungrad;
기울기가 있는 제약 조건 함수
헬퍼 함수 confungrad
는 비선형 제약 조건 함수로, 이 예제의 마지막 부분에 나와 있습니다.
부등식 제약 조건에 대한 도함수 정보의 경우 각 열이 하나의 제약 조건에 대응됩니다. 다시 말해서, 제약 조건의 기울기는 다음 형식으로 되어 있습니다.
@confungrad
를 비선형 제약 조건 함수로 설정합니다.
nonlcon = @confungrad;
도함수 정보를 사용하기 위한 옵션 설정하기
fmincon
솔버에 목적 함수와 제약 조건 함수가 도함수 정보를 제공한다는 점을 나타냅니다. 이를 위해 optimoptions
를 사용하여 SpecifyObjectiveGradient
및 SpecifyConstraintGradient
옵션 값을 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