Общая касательная

Форум пользователей пакета Maple

Модератор: Admin

berg
Сообщения: 37
Зарегистрирован: Чт янв 19, 2012 8:33 pm

Общая касательная

Сообщение berg » Сб июн 15, 2013 5:23 pm

Решается задача о поиске окружностей с заданным условием. Как средствами Мэпла задать условие, при котором на экран выводятся только окружности, имеющие общую касательную?
Буду благодарен за подсказку.

Kitonum
Сообщения: 2084
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Re: Общая касательная

Сообщение Kitonum » Сб июн 15, 2013 9:14 pm

berg писал(а):...Как средствами Мэпла задать условие, при котором на экран выводятся только окружности, имеющие общую касательную?...

Очень просто! Две окружности не имеют общей касательной тогда и только тогда, когда одна окружность целиком лежит внутри другой. Отсюда легко получаем и условие. А далее обычная конструкция с if...then...fi

berg
Сообщения: 37
Зарегистрирован: Чт янв 19, 2012 8:33 pm

Сообщение berg » Вс июн 16, 2013 4:17 pm

Мне не совсем понятно ваше пояснение.
Привожу самодельную программку для решения указанной задачи:

> restart;Digits:=10;
> print('a','b','c','A','B','C');
> for a from 1 to 5 do
> for b from a to 20 do
> for c from b to 30 do
> A:=a+b;
> B:=a+c;
> C:=b+c;
> p:=(A+B+C)/2;
> S1:=(p*(p-A)*(p-B)*(p-C))^0.5;
> S:=round(S1);
> if frac(S1)=0 and a<=b and b<=c and c<p and igcd(a,b,c)=1 then print(a,b,c,A,B,C);
> end if;
> end do:end do:end do;


Здесь a, b, c - целочисленные радиусы трёх окружностей, которые касаются друг друга. Какое условие необходимо, чтобы из этого списка выбрать такие окружности, которые имеют общую касательную?

Kitonum
Сообщения: 2084
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Сообщение Kitonum » Вс июн 16, 2013 11:14 pm

berg писал(а):Мне не совсем понятно ваше пояснение.
Привожу самодельную программку для решения указанной задачи...

Я неправильно понял Ваш первый пост. Под окружностями, имеющими общую касательную, я понял две окружности, для которых существует прямая, которая касается каждой из окружностей. А Вы, судя по Вашей программе, просто ищите всевозможные тройки окружностей, которые попарно внешним образом касаются друг друга (к тому же треугольник с вершинами в центрах этих окружностей должен иметь целую площадь). В принципе, в Вашей программе всё правильно. Никаких дополнительных условий не нужно. Ведь если расстояние между центрами равно a+b, а радиусы окружностей a и b , то они обязательно касаются.
Я слегка подкорректировал Вашу программу. Убрал кое-что лишнее. Результаты выводятся не в столбец на каждом шаге как у Вас, а записываются в список L. Вывод более компактен и со списком удобнее работать в дальнейшем, если это понадобится. Если радиусы окружностей не превосходят 30, то получаем всего 50 решений.

restart;
L:=[]:
for a to 30 do
for b from a to 30 do
for c from b to 30 do
A:=a+b;
B:=a+c;
C:=b+c;
p:=(A+B+C)/2;
S:=sqrt(p*(p-A)*(p-B)*(p-C));
if frac(S)=0 and igcd(a,b,c)=1 then L:=[op(L), [a,b,c,A,B,C]]: end if:
end do:
end do:
end do:
op(L);
nops(L);


[1, 2, 3, 3, 4, 5], [1, 2, 24, 3, 25, 26], [1, 3, 12, 4, 13, 15], [1, 4, 4, 5, 5, 8], [1, 5, 24, 6, 25, 29], [1, 6, 14, 7, 15, 20], [1, 7, 28, 8, 29, 35], [1, 8, 9, 9, 10, 17], [1, 12, 12, 13, 13, 24], [1, 14, 27, 15, 28, 41], [1, 15, 24, 16, 25, 39], [1, 18, 19, 19, 20, 37], [1, 24, 24, 25, 25, 48], [2, 3, 3, 5, 5, 6], [2, 3, 10, 5, 12, 13], [2, 3, 27, 5, 29, 30], [2, 9, 11, 11, 13, 20], [2, 10, 15, 12, 17, 25], [2, 13, 24, 15, 26, 37], [2, 15, 15, 17, 17, 30], [2, 25, 27, 27, 29, 52], [3, 4, 21, 7, 24, 25], [3, 5, 12, 8, 15, 17], [3, 7, 14, 10, 17, 21], [3, 8, 22, 11, 25, 30], [3, 10, 27, 13, 30, 37], [3, 14, 25, 17, 28, 39], [3, 22, 30, 25, 33, 52], [5, 5, 8, 10, 13, 13], [5, 7, 30, 12, 35, 37], [5, 21, 30, 26, 35, 51], [6, 7, 8, 13, 14, 15], [6, 7, 14, 13, 20, 21], [6, 14, 15, 20, 21, 29], [7, 7, 18, 14, 25, 25], [7, 8, 27, 15, 34, 35], [7, 10, 18, 17, 25, 28], [8, 8, 9, 16, 17, 17], [8, 9, 17, 17, 25, 26], [8, 21, 21, 29, 29, 42], [8, 21, 27, 29, 35, 48], [9, 16, 20, 25, 29, 36], [9, 20, 20, 29, 29, 40], [10, 15, 24, 25, 34, 39], [12, 12, 25, 24, 37, 37], [12, 13, 27, 25, 39, 40], [12, 25, 27, 37, 39, 52], [15, 24, 26, 39, 41, 50], [25, 26, 27, 51, 52, 53], [25, 28, 28, 53, 53, 56]

50

berg
Сообщения: 37
Зарегистрирован: Чт янв 19, 2012 8:33 pm

Сообщение berg » Пн июн 17, 2013 6:09 pm

Kitonum, очень благодарен вам за участие. Ваша процедура и удобнее, и компактнее. Но главный мой вопрос остался без ответа. Процедура выдаёт 50 вариантов, но только один из них [1, 4, 4, 5, 5, 8] является искомым результатом: все три окружности лежат на одной прямой, то есть все три окружности имеют общую касательную. Случай это редкий, поэтому я хотел ввести в программу некое условие, которое бы отсекало другие варианты и выводило на экран только окружности с общей касательной. В этом заключается мой вопрос: можно ли сформулировать такое условие?

Kitonum
Сообщения: 2084
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Сообщение Kitonum » Пн июн 17, 2013 10:18 pm

berg писал(а):...Но главный мой вопрос остался без ответа. Процедура выдаёт 50 вариантов, но только один из них [1, 4, 4, 5, 5, 8] является искомым результатом: все три окружности лежат на одной прямой, то есть все три окружности имеют общую касательную. Случай это редкий, поэтому я хотел ввести в программу некое условие, которое бы отсекало другие варианты и выводило на экран только окружности с общей касательной. В этом заключается мой вопрос: можно ли сформулировать такое условие?

Так бы сразу и написали, что помимо всего прочего должна существовать прямая, которая касается всех трёх окружностей!

Ваш пример:

Изображение

Получить условие существования такой прямой можно по схеме:

1) Находите уравнение прямой, которая касается первой и второй окружностей (таких прямых будет две).

2) То же самое для второй и третьей окружности.

3) Проверяете, что одна из первых двух прямых совпадает с одной из вторых двух прямых.

berg
Сообщения: 37
Зарегистрирован: Чт янв 19, 2012 8:33 pm

Сообщение berg » Пт июн 21, 2013 6:56 pm

Получить условие существования такой прямой можно по схеме:
1) Находите уравнение прямой, которая касается первой и второй окружностей (таких прямых будет две).
2) То же самое для второй и третьей окружности.
3) Проверяете, что одна из первых двух прямых совпадает с одной из вторых двух прямых.

Если принять:
(a+b)^2-(b-a)^2=x^2,
(a+c)^2-(c-a)^2=y^2,
то условием существования общей касательной к трём окружностям, касающимся друг с другом,является:
(x+y)^2=4*b*c.
Вот несколько вариантов:
a, b, c, A, B, C
1, 4, 4, 5, 5, 8,
4, 9, 36, 13, 40, 45,
9, 16, 144, 25, 153, 160,
16, 25, 400, 41, 416, 425,
25, 36, 900, 61, 925, 936,
36, 49, 1764, 85, 1800, 1813,
36, 100, 225, 136, 261, 325,

Kitonum
Сообщения: 2084
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Сообщение Kitonum » Пн июн 24, 2013 6:40 pm

berg писал(а):...
Если принять:
(a+b)^2-(b-a)^2=x^2,
(a+c)^2-(c-a)^2=y^2,
то условием существования общей касательной к трём окружностям, касающимся друг с другом,является:
(x+y)^2=4*b*c.
...

Мысли по поводу:

1) Если то, что Вы написали, Вы просто переписали из каких-то ответов, то почему прямо об этом не написать.

2) Если же Вы сами доказали эти формулы, то объясните публике как Вы их получили. Что, например, означают x и y в этих формулах?

berg
Сообщения: 37
Зарегистрирован: Чт янв 19, 2012 8:33 pm

Сообщение berg » Пн июн 24, 2013 9:12 pm

1) Если то, что Вы написали, Вы просто переписали из каких-то ответов, то почему прямо об этом не написать.
2) Если же Вы сами доказали эти формулы, то объясните публике как Вы их получили. Что, например, означают x и y в этих формулах?

Вы плохо обо мне подумали. Данная проблема сначала показалась мне трудной, поэтому я обратился к форуму.
Но оказалось, что она решается на уровне 5-го класса.
Даже получилось выразить радиус одной окружности как функцию двух других.
Скопировать сюда чертеж не сумел, поэтому объясняю на словах.
a, b, c - радиусы окружностей,
A, B, C - стороны треугольника с вершинами в центрах окружностей: А=a+b, B=b+c, C=c+a.
x и y - проекции сторон А и С на общую касательную.
Дальше всё по теореме Пифагора:
x^2 = (a + b)^2 – (b – a)^2 = 4*a*b.
y^2 = (a + c)^2 – (c – a)^2 = 4*a*c.
(x + y)^2 = (b + c)^2 – (c – b)^2 = 4*b*c.
Складываем левые и правые части:
x^2 + y^2 + (x + y)^2 = 2*(x^2 + y^2 + x*y).
4*a*b + 4*a*c + 4*b*c = 4*a*(b + c) + 4*b*c).
Подставляя значения x, y, получим:
a*(b + c + 2*sqrt(b*c) = b*c,
Из чего следует:
a = b*c/(sqrt(b)+ sqrt(c))^2

[/quote]

Kitonum
Сообщения: 2084
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Сообщение Kitonum » Вт июн 25, 2013 12:05 am

Уважаемый berg!

Если Вам нужно разместить здесь картинку, то это делается не путём копирования и вставки. Сначала Вы размещаете свою картинку на любом сайте, который предоставляет хостинг картинок. Я использую radical.ru, на нём не требуется регистрация и всё очень удобно. Здесь же в своём сообщении просто размещаете ссылку, выбрав наиболее подходящий Вам вариант размещения (я обычно выбираю "картинка в тексте").

Посмотрел Ваше доказательство, всё верно. Поучительно в том смысле, что прежде, чем искать что-то в Maple, полезно проверить - а нельзя ли то же самое сделать просто вручную.

Кстати, из Вашей последней формулы следует, что если ищутся целые решения (радиусы окружностей), то перебор достаточно делать только среди квадратов натуральных чисел. Следующий простой код на основе Вашей формулы находит все 211 уникальных решения (среди них нет подобных и получающихся перестановками), для которых радиусы не превышают 1000000:

M:=[seq(i^2, i=1..1000)]:
L:=[]:
for b in M do
K:=[seq(i^2, i=sqrt(b)..1000)]:
for c in K do
a:=b*c/(sqrt(b)+ sqrt(c))^2:
if type(a, integer) and igcd(a, b, c)=1 then L:=[op(L), [a, b, c]]: fi:
od: od:
L;