Чтобы ответить на этот вопрос, мы начнем со следующей проблемы с игрушечной моделью, которая приведена здесь как пример:
Учитывая две окружности на плоскости (ее центры (c1 и c2) и радиусы (r1 и r2)), а также положительное число r3, найдите все окружности с радиусами = r3 (т.е. все точки c3 являются центрами окружностей с радиусами = r3) касательно (внешне и внутри) к заданным двум окружностям.
Как правило, в зависимости от Circle[c1,r1], Circle[c2,r2] and r3
существует 0,1,2, ... 8 возможных решений. Типичный случай с 8 решениями:
Я немного модифицировал аккуратную реализацию 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
до исчезновения всех решений (напоминающих так называемую структурную нестабильность) выглядит так:
Manipulate
довольно мощный инструмент, не только игрушка, и его освоение может быть очень полезным. Рассматриваемые вопросы при появлении в серьезном исследовании часто являются критическими, например: при изучении решений нелинейных дифференциальных уравнений, появлении особенностей в их решениях, качественном поведении динамических систем, бифуркациях, явлениях в теории катастроф и так далее.