У меня есть два уравнения:
ellipseOne = '((x-1)^2)/6^2 + y^2/3^2 = 1';
и
ellipseTwo = '((x+2)^2)/2^2 + ((y-5)^2)/4^2 = 1';
и я построил их:
ezplot(ellipseOne, [-10, 10, -10, 10])
hold on
ezplot(ellipseTwo, [-10, 10, -10, 10])
title('Ellipses')
hold off
Теперь я пытаюсь найти пересечение двух эллипсов. Я пробовал:
intersection = solve(ellipseOne, ellipseTwo)
intersection.x
intersection.y
чтобы найти точки, где они пересекаются, но MATLAB дает мне матрицу и уравнение в качестве ответа, который я не понимаю. Может ли кто-нибудь указать мне в правильном направлении, чтобы получить координаты пересечения?
Решение находится в символической форме. Последний шаг, который вам нужно сделать, – преобразовать его в числовое. Просто преобразуйте результат с помощью double
. Однако, поскольку это пара квадратичных уравнений, существует 4 возможных решения из-за неоднозначности знака (т.е. +/-
) и, возможно, дает мнимые корни. Таким образом, изолируйте реальные решения и оставшиеся должны быть вашими ответами.
Следовательно:
% Your code
ellipseOne = '((x-1)^2)/6^2 + y^2/3^2 = 1';
ellipseTwo = '((x+2)^2)/2^2 + ((y-5)^2)/4^2 = 1';
intersection = solve(ellipseOne, ellipseTwo);
% Find the points of intersection
X = double(intersection.x);
Y = double(intersection.y);
mask = ~any(imag(X), 2) | ~any(imag(Y), 2);
X = X(mask); Y = Y(mask);
Первые три строки кода – это то, что вы сделали. Следующие четыре строки извлекают корни в числовой форме, затем я создаю маску logical
, которая изолирует только те точки, которые являются реальными. Это рассматривает мнимую часть как координаты X
, так и Y
всех корней, и если для любого из корней есть такая компонента, мы хотим их устранить. Наконец, мы удалим корни, которые являются мнимыми, и нам следует оставить два вещественных корня.
Таким образом, мы получаем для наших точек пересечения:
>> disp([X Y])
-3.3574 2.0623
-0.2886 2.9300
Первый столбец – это координата X
, а второй столбец – координата Y
. Это также, похоже, согласуется с сюжетом. Я возьму ваш код построения эллипса, а также вставлю точки пересечения в виде синих точек, используя указанное выше решение:
ezplot(ellipseOne, [-10, 10, -10, 10])
hold on
ezplot(ellipseTwo, [-10, 10, -10, 10])
% New - place intersection points
plot(X, Y, 'b.');
title('Ellipses');
hold off;