Matlab中,cvx中的cvx find是否是用于寻找问题可行解的?如果是,能否直接寻找非凸问题的可行解?
举例:对于(|H1eH2+H3|^2)/(|H4eH5+H6|^2)+Z1 <= Z2
其中H123456为向量,Z12为常数均已知,求一个e的可行解。只是举例
是的,cvx中的cvx_find函数用于寻找问题的可行解,可以用于非凸问题。
对于给定的优化问题(|H1eH2+H3|^2)/(|H4eH5+H6|^2)+Z1 <= Z2,可以使用cvx建模语言描述,如下所示:
cvx_begin
variable e
minimize pow_pos(norm(H1*e*H2+H3),2)/pow_pos(norm(H4*e*H5+H6),2) + Z1
subject to
pow_pos(norm(H1*e*H2+H3),2)/pow_pos(norm(H4*e*H5+H6),2) + Z1 <= Z2
cvx_end
其中,cvx_begin和cvx_end之间是优化问题的描述,variable e定义了待求解的变量,minimize表示要最小化的目标函数,subject to表示要满足的约束条件。使用pow_pos函数来表示范数的平方。
使用cvx_find函数可以寻找问题的可行解,如下所示:
cvx_begin
variable e
minimize pow_pos(norm(H1*e*H2+H3),2)/pow_pos(norm(H4*e*H5+H6),2) + Z1
subject to
pow_pos(norm(H1*e*H2+H3),2)/pow_pos(norm(H4*e*H5+H6),2) + Z1 <= Z2
cvx_end
if strcmp(cvx_status, 'Infeasible')
error('Problem is infeasible');
end
if strcmp(cvx_status, 'Unbounded')
error('Problem is unbounded');
end
e_feas = cvx_find; % finds a feasible solution
这里先通过cvx_end得到问题的最优解,然后通过cvx_find函数寻找一个可行解。如果问题不可行或无界,将抛出异常。