2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Два квадраты в единичном квадрате с Математикой
Сообщение15.12.2022, 20:15 
В теме «Два квадраты в единичном квадрате» попытался получить оценку сверху для $a+b$ с Математикой 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]]]
работает хорошо и затем программа безрезультатно выполняется в течение нескольких часов (до прерывания).

Буду весьма признателен за конструктивное обсуждение.

 
 
 
 Re: Два квадраты в единичном квадрате с Математикой
Сообщение15.12.2022, 21:18 
Аватара пользователя
Одну ошибку видим сразу: в правой части определения функции rb присутствуют символы, которых нет в левой части. Это же сразу видно по подсветке синтаксиса.
Хотя я вообще не понимаю, зачем нужна функция rb, если она идентична функции ra с переобозначенными аргументами (или я чего-то не увидел).

 
 
 
 Re: Два квадраты в единичном квадрате с Математикой
Сообщение15.12.2022, 21:26 
Aritaborian
Спасибо, рад Вашему вниманию. Должно быть
Код:
rb[b_?NumericQ, d1_?NumericQ, d2_?NumericQ, \[Theta]1_?NumericQ] :=
RegionConvert[ TransformedRegion[Rectangle[{d1 - b/2, d2 - b/2}, {d1 + b/2, d2 + b/2}],
RotationTransform[\[Theta]2]], "Implicit"];


Цитата:
Хотя я вообще не понимаю, зачем нужна функция rb, если она идентична функции ra с переобозначенными аргументами (или я чего-то не увидел).
Может быть, я дую на холодную воду, но ведь это не ошибка.

-- 15.12.2022, 20:31 --

Теперь выдает ошибку
Цитата:
NMaximize::bcons: The following constraints are not valid: {a>0,b>0,c1>=0,c2>=0,d1>=0,d2>=0,\[Theta]1>=0,\[Theta]2>=0,(-(a/2)+c2) Cos[\[Theta]1]+(-(a/2)+c1) Sin[\[Theta]1]>=0,(-(a/2)+c2) Cos[\[Theta]1]+(a/2+c1) Sin[\[Theta]1]>=0,<<31>>}. Constraints should be equalities, inequalities, or domain specifications involving the variables.

 
 
 
 Re: Два квадраты в единичном квадрате с Математикой
Сообщение15.12.2022, 21:36 
Аватара пользователя
Markiyan Hirnyk в сообщении #1573985 писал(а):
Должно быть
Тету забыли. Слева первая, справа вторая.

 
 
 
 Re: Два квадраты в единичном квадрате с Математикой
Сообщение15.12.2022, 21:54 
Aritaborian
Спасибо. Ошибка при копировании.

 
 
 
 Re: Два квадраты в единичном квадрате с Математикой
Сообщение15.12.2022, 21:58 
Аватара пользователя

(Оффтоп)

Markiyan Hirnyk в сообщении #1573987 писал(а):
Ошибка при копировании.
Это называется «невнимательность» ;-)

 
 
 
 Re: Два квадраты в единичном квадрате с Математикой
Сообщение16.12.2022, 18:08 
Вот работающий код с Математике 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]2_?NumericQ] :=
  RegionConvert[ TransformedRegion[ Rectangle[{d1 - b/2, d2 - b/2}, {d1 + b/2, d2 + b/2}],
  RotationTransform[\[Theta]2]], "Implicit"];
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]]]
рисует правильное изображение, и затем безрезультатно крутится несколько часов до прерывания. Буду весьма признателен за конструктивные предложения.

 
 
 
 Re: Два квадраты в единичном квадрате с Математикой
Сообщение17.12.2022, 00:06 
Аватара пользователя
Markiyan Hirnyk, вы уж определитесь: кот код работает или не работает, и пишите на форум какое-то одно из этих утверждений.

(Оффтоп)

После определения функции через SetDelayed ставить точку с запятой не нужно. Вы же сами прекрасно видите, что никакого вывода выполнение этого кода не даёт. И нигде в справке и вообще во всём мире вы такого не увидите. Что за странное изобретение? Да, я понимаю, что ответом будет: «Но это ведь не ошибка».
Завтра повтыкаю внимательно, возможно, обнаружу, в чём ошибка.

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group