Я недавно начал работать с решателем 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».