2013-04-10 2 views
0

У меня есть эллипс в 2 размерах, определяемый положительно определенной матрицей X следующим образом: точка x находится в эллипсе, если x '* X * x < = 1. Как можно Я рисую этот эллипс в 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

ответ

3

Я наткнулся на этот пост во время поиска по этой теме, и даже если это улажено, я думал, может обеспечить другое более простое решение, если матрица симметрична.

Другой способ сделать это - использовать разложение Холески полуопределенной положительной матрицы E, реализованное в Matlab, как функция chol. Он вычисляет верхнюю треугольную матрицу R такую, что X = R '* R. Используя это, x' * X * x = (R * x) * * (R * x) = z '* z, если мы определим z как R *Икс.

Кривая для построения таким образом становится такой, что z '* z = 1, и это круг. Таким образом, простым решением является z = (cos (t), sin (t)), для 0 < = t < = 2 pi. Затем вы умножаете на обратный 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 

Надеется, что это может помочь!

Смежные вопросы