如何在MATLAB中找到两个椭圆的交点

3

我有两个方程:

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给我返回了一个矩阵和一个方程,我不理解。有人能指导我如何获取相交点的坐标吗?


你在这里使用solve的方式是不正确的;调用应该是S = solve(eqn,var)。最简单的处理方法,因为两个方程都等于1,是将这两个方程相等并相减。所以椭圆差异= '((x-1)^2)/6^2 + y^2/3^2 -((x+2)^2)/2^2 - ((y-5)^2)/4^2 = 0'。 - Ian Riley
1
@IanRiley 一般使用 solve 的方式是 S = solve(eqn1, eqn2, ... eqnM, var1, var2, ... varN);。这种用法是正确的。省略任何 var* 变量会自动确定变量。然而,当前的 solve 文档却是你所说的那种方式... 这相当奇怪。在 MATLAB R2015b 中执行 help solve 命令会给出第一种调用方式。我假设第一种方式最终会被弃用,但在此处仍然可以使用。 - rayryeng
哦,文档中竟然存在这样的缺陷,感谢 @rayryeng 的提示。 - Ian Riley
1个回答

7

这个解法是以符号形式呈现的。你需要进行的最后一步是将其转化为数字形式。只需使用 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 掩码,只隔离出实际存在的点。 这会查看所有根的 XY 坐标的虚部,如果任何一组根有这样的组件,我们就想要将其排除。 最后,我们删除虚数根,应该剩下两个实数根。

因此,我们获得以下交点:

>> 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;

enter image description here


2
这正是我所需要的。非常感谢你。 - kneedhelp
如何判断一个椭圆是否在另一个椭圆内? - manoos
@manoos 我现在看到你的问题了。很遗憾,这个问题超出了本问题的范围。你需要提出一个新的问题。如果你已经提出了问题,请给我发送一个链接。 - rayryeng
@rayryeng:您可以在此链接 https://stackoverflow.com/questions/56927210/how-can-i-check-one-ellipse-is-inside-the-another-ellipse-by-using-matlab?noredirect=1#comment100396679_56927210 上回复吗? - manoos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接