2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Два квадраты в единичном квадрате с Математикой
Сообщение15.12.2022, 20:15 


11/07/16
802
В теме «Два квадраты в единичном квадрате» попытался получить оценку сверху для $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 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Одну ошибку видим сразу: в правой части определения функции rb присутствуют символы, которых нет в левой части. Это же сразу видно по подсветке синтаксиса.
Хотя я вообще не понимаю, зачем нужна функция rb, если она идентична функции ra с переобозначенными аргументами (или я чего-то не увидел).

 Профиль  
                  
 
 Re: Два квадраты в единичном квадрате с Математикой
Сообщение15.12.2022, 21:26 


11/07/16
802
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 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Markiyan Hirnyk в сообщении #1573985 писал(а):
Должно быть
Тету забыли. Слева первая, справа вторая.

 Профиль  
                  
 
 Re: Два квадраты в единичном квадрате с Математикой
Сообщение15.12.2022, 21:54 


11/07/16
802
Aritaborian
Спасибо. Ошибка при копировании.

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


11/06/12
10390
стихия.вздох.мюсли

(Оффтоп)

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

 Профиль  
                  
 
 Re: Два квадраты в единичном квадрате с Математикой
Сообщение16.12.2022, 18:08 


11/07/16
802
Вот работающий код с Математике 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 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Markiyan Hirnyk, вы уж определитесь: кот код работает или не работает, и пишите на форум какое-то одно из этих утверждений.

(Оффтоп)

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group