В теме
«Два квадраты в единичном квадрате» попытался получить оценку сверху для
с Математикой 13.1 на Виндовс. Определим два квадраты
Код:
ra[a_?NumericQ, c1_?NumericQ, c2_?NumericQ, \[Theta]1_?NumericQ] :=
RegionConvert[ TransformedRegion[Rectangle[{c1 - a/2, c2 - a/2}, {c1 + a/2, c2 + a/2}],
RotationTransform[\[Theta]1]], "Implicit"];
rb[b_?NumericQ, d1_?NumericQ, d2_?NumericQ, \[Theta]1_?NumericQ] :=
RegionConvert[ TransformedRegion[Rectangle[{d1 - a/2, d2 - a/2}, {d1 + a/2, d2 + a/2}],
RotationTransform[\[Theta]2]], "Implicit"];
Условие непересечения их внутренностей сформулируем в терминах равенства нулю меры Жордана их пересечения
Код:
RegionMeasure[RegionIntersection[ra[a, c1, c2,\[Theta]1],rb[b, d1, d2, \[Theta]2]], 2] == 0
а условие, что квадраты являются подмножествами единичного квадрата, запишем как принадлежность всех 8 вершин квадратов единичному квадрату, например,
Код:
(RotationMatrix[\[Theta]1] . {c1 + a/2, c2 - a/2})[[1]] <= 1 && (RotationMatrix[\[Theta]1] . {c1 + a/2, c2 - a/2})[[2]] <= 1 && (RotationMatrix[\[Theta]1] . {c1 + a/2, c2 - a/2})[[1]] >= 0 && (RotationMatrix[\[Theta]1] . {c1 + a/2, c2 - a/2})[[2]] >= 0
и т.п.
Теперь пытаюсь найти приближенное решение задачи оптимизации, допуская небольшие пересечения и с малой точностью:
Код:
NMaximize[{a + b, RegionMeasure[ RegionIntersection[ra[a, c1, c2, \[Theta]1],
rb[b, d1, d2, \[Theta]2]], 2] <= 0.01 && a > 0 && b > 0 &&
c1 >= 0 && c2 >= 0 && d1 >= 0 && d2 >= 0 && c1 <= 1 && c2 <= 1 &&
d1 <= 1 && d2 <= 1 && a <= 1 && b <= 1 && \[Theta]1 >= 0 && \[Theta]1 <= Pi/2 &&
\[Theta]2 >= 0 && \[Theta]2 <= Pi/2 &&
(RotationMatrix[\[Theta]1] . {c1 + a/2, c2 + a/2})[[1]] <=
1 && (RotationMatrix[\[Theta]1] . {c1 + a/2, c2 + a/2})[[2]] <=
1 && (RotationMatrix[\[Theta]1] . {c1 + a/2, c2 + a/2})[[1]] >=
0 && (RotationMatrix[\[Theta]1] . {c1 + a/2, c2 + a/2})[[2]] >=
0 && (RotationMatrix[\[Theta]1] . {c1 + a/2, c2 - a/2})[[1]] <=
1 && (RotationMatrix[\[Theta]1] . {c1 + a/2, c2 - a/2})[[2]] <=
1 && (RotationMatrix[\[Theta]1] . {c1 + a/2, c2 - a/2})[[1]] >=
0 && (RotationMatrix[\[Theta]1] . {c1 + a/2, c2 - a/2})[[2]] >=
0 && (RotationMatrix[\[Theta]1] . {c1 - a/2, c2 - a/2})[[1]] <=
1 && (RotationMatrix[\[Theta]1] . {c1 - a/2, c2 - a/2})[[2]] <=
1 && (RotationMatrix[\[Theta]1] . {c1 - a/2, c2 - a/2})[[1]] >=
0 && (RotationMatrix[\[Theta]1] . {c1 - a/2, c2 - a/2})[[2]] >=
0 && (RotationMatrix[\[Theta]1] . {c1 + a/2, c2 + a/2})[[1]] <=
1 && (RotationMatrix[\[Theta]1] . {c1 + a/2, c2 + a/2})[[2]] <=
1 && (RotationMatrix[\[Theta]1] . {c1 + a/2, c2 + a/2})[[1]] >=
0 && (RotationMatrix[\[Theta]1] . {c1 + a/2, c2 + a/2})[[2]] >=
0 && (RotationMatrix[\[Theta]2] . {d1 + b/2, d2 + b/2})[[2]] <=
1 && (RotationMatrix[\[Theta]2] . {d1 + b/2, d2 + b/2})[[1]] >=
0 && (RotationMatrix[\[Theta]2] . {d1 + b/2, d2 + b/2})[[2]] >=
0 && (RotationMatrix[\[Theta]2] . {d1 + b/2, d2 - b/2})[[1]] <=
1 && (RotationMatrix[\[Theta]2] . {d1 + b/2, d2 - b/2})[[2]] <=
1 && (RotationMatrix[\[Theta]2] . {d1 + b/2, d2 - b/2})[[1]] >=
0 && (RotationMatrix[\[Theta]2] . {d1 + b/2, d2 - b/2})[[2]] >=
0 && (RotationMatrix[\[Theta]2] . {d1 - b/2, d2 - b/2})[[1]] <=
1 && (RotationMatrix[\[Theta]2] . {d1 - b/2, d2 - b/2})[[2]] <=
1 && (RotationMatrix[\[Theta]2] . {d1 - b/2, d2 - b/2})[[1]] >=
0 && (RotationMatrix[\[Theta]2] . {d1 - b/2, d2 - b/2})[[2]] >=
0 && (RotationMatrix[\[Theta]2] . {d1 + b/2, d2 + b/2})[[1]] <=
1 && (RotationMatrix[\[Theta]2] . {d1 + b/2, d2 + b/2})[[2]] <=
1 && (RotationMatrix[\[Theta]2] . {d1 + b/2, d2 + b/2})[[1]] >=
0 && (RotationMatrix[\[Theta]2] . {d1 + b/2, d2 + b/2})[[2]] >=
0}, {a, b, c1, c2, d1, d2, \[Theta]1, \[Theta]2},
AccuracyGoal -> 3, PrecisionGoal -> 3, Method -> {"RandomSearch",
"SearchPoints" -> 10,
"InitialPoints" -> {{1/10, 1/10, 1/4, 3/8, 1/4, 7/8, 0, Pi/6},
{1/10, 1/10, 1/4, 3/8, 1/2, 7/8, 0, 0}}}]
К сожалению, этот код выдает ошибку
Цитата:
RegionMeasure::reg: RegionIntersection[ra[a,c1,c2,[Theta]1],rb[b,d1,d2,[Theta]2]] is not a correctly specified region.
, которую я не понимаю, ибо
Код:
Region[RegionIntersection[ra[1/4, 0, 0, 0], rb[1/4, 1/8, 0, Pi/4]]]
работает хорошо и затем программа безрезультатно выполняется в течение нескольких часов (до прерывания).
Буду весьма признателен за конструктивное обсуждение.