Как стать автором
Обновить

Комментарии 10

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

Не уловил какая… o_0
Подскажете?
Это была переменная nDiffSpt
Как Вы вовремя со статьей!

Сейчас ради в помощь местным экологам пытаюсь реализовать алгоритм гиперболической навигации для определения координат выстрелов браконьеров в лесу.
Вот бы еще найти простой способ аналитически находить пересечение гипербол))
А что значит «простой способ»? Уравнение четвертой степени решается в радикалах. Формула, конечно длинная, но вычислительная сложность не слишком велика.
Если свести к многочлену, проблем уже не будет. Но сводить тоже долго.

Хотя…
Пусть есть 4 точки A,B,C,D, и мы хотим найти X такую, что AX-BX=2*d1, CX-DX=2*d2 (d1,d2>=0)
Сначала найдём середины отрезков AB и CD, обозначим через P,Q. Длины отрезков — через 2*r1 и 2*r2 соответственно. Введём векторы V=PB/r1, W=QD/r2.
В системе координат с центром P и осью x, направленной вдоль V, правая ветвь гиперболы выражается параметрически:
x=d1*(a^2+1)/(2*a)
y=sqrt(r1^2-d1^2)*(a^2-1)/(2*a)
для a>0.
Переводим эту точку (x,y) в систему координат с центром Q и осью x, направленной вдоль вектора W. Получим
x2=f1(a)/(2*a), y2=f2(a)/(2*a),
где f1 и f2 — многочлены второй степени.
Вторая гипербола в этой системе координат имеет уравнение x^2/d2^2-y^2/(r2^2-d2^2)=1, причём нас интересуют только точки с x>0. Подставив в это уравнение наши x2,y2, получим
f1(a)^2/d2^2-f2(a)^2/(r2^2-d2^2)-4*a^2=0 — это многочлен 4-й степени, и найти его вещественные корни — дело техники. Напомню, что нас интересуют только корни с a>0, f1(a)>0.
Если гипербол больше, то дело обстоит хуже. Придётся применять метод наименьших квадратов — строить сумму многочленов (x^2/p^2-y^2/q^2-1)^2, где x и y для разных многочленов заданы в разных координатных системах, и искать её минимум. Если через частные производные аналитически — получится уравнение 9-й степени. Лучше использовать метод Ньютона, стартуя от уже вычисленных точек пересечения пар гипербол.


Вот такая у меня система.
Все кроме x и y известно. Система собрана исходя из главного свойства геометрического места точек гиперболы. Разница расстояний от точки к фокусам = константа.
Время от времени к ней возвращаюсь, но воз и нынче там.
Символьный движок Mupad тоже сдался.

Подскажите, куда копать?
Maple с моей помощью справился без особого труда.
Если координаты точек обозначить (x1,y1), (x2,y2) и (x3,y3), то полиномиальные уравнения гипербол примут такой вид:
Уравнения
F1 = (-8*x1*x2+4*x2^2+4*x1^2-16*a12^2)*x^2+((8*x1*y1-8*y1*x2+8*x2*y2-8*x1*y2)*y
+16*x2*a12^2-4*x2*y2^2-4*x1^3-4*x1*y1^2+16*a12^2*x1+4*x1*x2^2+4*x1^2*x2+4*y1^2*x2+4*x1*y2^2-4*x2^3)*x
+(-16*a12^2-8*y1*y2+4*y1^2+4*y2^2)*y^2
-(-4*x2^2*y2-4*y1^3+16*y2*a12^2+4*y1^2*y2+4*x1^2*y2-4*x1^2*y1+4*y1*y2^2+4*y1*x2^2-4*y2^3+16*a12^2*y1)*y
+x2^4-2*y1^2*x2^2-2*y1^2*y2^2-8*a12^2*x1^2-8*x2^2*a12^2-8*a12^2*y1^2+x1^4+y1^4+2*x2^2*y2^2+2*x1^2*y1^2
-2*x1^2*x2^2-2*x1^2*y2^2+y2^4-8*y2^2*a12^2+16*a12^4

