Ограничения CVXGEN не насыщают решение - PullRequest
0 голосов
/ 18 февраля 2020

Я недавно начал работать с решателем CVXGEN QP в MATLAB-Simulink и последовал примеру простой QP .

Безусловная версия решателя работает довольно хорошо, но, как только я добавляю окно ограничения, которые не насыщают решение целевой функции, когда ограничения активны. Ранее я работал с quadprog и QPoases в MATLAB, и они насыщают решение, когда ограничения активны. Для CVXGEN я получаю status.converged=0 только тогда, когда ограничения нарушены и решение, которое я получаю, является неограниченным.

Код CVXGEN с простыми рамочными ограничениями:

dimensions

end

parameters
Hs      (48,48)   symmetric psd 
q       (48)
u_1_min (12)      negative
u_2_min (12)      negative
u_3_min (12)      negative
u_4_min (12)      nonnegative
u_1_max (12)      nonnegative
u_2_max (12)      nonnegative
u_3_max (12)      nonnegative
u_4_max (12)      nonnegative
end

variables
u (48)
end

minimize
quad(u, Hs) + q'*u

subject to
u_1_min[i+1]    <= u[4*i+1]<= u_1_max[i+1] , i=0..11
u_2_min[i+1]    <= u[4*i+2]<= u_2_max[i+1] , i=0..11
u_3_min[i+1]    <= u[4*i+3]<= u_3_max[i+1] , i=0..11
u_4_min[i]      <= u[4*i]  <= u_4_max[i]   , i=1..12
end

Мой скрипт Matlab:

%% Load data
load solver_data

%% upper and lower bounds
ub  =0.6981;
lb  =-0.6981;
ubt =40;
lbt =0;
%% Box constraints
params.u_1_max =ub*ones(12,1);
params.u_1_min =lb*ones(12,1);
params.u_2_max =ub*ones(12,1);
params.u_2_min =lb*ones(12,1);
params.u_3_max =ub*ones(12,1);
params.u_3_min =lb*ones(12,1);
params.u_4_max =ubt*ones(12,1);
params.u_4_min =lbt*ones(12,1);

%% Hessian and gradient
params.Hs =Hs;
params.q  =q;

%% Solution
[vars, status] = csolve(params,settings);
if ~status.converged, error 'failed to converge'; end

%% Compare CVXGEN vs quadprog
u=quadprog(2*Hs,q,Ac,bc);

disp('quadprog')
u(1:4)
disp('cvxgen')
vars.u(1:4)

Решение, которое минимизирует целевую функцию с использованием quadprog и CVXGEN, :

quadprog

ans =

   -0.6981
    0.6981
    0.0045
   11.3340

cvxgen

ans =

   -0.8288
    0.3407
    0.0045
   11.3340

и мы ясно видим, что | -0,8288 | > | -0.6981 | при использовании CVXGEN и | -0.6981 | <= | -0,6981 | при использовании quadprog </p>

я также пытался добавить ограничения неравенства и штрафной член в целевой функции, как показано в www.cvxgen.com/docs/infeasibility.html, но я не вижу разницы в решении.

Это ожидаемое поведение CVXGEN или мне чего-то не хватает?

Данные решателя здесь

Экземпляр решателя здесь

Любые комментарии или идеи очень приветствуются:)

Примечание: для quadprog ограничения боксов фактически представлены как ограничения неравенства, поэтому я также предоставляю матрицы "A c" и " б c».

...