主要内容

基于问题的有界约束二次规划

这个例子展示了如何通过解决二次优化问题来确定马戏团帐篷的形状。帐篷由重型弹性材料制成,并固定成一种受约束势能最小的形状。问题的离散化导致一个有界约束二次规划问题。

有关此示例的基于解算器的版本,请参见有界约束二次规划,基于解算器

问题定义

考虑建一个马戏团帐篷覆盖一个广场。这个帐篷有五根柱子,上面用一种很重的弹性材料覆盖着。问题是找到帐篷的自然形状。模型的形状作为高度x(p)的位置p

重物被提升到高处的势能xcx,为常数c这与材料的重量成正比。对于这个问题,选择c= 1/3000。

一块材料的弹性势能 E t r e t c h 近似与材料高度的二阶导数乘以高度成正比。您可以通过五点有限差分近似(假设有限差分步骤的大小为1)来近似二阶导数。让 Δ x 表示在第一个坐标方向上的位移为1 Δ y 表示在第二个坐标方向上移动1。

E t r e t c h ( p ) = ( - 1 ( x ( p + Δ x ) + x ( p - Δ x ) + x ( p + Δ y ) + x ( p - Δ y ) ) + 4 x ( p ) ) x ( p )

帐篷的自然形状使总势能最小化。通过离散化这个问题,你会发现要最小化的总势能是所有位置的和p E t r e t c h ( p ) +cx(p).

这个势能是变量的二次表达式x

指定边缘处帐篷高度为零的边界条件。帐篷杆的横截面为1×1单位,帐篷的总尺寸为33×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;彩色贴图(灰色);曲面(高度)轴视图([-20,30]);标题(“帐篷杆和覆盖区域”)

图中包含一个坐标轴。标题为帐篷杆和覆盖区域的轴包含一个类型为surface的对象。

制定优化问题

创建一个优化变量x表示材质的高度。

x=optimvar(“x”、大小(高度));

设置x在正方形区域的边界上为零。

边界=假(尺寸(高度));边界([1,33],:)=true;边界(:,[1,33])=真;x、 下限(边界)=0;x、 上限(边界)=0;

计算每个点的弹性势能。首先,计算区域内部的势能,有限差分不会超出包含解的区域。

L=尺寸(高度,1);peStretch=optimexpr(L,L);%这会将peStretch初始化为零(L,L)内部=2:(L-1);peStretch(内部,内部)=-1*(x(内部-1,内部)+x(内部+1,内部)...+x(内饰,内饰-1)+x(内饰,内饰+1))+4*x(内饰,内饰))...*x(内部,内部);

由于解决方案在区域边缘处被约束为0,因此不需要包含其余的项。所有术语都有一个倍数x,x在边缘是零。作为参考,如果你想使用不同的边界条件,下面是一个注释的版本的势能。

% peStretch(1,interior) = (-1*(x(1,interior -1) + x(1,interior + 1) + x(2,interior))…%+4*x(1个内饰))*x(1个内饰);% peStretch (L,内政部)= (1 * (x (L,室内- 1)+ x (L,室内+ 1)+ x (L - 1,室内))…%+4*x(长,内部))*x(长,内部);%peStretch(内部,1)=-1*(x(内部-1,1)+x(内部+1,1)+x(内部,2))。。。%+4*x(内部,1))*x(内部,1);% peStretch(内部,L) = (1 * (x(室内- 1,L) + x(内部+ 1,L) +(内部,L - 1))…%+4*x(内部,左)和*x(内部,左);%peStretch(1,1)=-1*(x(2,1)+x(1,2))+4*x(1,1))*x(1,1);%鼠疫菌(1,L)=-1*(x(2,L)+x(1,L-1))+4*x(1,L))*x(1,L);%peStretch(L,1)=-1*(x(L,2)+x(L-1,1))+4*x(L,1))*x(L,1);%鼠疫菌(L,L)=-1*(x(L-1,L)+x(L,L-1))+4*x(L,L)).*x(L,L);

定义因材料高度而产生的势能,即x / 3000

peHeight = x / 3000;

创建一个名为tentproblem.包括目标函数的表达式,它是所有位置上的两个势能的和。

tentproblem = optimproblem (“目标”,sum(sum(peStretch+peHeight));

设置约束

设置解决方案必须位于高度矩阵。这个矩阵在大多数位置为零,表示地面,并包括每个帐篷杆在其位置的高度。

htcons=x>=高度;tentproblem.Constraints.htcons=htcons;

运行优化解算器

解决问题。忽略结果语句“您的Hessian不对称”解决发出这个声明是因为从问题形式到二次矩阵的内部转换不能确保矩阵是对称的。

索尔=解决(tentproblem);
使用quadprog解决问题。你的黑森不是对称的。重置H=(H+H')/2。找到满足约束条件的最小值。优化已完成,因为目标函数在可行方向上不递减,在最优性公差值范围内,且约束满足在约束公差值范围内。

绘图解决方案

绘制由优化求解器找到的解。

表面粗糙度(sol.x);轴;视图([-20,30]);

图中包含一个坐标轴。轴包含一个类型为曲面的对象。

相关的话题