Управляющая мера нулевых множеств решений с помощью Manipulate.Тематическое исследование - PullRequest
5 голосов
/ 11 декабря 2011

Чтобы ответить на этот вопрос, мы начнем со следующей проблемы с игрушечной моделью, которая приведена здесь как пример:

Учитывая две окружности на плоскости (ее центры (c1 и c2) и радиусы (r1 и r2)), а также положительное число r3, найдите все окружности с радиусами = r3 (т.е. все точки c3 являются центрами окружностей с радиусами = r3) касательно (внешне и внутри) к заданным двум окружностям.

Как правило, в зависимости от Circle[c1,r1], Circle[c2,r2] and r3 существует 0,1,2, ... 8 возможных решений. Типичный случай с 8 решениями: enter image description here

Я немного модифицировал аккуратную реализацию Mathematica от Jaime Rangel-Mondragon в Демонстрационный проект Wolfram , но его ядро ​​схоже:

Manipulate[{c1, a, c2, b} = pts;
           {r1, r2} = Map[Norm, {a - c1, b - c2}];

            w = Table[
                       Solve[{radius[{x, y} - c1]^2 == (r + k r1)^2, 
                              radius[{x, y} - c2]^2 == (r + l r2)^2}
                            ] // Quiet, 
                       {k, -1, 1, 2}, {l, -1, 1, 2}
                    ];
            w = Select[
                       Cases[Flatten[{{x, y}, r} /. w, 2],
                             {{_Real, _Real}, _Real}
                            ], 
                       Last[#] > 0 &
                     ];
           Graphics[
                    {{Opacity[0.35], EdgeForm[Thin], Gray,
                                                      Disk[c1, r1], Disk[c2, r2]},      
                     {EdgeForm[Thick], Darker[Blue,.5],
                                                   Circle[First[#], Last[#]]& /@ w}
                    },
                       PlotRange -> 8, ImageSize -> {915, 915}
                   ],
           "None" -> {{pts, {{-3, 0}, {1, 0}, {3, 0}, {7, 0}}},
                      {-8, -8}, {8, 8}, Locator}, 
           {{r, 0.3, "r3"}, 0, 8}, 
           TrackedSymbols -> True,
           Initialization :> (radius[z_] := Sqrt[z.z])
         ]

Мы можем легко сделать вывод, что в общем случае у нас есть четное число решений 0,2,4,6,8, в то время как случаи с нечетным числом решений 1,3,5,7 являются исключительными - они равны нулю измерять с точки зрения контрольных диапазонов. Таким образом, изменяя Manipulate c1, r1, c2, r2, r3, можно заметить, что гораздо сложнее отслеживать случаи с нечетным числом кругов.

Можно изменить на базовом уровне вышеупомянутый подход: решить чисто символические уравнения для c3, а также изменить структуру Manipulate с акцентом на изменение числа решений. Если я не ошибаюсь, Solve может работать только численно с Locator в Manipulate, однако здесь Locator представляется важным для простоты управления c1, r1, c2, r2, а также для всей реализации.
Давайте сформулируем вопросы:

1. Как заставить Манипулировать беспрепятственно отслеживать случаи с нечетным числом решений (кружков)?

2. Есть ли способ заставить Solve найти точные решения основных уравнений?

(Я считаю, что ответ Даниэля Лихтблау является наилучшим подходом к вопросу 2, но в данном случае, похоже, все еще существует острая необходимость в наброске общей методики выделения наборов решений с нулевой мерой, в то время как работа с Манипулятором)

Эти соображения менее важны при работе с точными решениями

Например Solve[x^2 - 3 == 0, x] доходность {{x -> -Sqrt[3]}, {x -> Sqrt[3]}} в то время как в приведенном выше случае несколько более сложных уравнений извлекаются из Manipulate с установкой следующих аргументов:

 c1 = {-Sqrt[3], 0};  a = {1, 0};  c2 = {6 - Sqrt[3], 0};  b = {7, 0};     
 {r1, r2} = Map[ Norm, {a - c1, b - c2 }];  
  r = 2.0 - Sqrt[3];

до:

w = Table[Solve[{radius[{x, y} - {x1, y1}]^2 == (r + k r1)^2, 
                 radius[{x, y} - {x2, y2}]^2 == (r + l r2)^2}],
          {k, -1, 1, 2}, {l, -1, 1, 2}];

w = Select[ Cases[ Flatten[ {{x, y}, r} /. w, 2], {{_Real, _Real}, _Real}],    
            Last[#] > 0 &]

мы получаем два решения:

{{{1.26795, -3.38871*10^-8}, 0.267949}, {{1.26795, 3.38871*10^-8}, 0.267949}}

аналогично при тех же аргументах и ​​уравнениях, ставя:

r = 2 - Sqrt[3]; 

мы не получаем решений: {}

но на самом деле есть только одно решение, которое мы хотели бы подчеркнуть:

{ {3 -  Sqrt[3], 0 }, 2 -  Sqrt[3] }

Фактически, переход к Graphics такой небольшой разнице между двумя различными решениями и уникальным решением неразличим, однако, работая с Manipulate, мы не можем тщательно отслеживать с требуемой точностью слияние двух окружностей и, как правило, последней наблюдаемой конфигурации при понижении r3 до исчезновения всех решений (напоминающих так называемую структурную нестабильность) выглядит так: enter image description here

Manipulate довольно мощный инструмент, не только игрушка, и его освоение может быть очень полезным. Рассматриваемые вопросы при появлении в серьезном исследовании часто являются критическими, например: при изучении решений нелинейных дифференциальных уравнений, появлении особенностей в их решениях, качественном поведении динамических систем, бифуркациях, явлениях в теории катастроф и так далее.

1 Ответ

3 голосов
/ 12 декабря 2011

Поскольку это мера с нулевым набором, инструменты, которые требуют некоторой детализации, обычно имеют проблемы с этой концепцией.Возможно, лучше лучше явно искать локус сингулярности, где решения имеют множественность или иным образом отклоняются от поведения (й) соседних решений.Это будет частью дискриминантного разнообразия.В частности, вы можете захватить соответствующую часть, установив свои определяющие многочлены в ноль и одновременно обнулив определитель Якоби.

Вот ваш пример.В конце концов (wlog) я поставлю один центр в начале координат, а другой - в (1,0).

centers = Array[c, {2, 2}];
radii = Array[r, 3];
circ[cen_, rad_, x_, y_] := ({x, y} - cen).({x, y} - cen) - rad^2

Я буду использовать ваш 'k' для обоих полиномов.Ваша формулировка имеет пары (k, l), где каждая из них + -1.Мы можем просто использовать k, упорядочить по квадрату, чтобы получить многочлен от k ^ 2, и заменить его на 1.

 polys = 
 Table[Expand[
   circ[centers[[j]], radii[[3]] + k*radii[[j]], x, y]], {j, 2}]

Out[18]= {x^2 + y^2 - 2 x c[1, 1] + c[1, 1]^2 - 2 y c[1, 2] + 
  c[1, 2]^2 - k^2 r[1]^2 - 2 k r[1] r[3] - r[3]^2, 
 x^2 + y^2 - 2 x c[2, 1] + c[2, 1]^2 - 2 y c[2, 2] + c[2, 2]^2 - 
  k^2 r[2]^2 - 2 k r[2] r[3] - r[3]^2}

Мы удалим часть, которая является линейной по k, возведем в квадрат остальные, возведем в квадратчто удалили часть, и приравнять два.Затем мы также заменим k на единицу.

p2 = polys - k*Coefficient[polys, k];
polys2 = Expand[p2^2 - (k*Coefficient[polys, k])^2] /. k -> 1;

Теперь мы получим определитель якобиана и добавим его к вареву.

discrim = Det[D[polys2, #] & /@ {x, y}];

allrelations = Join[polys2, {discrim}];

Теперь установите центры, как отмечено ранее (можетмы сделали это с самого начала, можно предположить).

ar2 = 
 allrelations /. {c[1, 1] -> 0, c[1, 2] -> 0, c[2, 1] -> 0, 
   c[2, 2] -> 0}

Out[38]= {x^4 + 2 x^2 y^2 + y^4 - 2 x^2 r[1]^2 - 2 y^2 r[1]^2 + 
  r[1]^4 - 2 x^2 r[3]^2 - 2 y^2 r[3]^2 - 2 r[1]^2 r[3]^2 + r[3]^4, 
 x^4 + 2 x^2 y^2 + y^4 - 2 x^2 r[2]^2 - 2 y^2 r[2]^2 + r[2]^4 - 
  2 x^2 r[3]^2 - 2 y^2 r[3]^2 - 2 r[2]^2 r[3]^2 + r[3]^4, 0}

Теперь мы исключим x и y, чтобы получить локус в пространстве параметров r [1], r [2], r [3], которое определяетгде мы будем иметь кратность в наших решениях.

 gb = GroebnerBasis[ar2, radii, {x, y}, 
   MonomialOrder -> EliminationOrder]

{r[1]^6 - 3 r[1]^4 r[2]^2 + 3 r[1]^2 r[2]^4 - r[2]^6 - 
   8 r[1]^4 r[3]^2 + 8 r[2]^4 r[3]^2 + 16 r[1]^2 r[3]^4 - 
   16 r[2]^2 r[3]^4}

Если я все сделал правильно, то теперь у нас есть многочлен, определяющий локус в пространстве параметров, где наборы решений могут оказаться глупыми.Вне этого набора они никогда не должны иметь кратность, и реальные счета всегда должны быть четными.Пересечение этого множества с реальным пространством будет двухмерной поверхностью в трехмерном пространстве параметров радиусов.Он будет отделять регионы с 0, 2, 4, 6 или 8 реальными решениями друг от друга.

Наконец, я укажу, что в этом примере рассматриваемое разнообразие красиво сводится в произведение плоскостей,Я думаю, с геометрической точки зрения это не слишком удивительно.

Factor[gb[[1]]]

Out[43]= (r[1] - r[2]) (r[1] + r[2]) (r[1] - r[2] - 2 r[3]) (r[1] + 
   r[2] - 2 r[3]) (r[1] - r[2] + 2 r[3]) (r[1] + r[2] + 2 r[3])
...