如何在 MATLAB 中找到两个椭圆的交点
How to find the intersection of two ellipses in MATLAB
我有两个等式:
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;
我有两个等式:
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;