2013-04-10 502 views
0

我有一个2维的椭圆,由正定矩阵X定义如下:如果x'* X * x < = 1,则点x在椭圆中。我在matlab中绘制这个椭圆?我做了一些搜索,同时发现很少。在矩阵形式给出的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

我明白了,但它不会让我发表答案。如果我记得的话,我明天就会发布它 – John 2013-04-10 01:59:26

回答

3

,即使它的解决,我想我如果矩阵是对称的,可能会提供另一个更简单的解决方案。

这样做的另一种方法是使用在Matlab中实现的半正定正矩阵E的Cholesky分解作为chol函数。它计算一个上三角矩阵R,使得X = R'* R。使用这个,如果我们定义z为R,那么x'* X * x =(R * x)'*(R * x)= z'* z *X。

因此,绘制曲线变得z'* z = 1,这就是一个圆。因此,一个简单的解决方案是z =(cos(t),sin(t)),因为0 < = t < =2π。然后乘以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 

希望这可以帮助!