Trouvez le petit polygone le plus grand
Trouvez le polygone ayant l'aire maximale parmi les polygones ayant côtés et un diamètre
.
Dans la version 11 de Mathematica, FindMinimum ajoute un solveur IPOPT pour résoudre des problèmes d'optimisation sous contrainte à grande échelle de manière plus efficace.
![](assets.fr/find-the-largest-small-polygon/O_35.png)
Appelez n le nombre de sommets du polygone.
![Click for copyable input](assets.fr/find-the-largest-small-polygon/In_42.png)
n = 50;
Soit , les coordonnées polaires du sommet
ème du polygone.
![Click for copyable input](assets.fr/find-the-largest-small-polygon/In_43.png)
vars = Join[Array[r, n], Array[\[Theta], n]];
Ils satisfont les contraintes ,
,
,
.
![Click for copyable input](assets.fr/find-the-largest-small-polygon/In_44.png)
varbounds =
Join[Table[0 <= r[i] <= 1, {i, n - 1}], {r[n] == 0},
Table[0 <= \[Theta][i] <= Pi, {i, n - 1}], {\[Theta][n] == Pi}];
L'aire du polygone correspond à la somme des aires des triangles dont les sommets ,
et
(l'origine).
![Click for copyable input](assets.fr/find-the-largest-small-polygon/In_45.png)
area = 1/2 Sum[
r[i] r[i + 1] Sin[\[Theta][i + 1] - \[Theta][i]], {i, 1, n - 1}];
La distance entre deux sommets ne doit pas dépasser 1.
![Click for copyable input](assets.fr/find-the-largest-small-polygon/In_46.png)
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];
En raison de l'ordre des sommets, les contraintes suivantes existent également.
![Click for copyable input](assets.fr/find-the-largest-small-polygon/In_47.png)
constr2 = Table[\[Theta][i] <= \[Theta][i + 1], {i, 1, n - 1}];
Choisissez les points initiaux pour les variables.
![Click for copyable input](assets.fr/find-the-largest-small-polygon/In_48.png)
x0 = vars /. {r[i_] ->
4. i (n + 1 - i)/(n + 1)^2, \[Theta][i_] -> \[Pi] i/n};
Maximisez la zone soumise à des contraintes.
![Click for copyable input](assets.fr/find-the-largest-small-polygon/In_49.png)
sol = FindMaximum[{area, constr1, constr2, varbounds},
Thread[{vars, x0}]];
Convertissez en coordonnées cartésiennes.
![Click for copyable input](assets.fr/find-the-largest-small-polygon/In_50.png)
rectpts =
Table[FromPolarCoordinates[{r[i], \[Theta][i]}], {i, 1, n}] /.
sol[[2]];
Tracez la solution.
![Click for copyable input](assets.fr/find-the-largest-small-polygon/In_51.png)
Show[ListPlot[rectpts, PlotStyle -> {Blue, PointSize -> Medium}],
Graphics[{Opacity[.1], Blue, EdgeForm[Blue], Polygon[rectpts]}],
AspectRatio -> 1, ImageSize -> Medium]
![](assets.fr/find-the-largest-small-polygon/O_36.png)