MATLAB 二次规划函数的使用以及扩展

二次规划问题简介

二次规划指带有二次型数值最优化问题
一般表达形式
在这里插入图片描述
二次型,即代表了二次的向量,最优化也就是我们平常所说的求极大值和极小值的问题。

也就是说,当H为对角矩阵时,这个表达式就会变成一个最小二成的问题

H x 2 + f T x Hx^2+f^Tx Hx2+fTx

H代表黑森矩阵(Hessian矩阵)
而H对于最优化结果也有着十分重要的影响:

  • 黑森矩阵是半正定的,则该二次规划为一个凸二次规划,存在全局最优解;
  • 黑森矩阵是正定的,则该二次规划存在全局唯一最优解;
  • 黑森矩阵是非正定的,则该二次规划为非凸二次规划,存在多个平稳点和局部极小值点。

M i n : 0.5 ∗ H ∗ x 2 + f ∗ x Min:0.5*H*x^2+f*x Min:0.5Hx2+fx

但是现实世界的问题往往是多维向量

matlab二次规划问题箱简介

matlab中有着二次规划的工具箱函数,使用方便。
在这里插入图片描述
quadprog为二次规划函数,但同时,optimoptions可以对quadprog进行详细的设置。

我们先看主要的quadprog函数
在这里插入图片描述
该函数中的参数,如下图公式说明
在这里插入图片描述
x0则作为最优化计算的起始点

option则是一个详细设置的句柄,而这个详细设置的句柄就在optimoptions函数中创建。
在这里插入图片描述
option为optimoption返回的优化设置句柄。
SolverName: matlab中优化函数有很多,比如fminconquadprogfminimax等等,但是optimoption返回的句柄需要指明用的是哪个优化函数,因此该参数应该为一个对应函数名字符串。
Name & Value:即为对应设置项和设置值。

不同的优化函数有不同的设置项,查询方法就在matlab optimoption函数说明的输入参数-名称-值对组参数
在这里插入图片描述
打开quadprog 对应设置项我们就可看到对应设置项的设置方法。

简单代码

options = optimoptions('quadprog','Algorithm','active-set');
x0 = zeros(Nc*Nu+1,1);
delta_U = quadprog(H,g,A_cons,b_cons,[],[],lb,ub,x0,options);

C语言生成注意事项

  • 若要部署到嵌入式设备上,所属设备必须支持double类型计算!!
  • 不能使用problem参数
  • 不能有稀疏矩阵
  • optimoptions中的Algorithm 中参数必须为active-set
### 如何在MATLAB使用CPLEX进行二次规划 #### 安装配置 为了使 CPLEX 能够在 MATLAB 中正常工作,需先完成必要的安装和路径设置。确保已下载并安装 IBM ILOG CPLEX Optimization Studio 的适当版本,并按照官方文档说明将 CPLEX 添加到系统的环境变量 PATH 中[^2]。 接着,在 MATLAB 命令窗口运行 `cpaddpath` 函数来添加 CPLEX 到当前会话的搜索路径下: ```matlab % 将 CPLEX 添加至 MATLAB 搜索路径 cpaddpath; ``` 此命令应每次启动新的 MATLAB 实例时执行一次,除非已在启动文件 startup.m 中加入该指令以便自动加载。 #### 创建优化模型对象 创建一个新的 CPLEX 模型实例用于定义问题结构: ```matlab cplex = Cplex(); ``` 对于二次规划 (QP),需要指定线性和二次项系数矩阵 Q 和 c 向量,以及不等式/等式的左侧 A 矩阵及其右侧 b 向量。这些数据构成了标准形式下的二次规划表达式 min(0.5*x'*Q*x+c'*x) s.t Ax<=b 或者 Ax=b。 #### 设置目标函数 通过属性 Model.obj 来设定线性部分的目标函数向量;而对于二次项,则利用 Model.Q 属性赋值给定的半正定矩阵表示法。例如: ```matlab % 设定线性成本向量 cplex.Model.obj = [-1; -2]; % 对于两个决策变量的情况 % 构建 Hessian Matrix(即二次项系数) H = [4, 1; 1, 2]; cplex.Model.Q = sparse(H); % 使用稀疏存储方式提高效率 ``` 这里假设有一个简单的两维空间内的最小化问题,其中包含一个非零交叉乘积项 xy。 #### 输入约束条件 可以采用两种方法之一输入约束:一种是逐行填充(populate by row),另一种则是基于列的方式构建。前者更适合直观理解每个单独约束的作用范围。下面展示如何运用 populatebyrow 方法建立一组线性不等式约束: ```matlab Aineq = [1, 1; % 不等式组左端 1,-1]; bineq = [2; % 右边常数边界 1]; for i=1:size(Aineq,1) indconstr{i} = cplex.addLinearConstraint('LE', Aineq(i,:), bineq(i)); end ``` 上述代码片段展示了当存在多个独立但相互关联的一次方程作为限制因素时的操作流程。“populatebyrow”的核心在于循环迭代每一行的数据直至全部处理完毕为止。 关于二次锥形约束或其他类型的复杂关系,可以通过调用特定接口如 addQCs() 进行扩展支持。这类高级特性允许用户自定义更复杂的数学描述,比如涉及绝对值、最大值运算符等问题转换成混合整数二阶圆锥程序(MISOCP)。 #### 解决方案求解与结果获取 一旦完成了所有必要组件的初始化之后就可以尝试解决问题了。这通常只需要简单地调用 solve() 即可触发计算过程: ```matlab if ~isempty(cplex.solve()) disp(['Objective value: ', num2str(cplex.getObjValue())]); else error('Solver failed to find a solution.'); end ``` 最后一步是从返回的结果集中提取有用的信息,包括但不限于最优解的位置(x*)、对应的目标函数值得分(f*)等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值