我需要使用它的一般形式绘制一个 2D 椭圆(x-c)'A(x-c)=1
我想知道如何在 MATLAB 中使用ezplot有效地做到这一点。
这个答案适用于几乎任何可以在 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))
。function
练习并流利使用s 和plot()
,surf()
和朋友会更有成效。