找出最大的小多边形
在 n 边且直径 d≤1 的多边形中找出面积最大的多边形.
在 Mathematica 11 中,FindMinimum 增加了一个 IPOPT 求解器来更加有效地求解大型带约束的优化问题.

用 n 表示多边形的顶点数.
In[1]:=

n = 50;
设 为多边形第
个顶点的极坐标.
In[2]:=

vars = Join[Array[r, n], Array[\[Theta], n]];
它们满足约束条件:,
,
,
.
In[3]:=

varbounds =
Join[Table[0 <= r[i] <= 1, {i, n - 1}], {r[n] == 0},
Table[0 <= \[Theta][i] <= Pi, {i, n - 1}], {\[Theta][n] == Pi}];
多边形的面积为由顶点 i、i+1 和 n (原点)构成的三角形的面积的和.
In[4]:=

area = 1/2 Sum[
r[i] r[i + 1] Sin[\[Theta][i + 1] - \[Theta][i]], {i, 1, n - 1}];
每两个顶点之间的距离不应大于 1.
In[5]:=

constr1 =
Flatten[Table[
0 < r[i]^2 + r[j]^2 -
2 r[i] r[j] Cos[\[Theta][i] - \[Theta][j]] <= 1, {i, 1,
n - 1}, {j, i + 1, n}], 2];
由于顶点顺序问题,还存在以下约束.
In[6]:=

constr2 = Table[\[Theta][i] <= \[Theta][i + 1], {i, 1, n - 1}];
选择变量的初始点.
In[7]:=

x0 = vars /. {r[i_] ->
4. i (n + 1 - i)/(n + 1)^2, \[Theta][i_] -> \[Pi] i/n};
在约束条件下求面积的最大值.
In[8]:=

sol = FindMaximum[{area, constr1, constr2, varbounds},
Thread[{vars, x0}]];
转换为笛卡尔坐标.
In[9]:=

rectpts =
Table[FromPolarCoordinates[{r[i], \[Theta][i]}], {i, 1, n}] /.
sol[[2]];
图示结果.
In[10]:=

Show[ListPlot[rectpts, PlotStyle -> {Blue, PointSize -> Medium}],
Graphics[{Opacity[.1], Blue, EdgeForm[Blue], Polygon[rectpts]}],
AspectRatio -> 1, ImageSize -> Medium]
Out[10]=
