该示例通过解决二次优化问题,如何确定如何确定马戏团帐篷的形状。帐篷由重,弹性材料形成,并沉淀成具有受约束的最小潜在能量的形状。问题的离散化导致有限约束的二次编程问题。
对于此示例的基于求解器的版本,请参阅束缚的二次编程,基于求解器.
考虑建一个马戏团帐篷覆盖一个广场。这个帐篷有五根柱子,上面用一种很重的弹性材料覆盖着。问题是找到帐篷的自然形状。模型的形状作为高度X(P.)的位置P..
重型材料的潜在能量提升到高度X是CX.,为常数C这与材料的重量成正比。对于这个问题,选择C= 1/3000。
一块材料的弹性势能 近似与材料高度的第二衍生物成比例,倍率。您可以通过五点有限差分近似近似第二导数(假设有限差分步骤为1)。让 表示在第一个坐标方向上的位移为1 表示在第二坐标方向上的1的偏移。
帐篷的自然形状使总势能最小化。通过离散化这个问题,你会发现要最小化的总势能是所有位置的和P.的 +CX.(P.).
这个势能是变量的二次表达式X
.
指定边缘处的帐篷的高度为零的边界条件。帐篷杆具有1-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;Colormap(灰色);SURFL(高度)轴紧视图([-20,30]);标题('帐篷杆和地区覆盖')
创建优化变量X
代表材料的高度。
x = Optimvar(“x”、大小(高度));
放X
在正方形区域的边界上为零。
边界=假(大小(高度));边界([1,33],:) =真;边界(:,[1,33])=真;X.LowerBound(边界)= 0;x.upperbound(边界)= 0;
计算每个点的弹性势能。首先,计算该区域内部的潜在能量,其中有限差异不会超越包含溶液的区域。
l =尺寸(高度,1);Pertretch = Optimexpr(L,L);%这将PERTRETCH初始化为零(L,L)内部= 2:(L-1);Pertetch(内部,内部)=(-1 *(x(内部 - 1,内部)+ x(内部+ 1,室内)......+ x(内部,内部 - 1)+ x(内部,内部+ 1))+ 4 * x(内部,内部))......。* x(内部,内部);
因为解决方案在该区域的边缘被约束为0,所以您不需要包括条款的其余部分。所有术语都有多个X
,X
在边缘是零。作为参考,如果你想使用不同的边界条件,下面是一个注释的版本的势能。
%Pertrach(1,内部)=(-1 *(x(1,内部 - 1)+ x(1,内部+ 1)+ x(2,内部))...%+ 4 * x(1,内部))。* x(1,内部);% peStretch (L,内政部)= (1 * (x (L,室内- 1)+ x (L,室内+ 1)+ x (L - 1,室内))…%+ 4 * x(l,内部))。* x(l,内部);%Pertrch(内部,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(内部,l))。* x(内部,l);%perthetch(1,1)=(-1 *(x(2,1)+ x(1,2))+ 4 * x(1,1))。* x(1,1);%pertrach(1,l)=(-1 *(x(2,l)+ x(1,l-1))+ 4 * x(1,l))。* x(1,l);%pertretch(l,1)=(-1 *(x(l,2)+ x(l-1,1))+ 4 * x(l,1))。* x(l,1);%perthetch(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 ('客观的',总和(总和(PERTRECH + PEHEIGHT)));
设置解决方案必须位于上方的约束高度
矩阵。这个矩阵在大多数位置为零,表示地面,并包括每个帐篷杆在其位置的高度。
htcons = x> =高度;tentproblex.constraints.htcons = htcons;
解决这个问题。忽略所产生的陈述“你的黑森州不对称”。解决
发出这个声明是因为从问题形式到二次矩阵的内部转换不能确保矩阵是对称的。
索尔=解决(tentproblem);
使用Quadprog解决问题。你的黑森州不对称。重置H =(H + H')/ 2。最低发现满足约束。优化完成,因为目标函数在可行的方向上不降低,到在最优性公差的值内,并且对约束公差的值满足约束。
绘制由优化求解器找到的解。
SURFL(SOL.X);轴紧;视图([-20,30]);