我有一个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{:})
答案 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
希望这可能会有所帮助!