【发布时间】:2012-08-17 11:53:24
【问题描述】:
我需要使用其一般形式(x-c)'A(x-c)=1 绘制一个二维椭圆
我想知道如何在 MATLAB 中使用ezplot 有效地做到这一点。
【问题讨论】:
标签: matlab plot implicit curve
我需要使用其一般形式(x-c)'A(x-c)=1 绘制一个二维椭圆
我想知道如何在 MATLAB 中使用ezplot 有效地做到这一点。
【问题讨论】:
标签: matlab plot implicit curve
这个答案几乎适用于任何可以在 MATLAB 中表述为隐式曲面/曲线的问题。我将在椭圆上演示它。
短版:
A = [5 4; 4 5]
c = [1; 2]
elFunc = @(A11,A22,A12,A21,c1,c2,x,y) (c1-x).*(A11*(c1-x)+A21*(c2-y))+(c2-y).*(A12*(c1-x)+A22*(c2-y))-1
ezplot(@(x,y) elFunc(A(1,1),A(2,2),A(1,2),A(2,1),c(1),c(2),x,y), [0 2 0 4])
加长版:
一个椭圆可以隐式地写成它最一般的形式(对于任何维度)
(x-c)'A(x-c) = 1 or (x-c)'A(x-c)-1 = 0
其中 x,c 在 R^n 中,A 是一个 nxn 矩阵。
为了将其转换为 MATLAB 可以使用的形式,我们可以使用符号工具箱。 对于二维椭圆,我们写:
syms A11 A12 A21 A22 c1 c2 x y real
impl = ([x y]-[c1 c2])*[A11 A12; A21 A22]*([x;y]-[c1;c2])-1
这会产生以下输出:
(c1 - x)*(A11*(c1 - x) + A21*(c2 - y)) + (c2 - y)*(A12*(c1 - x) + A22*(c2 - y)) - 1
我们不再需要符号工具箱,所以我们只需复制字符串,通过添加点运算符版本对其进行矢量化并将其转换为函数
elFunc = @(A11,A22,A12,A21,c1,c2,x,y) (c1-x).*(A11*(c1-x)+A21*(c2-y))+(c2-y).*(A12*(c1-x)+A22*(c2-y))-1
现在我们可以使用 ezplot 来绘制我们的曲线了。 ezplot 假设当你给它一个函数句柄时,它需要求解 func = 0 所以我们的曲线已经由 elFunc 以隐式格式描述。 剩下要做的就是定义我们希望 ezplot 尝试绘制曲线的域。下面的例子演示了结果:
A = [5 4; 4 5]
c = [1; 2]
elFunc = @(A11,A22,A12,A21,c1,c2,x,y) (c1-x).*(A11*(c1-x)+A21*(c2-y))+(c2-y).*(A12*(c1-x)+A22*(c2-y))-1
ezplot(@(x,y) elFunc(A(1,1),A(2,2),A(1,2),A(2,1),c(1),c(2),x,y), [0 2 0 4])
【讨论】:
这个答案和@twerdster 的答案完全一样,只是符号有点Matlabby:
A = [5 4; 4 5];
c = [1 2];
elFunc = @(x,y) sum(([x(:)-c(1) y(:)-c(2)] * A) .* [x(:)-c(1) y(:)-c(2)], 2) - 1;
ezplot(elFunc, [0 2 0 4])
最后一点:正如我们的两个答案已经表明的那样,ezplot 适用于易于绘制的事物。对于匿名函数和ezplot,椭圆已经处于“简单”的边缘。
一般来说,我建议您避免将ezplot 用于比ezplot(@(x)sin(x).*cos(2*x)) 更难的事情。在functions 和plot()、surf() 和朋友中练习和变得流利更有成效。
【讨论】:
ezplot 不应用于“复杂”(即现实生活)绘图目的。