F2 = (-8*x1*x3+4*x1^2+4*x3^2-16*a13^2)*x^2+((-8*x1*y3+8*x3*y3-8*y1*x3+8*x1*y1)*y
+16*a13^2*x1+4*x1*x3^2+4*y1^2*x3+4*x1^2*x3+16*x3*a13^2-4*x3*y3^2+4*x1*y3^2-4*x1^3-4*x3^3-4*x1*y1^2)*x
+(-16*a13^2+4*y1^2+4*y3^2-8*y1*y3)*y^2
+(16*a13^2*y1-4*y1^3+16*y3*a13^2-4*x1^2*y1+4*y1*x3^2-4*y3^3+4*x1^2*y3+4*y1*y3^2+4*y1^2*y3-4*x3^2*y3)*y
+y1^4-2*x1^2*x3^2-2*x1^2*y3^2-2*y1^2*x3^2-2*y1^2*y3^2-8*a13^2*x1^2+16*a13^4-8*a13^2*y1^2+2*x3^2*y3^2
+2*x1^2*y1^2-8*x3^2*a13^2-8*y3^2*a13^2+x1^4+y3^4+x3^4


Перепишем их в виде
F1=a1*x^2+2*b1*x*y+c1*y^2+2*d1*x+2*e1*y+f1;
F2=a2*x^2+2*b2*x*y+c2*y^2+2*d2*x+2*e2*y+f2;

Базис Гребнера этой системы будет выглядеть так:
Базис Гребнера
V1 = (4*c2*a2*b1^2-4*b2*c2*b1*a1-4*b1*c1*b2*a2+c2^2*a1^2-2*c1*a2*a1*c2+c1^2*a2^2+4*c1*b2^2*a1)*x^4
+(8*c1*b2*e2*a1-4*c2*c1*a2*d1+8*b1^2*c2*d2-4*c2*e1*b2*a1-4*c1*b2*e1*a2-8*b1*c2*b2*d1+4*c2^2*a1*d1
-4*c2*c1*a1*d2-4*b1*c2*e2*a1+8*c1*b2^2*d1+4*c1^2*a2*d2+8*b1*c2*e1*a2-4*b1*c1*e2*a2-8*b1*c1*b2*d2)*x^3
+(4*c1*b2^2*f1-2*c2*f1*c1*a2-4*b1*c2*b2*f1-8*b1*c2*d1*e2-2*c2*c1*f2*a1+4*c1*e2^2*a1+4*c2*e1^2*a2
+4*c1^2*d2^2-4*c2*e1*e2*a1-8*c1*b2*e1*d2+2*c2^2*f1*a1+2*c1^2*f2*a2+16*c1*b2*e2*d1-8*c2*e1*b2*d1
-8*c2*c1*d1*d2+4*c2^2*d1^2-4*c1*e2*e1*a2-4*b1*c1*b2*f2+4*b1^2*c2*f2-8*b1*c1*e2*d2+16*b1*c2*d2*e1)*x^2
+(-8*c2*d1*e2*e1-4*c2*e1*b2*f1-4*c2*f1*c1*d2+8*c1*e2^2*d1+4*c1^2*f2*d2+8*b1*c2*f2*e1-4*c1*b2*e1*f2
+8*c2*d2*e1^2+4*c2^2*d1*f1-8*c1*e2*e1*d2+8*c1*b2*e2*f1-4*c2*c1*f2*d1-4*b1*c2*f1*e2-4*b1*c1*e2*f2)*x
-4*c2*f1*e2*e1+4*c2*f2*e1^2-4*c1*e2*e1*f2+c2^2*f1^2-2*c2*c1*f2*f1+4*c1*e2^2*f1+c1^2*f2^2

