在矩阵形式给出的MATLAB中绘制椭圆

时间:2013-04-10 01:55:30

标签: matlab geometry ellipse

我有一个2维椭圆,由正定矩阵X定义如下:如果x'* X * x <= 1,则点x在椭圆中。如何在matlab中绘制这个椭圆?我做了一些搜索,却发现意外的很少。

实际得出答案:我会将此作为答案发布,但它不会让我(新用户):

经过一些修修补补后想出来。基本上,我们将椭圆边界上​​的点(x'* X * x = 1)表示为X的特征向量的加权组合,这使得一些数学计算更容易找到点。我们可以写(au + bv)' X (au + bv)= 1并计算a,b之间的关系。 Matlab代码如下(抱歉它很乱,只是使用了我用笔/纸使用的相同符号):

function plot_ellipse(X, varargin)
% Plots an ellipse of the form x'*X*x <= 1

% plot vectors of the form a*u + b*v where u,v are eigenvectors of X

[V,D] = eig(X);
u = V(:,1);
v = V(:,2);
l1 = D(1,1);
l2 = D(2,2);

pts = [];

delta = .1;

for alpha = -1/sqrt(l1)-delta:delta:1/sqrt(l1)+delta
    beta = sqrt((1 - alpha^2 * l1)/l2);
    pts(:,end+1) = alpha*u + beta*v;
end
for alpha = 1/sqrt(l1)+delta:-delta:-1/sqrt(l1)-delta
    beta = -sqrt((1 - alpha^2 * l1)/l2);
    pts(:,end+1) = alpha*u + beta*v;
end

plot(pts(1,:), pts(2,:), varargin{:})

1 个答案:

答案 0 :(得分:3)

我在搜索这个主题时偶然发现了这篇文章,即使它已经解决了,我想如果矩阵是对称的,我可能会提供另一个更简单的解决方案。

另一种方法是使用Matlab中实现的半定正矩阵E的Cholesky分解作为chol函数。它计算上三角矩阵R,使得X = R&#39; * R.使用它,x&#39; * X * x =(R * x)&#39; *(R * x)= z&#39; * z,如果我们将z定义为R * x。

因此绘制的曲线变为z&#39; * z = 1,并且这是一个圆。因此,对于0 <= t <=2π,简单的解是z =(cos(t),sin(t))。然后乘以R的倒数得到椭圆。

转换为以下代码非常简单:

function plot_ellipse(E)
 % plots an ellipse of the form xEx = 1
 R = chol(E);
 t = linspace(0, 2*pi, 100); % or any high number to make curve smooth
 z = [cos(t); sin(t)];
 ellipse = inv(R) * z;
 plot(ellipse(1,:), ellipse(2,:))
end 

希望这可能会有所帮助!