0

次のように正定行列 X で定義された 2 次元の楕円があります: 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{:})
4

1 に答える 1

4

このトピックを検索しているときにこの投稿に出くわしました。解決したとしても、行列が対称であれば、別のより簡単な解決策を提供できると思いました。

cholこれを行う別の方法は、Matlab で関数として実装されている半正定行列 E のコレスキー分解を使用することです。X = R' * R となるような上三角行列 R を計算します。これを使用して、z を R と定義すると、x'*X*x = (R*x)'*(R*x) = z'*z となります。 *バツ。

したがって、プロットする曲線は z'*z=1 となり、円になります。したがって、0<=t<=2 pi の場合、単純な解は 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 

これが役立つことを願っています!

于 2015-12-16T09:42:46.610 に答える