V2 = (-4*c2^2*b1^3*a2-c2*b1*c1^2*a2^2-c2^3*b1*a1^2-4*c1^2*b2^2*b1*a2+c1*b2*c2^2*a1^2+4*c1^2*b2^3*a1
+2*c2^2*b1*c1*a2*a1+4*c2^2*b1^2*b2*a1-8*c1*b2^2*a1*c2*b1+8*c1*b2*c2*b1^2*a2-2*c1^2*b2*a2*c2*a1+c1^3*b2*a2^2)*x^3
+(-8*c2^2*b1^3*d2+8*c1^2*b2^3*d1-c1^3*a2^2*e2+c2^3*a1^2*e1-4*c2*b1*c1^2*a2*d2-2*c1*a2*c2^2*e1*a1
+4*c1*b2*c2^2*a1*d1+16*c1*b2*c2*b1^2*d2-4*c1^2*b2*c2*a1*d2-8*c1*b2*c2*b1*e2*a1+4*c2^2*b1*c1*a1*d2
-16*c1*b2^2*d1*c2*b1-4*c1^2*b2*a2*c2*d1+4*c2^2*b1*c1*a2*d1+8*c1*b2*e1*c2*b1*a2+2*c1^2*a2*e2*c2*a1
-8*c1^2*b2^2*b1*d2+4*c1^2*b2^2*e2*a1-c1*c2^2*a1^2*e2+c1^2*a2^2*c2*e1-4*c1^2*b2^2*e1*a2-4*c2^2*b1^2*e1*a2
-4*c2^3*b1*a1*d1+8*c2^2*b1^2*b2*d1+4*c2^2*b1^2*e2*a1+4*c1^3*b2*a2*d2)*x^2
+(-8*c2^2*b1^2*e1*d2-4*c2^3*b1*d1^2+4*c2^2*b1^2*b2*f1-c2^3*b1*a1*f1+2*c2^3*a1*e1*d1+8*c2^2*b1^2*e2*d1
-4*c1^2*b2^2*b1*f2+c1^3*b2*a2*f2-2*c1^3*a2*e2*d2-4*c2*b1*c1^2*d2^2+4*c1*b2*c2^2*d1^2+8*c1^2*b2^2*e2*d1
-8*c1^2*b2^2*e1*d2+4*c1^3*b2*d2^2+4*c1^2*b2^3*f1-4*c2^2*b1^3*f2+c2^2*b1*c1*a2*f1+c2^2*b1*c1*a1*f2
-8*c1*b2^2*f1*c2*b1+c1*b2*c2^2*a1*f1+8*c1*b2*c2*b1^2*f2-c1^2*b2*a2*c2*f1-c1^2*b2*c2*a1*f2
-2*c1*c2^2*a1*e1*d2-2*c1*a2*c2^2*e1*d1-2*c1*c2^2*a1*e2*d1+2*c1^2*c2*a1*e2*d2-c2*b1*c1^2*a2*f2
-8*c1^2*b2*d2*c2*d1+2*c1^2*a2*e2*c2*d1+8*c2^2*b1*c1*d1*d2+2*c1^2*a2*c2*e1*d2+16*c1*b2*e1*c2*b1*d2
-16*c1*b2*c2*b1*e2*d1)*x
+4*c2^2*b1^2*e2*f1-2*c1^2*b2*d2*c2*f1+c1^2*a2*e2*c2*f1-4*c2^2*b1^2*e1*f2+2*c2^2*b1*c1*d1*f2-2*c2^3*b1*d1*f1
-2*c2*b1*c1^2*d2*f2+2*c2^2*b1*c1*d2*f1+2*c1*b2*c2^2*d1*f1-2*c1^2*b2*c2*d1*f2+c1^2*a2*c2*e1*f2
-c1*a2*c2^2*e1*f1-c1*c2^2*a1*e1*f2+c2^3*a1*e1*f1+c1^2*c2*a1*e2*f2-c1*c2^2*a1*e2*f1-4*c1^2*b2^2*e1*f2+4*c1^2*b2^2*e2*f1
-8*c1*b2*c2*b1*e2*f1-c1^3*a2*e2*f2+2*c1^3*b2*d2*f2+8*c1*b2*e1*c2*b1*f2
+(-2*c2^2*b1^2*c1*f2+2*c2^3*b1^2*f1+2*c1^2*b2^2*c2*f1+2*c1^2*c2*a1*e2^2+2*c2^3*a1*e1^2-2*c1*a2*c2^2*e1^2
+4*c1^3*b2*d2*e2-4*c1*b2*c2^2*b1*f1+4*c1^2*b2*c2*b1*f2-2*c1^3*a2*e2^2-2*c1^3*b2^2*f2-4*c1^2*b2*d2*c2*e1
+4*c1^2*a2*e2*c2*e1+4*c2^2*b1*c1*d1*e2-4*c2^3*b1*d1*e1-4*c2*b1*c1^2*d2*e2+4*c2^2*b1*c1*d2*e1
+4*c1*b2*c2^2*d1*e1-4*c1^2*b2*c2*d1*e2-4*c1*c2^2*a1*e1*e2)*y



V1 — уравнение 4-й степени на x, а V2 — линейное уравнение на y (с коэффициентами, содержащими x). К сожалению, в этом виде система будет работать не всегда:(если у двух точек пересечения будут одинаковые значения x, то второе уравнение примет вид 0*y=0. Но в этом случае можно просто подставить x в уравнение гиперболы, и получить квадратное уравнение на y. А потом подставить во вторую гиперболу и проверить.
Maple с моей помощью справился без особого труда.


Я пользуюсь MATLAB и Mathcad… Оба продукта ранее использовали символьное ядро Мапл, а сейчас перешли на Mupad.
Возможно в сторону Maple стоит таки посмотреть.

Большое спасибо за демонстрацию решаемости!
Будем разбираться.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий