あなたはezplot
からXData
とYData
を取ることができます:
c = rand;
V = rand(2);
V = V + V';
fh= @(x1,x2) [x1 x2]*V*[x1 x2]'-c;
h = ezplot(fh,[-4,4,-4,4]); % plot in range
axis equal
fun = @(x) [x(1) x(2)]*V*[x(1) x(2)]'-c;
X = fsolve(fun, [1 1]); % specific solution
hold on;
plot(x(1),x(2),'or');
% possible solutions in range
x1 = h.XData;
x2 = h.YData;
か、fsolve
へのベクトル入力を使用することができます。
c = rand;
V = rand(2);
V = V + V';
x1 = linspace(-4,4,100)';
fun2 = @(x2) sum(([x1 x2]*V).*[x1 x2],2)-c;
x2 = fsolve(fun2, ones(size(x1)));
% remove invalid values
tol = 1e-2;
x2(abs(fun2(x2)) > tol) = nan;
plot(x1,x2,'.b')
をしかし、最も簡単で単純なアプローチは、再配置することです楕円matrix formは、二次方程式の形式で
k = rand;
V = rand(2);
V = V + V';
a = V(1,1);
b = V(1,2);
c = V(2,2);
% rearange terms in the form of quadratic equation:
% a*x1^2 + (2*b*x2)*x1 + (c*x2^2) = k;
% a*x1^2 + (2*b*x2)*x1 + (c*x2^2 - k) = 0;
x2 = linspace(-4,4,1000);
A = a;
B = (2*b*x2);
C = (c*x2.^2 - k);
% solve regular quadratic equation
dicriminant = B.^2 - 4*A.*C;
x1_1 = (-B - sqrt(dicriminant))./(2*A);
x1_2 = (-B + sqrt(dicriminant))./(2*A);
x1_1(dicriminant < 0) = nan;
x1_2(dicriminant < 0) = nan;
% plot
plot(x1_1,x2,'.b')
hold on
plot(x1_2,x2,'.g')
hold off
ありがとうございます。最初の解決策では、私はXDataとYDataを取得することができますが、解決策がゼロであるペアをどのように知ることができますか? 2番目の解決策では、プロットは楕円のようには見えません。どのように楕円を退職できますか? – Astrid
'ezplot'プロット**その解がゼロである' x'.'y'ペアの** ** ** ** ** **のみです。この例で使用したランダムな行列のために、時にはソリューションとして、時には漸近線として楕円を取得します。独自の行列を使用すると、楕円が得られるはずです(正しい解決策である場合に備えて)。 – user2999345
XDataとYDataの両方があるステップで-4から4になります。楕円から、例えば、 -3.96と-3.96は実行可能な解決策ではありません。だから私はx = -3.96に対応するyがどれかを知りたい。 – Astrid