Документация для функции набора инструментов cplexmiqcp: здесь . Цитируя документацию, для l
, Q
и r
имеем:
l: Вектор или матрица с двумя столбцами для линейной части квадратичных ограничений
Q: Симметричная двойная матрица или массив ячеек строки симметричных двойных матриц для квадратичных ограничений
r: вектор двойной или двойной строки для rhs ограничений квадратного неравенства
Итак, когда мы хотим создать одно квадратичное ограничение, мы можем дать вектор с двумя столбцами, симметричную двойную матрицу и двойное для l
, Q
и r
, соответственно. Когда мы хотим создать несколько квадратичных ограничений, нам нужно предоставить матрицу , массив ячеек строки симметричных двойных матриц и вектор строки для l
, Q
и r
соответственно .
Рассмотрим следующую простую модель:
Minimize
obj: x1 + x2 + x3 + x4 + x5 + x6
Subject To
c1: x1 + x2 + x5 = 8
c2: x3 + x5 + x6 = 10
q1: [ - x1 ^2 + x2 ^2 + x3 ^2 ] <= 0
q2: [ - x4 ^2 + x5 ^2 ] <= 0
Bounds
x2 Free
x3 Free
x5 Free
End
Код MATLAB будет выглядеть следующим образом:
H = [];
f = [1 1 1 1 1 1]';
Aineq = []
bineq = []
Aeq = [1 1 0 0 1 0;
0 0 1 0 1 1];
beq = [8 10]';
l = [0 0;
0 0;
0 0;
0 0;
0 0;
0 0;];
Q = {[-1 0 0 0 0 0;
0 1 0 0 0 0;
0 0 1 0 0 0;
0 0 0 0 0 0;
0 0 0 0 0 0;
0 0 0 0 0 0], ...
[0 0 0 0 0 0;
0 0 0 0 0 0;
0 0 0 0 0 0;
0 0 0 -1 0 0;
0 0 0 0 1 0;
0 0 0 0 0 0]};
r = [0 0];
sostype = [];
sosind = [];
soswt = [];
lb = [ 0; -inf; -inf; 0; -inf; 0];
ub = []; % implies all inf
ctype = []; % implies all continuous
options = cplexoptimset;
options.Display = 'on';
options.ExportModel = 'test.lp';
[x, fval, exitflag, output] = cplexmiqcp (H, f, Aineq, bineq, Aeq, beq,...
l, Q, r, sostype, sosind, soswt, lb, ub, ctype, [], options);
fprintf ('\nSolution status = %s \n', output.cplexstatusstring);
fprintf ('Solution value = %f \n', fval);
disp ('Values =');
disp (x');