受限受限的二次编程,基于求解器
此示例显示了如何通过解决二次优化问题来确定马戏团帐篷的形状。帐篷由重,弹性材料形成,并沉降成具有最小势能受到约束的形状。问题的离散化导致了一个约束二次编程问题。
对于此示例的基于问题的版本,请参阅界限二次编程,基于问题。
问题定义
考虑建造一个马戏帐篷以覆盖正方形。帐篷有五个杆子,上面覆盖着浓重的弹性材料。问题是找到帐篷的自然形状。建模形状为高度X((p)位于位置的帐篷p。
重型材料的势能提升到高度X是CX,为一个常数C这与材料的重量成正比。对于这个问题,选择C= 1/3000。
一块材料的弹性势能 与材料高度的第二个衍生物大致成正比,乘以高度。您可以通过5点有限差近似值近似第二个导数(假设有限差步长为尺寸1)。让 代表第一个坐标方向的1个移位,并且 在第二个坐标方向上表示1位。
帐篷的自然形状可最大程度地减少总势能。通过离散问题,您发现最小化的总势能是所有位置的总和p的 +CX((p)。
这种势能是变量中的二次表达X
。
指定边界条件,即边缘处的帐篷高度为零。帐篷杆的横截面为1 x-1单元,帐篷的总尺寸为33 x 33个单位。指定每个杆的高度和位置。绘制正方形的地块区域和帐篷杆。
高度=零(33);高度(6:7,6:7)= 0.3;高度(26:27,26:27)= 0.3;高度(6:7,26:27)= 0.3;高度(26:27,6:7)= 0.3;高度(16:17,16:17)= 0.5;colormap(灰色);Surfl(高度)轴紧的查看([ - 20,30]);标题(“帐篷杆和覆盖区域”)
创建边界条件
这高度
矩阵定义溶液上的下限X
。要限制解决方案在边界处为零,请设置上限UB
在边界上为零。
边界= false(size(height));边界([1,33],:) = true;边界(:,[1,33])= true;ub = inf(size(boundary));%在该地区的大多数地方没有上限ub(boundary)= 0;
创建目标函数矩阵
这Quadprog
问题公式是最小化
。
在这种情况下,线性术语 对应于材料高度的势能。因此,指定F= 1/3000的每个组件X。
f =一个(尺寸(高度))/3000;
创建代表有限差矩阵
通过使用delsq
功能。这delsq
函数返回一个稀疏矩阵,其条目为4和-1,对应于公式中4和-1的条目
。将返回的矩阵乘以2Quadprog
用由能量函数求解二次程序
。
h = delsq(numgrid(',33+2))*2;
查看矩阵的结构H
。矩阵在X(:)
,这意味着矩阵X
通过线性索引转换为向量。
间谍(h);标题(“黑森矩阵的稀疏结构”);
运行优化求解器
通过打电话解决问题Quadprog
。
x = quadprog(h,f,[],[],[],[],[],height,ub);
最低限度发现满足约束。之所以完成优化,是因为目标函数在可行的方向,最优性公差值之内不折叠,并且在约束公差的值之内满足了约束。
图解决方案
重塑解决方案X
到矩阵s
。然后绘制解决方案。
s = rephape(x,size(height));Surfl(S);轴紧的;查看([ - 20,30]);