1

我需要使用它的一般形式绘制一个 2D 椭圆(x-c)'A(x-c)=1

我想知道如何在 MATLAB 中使用ezplot有效地做到这一点。

4

2 回答 2

5

这个答案适用于几乎任何可以在 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])

由 ezplot 在 MATLAB 中绘制的椭圆

于 2012-08-17T11:53:24.200 回答
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()和朋友会更有成效。

于 2012-08-17T12:37:57.427 回答