如何在MATLAB中使用ezplot有效地绘制隐式曲线和曲面?

如何在MATLAB中使用ezplot有效地绘制隐式曲线和曲面?,matlab,plot,implicit,curve,Matlab,Plot,Implicit,Curve,我需要用它的一般形式画一个二维椭圆(x-c)'a(x-c)=1 我想知道如何使用MATLAB有效地做到这一点 这个答案适用于几乎所有在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 ezpl

我需要用它的一般形式画一个二维椭圆
(x-c)'a(x-c)=1


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

这个答案适用于几乎所有在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])
长版本:

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在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])

这个答案适用于几乎所有在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])
长版本:

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在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的答案完全相同,只是符号有点复杂:

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))
更难的事情。练习并熟练掌握
函数
s和
plot()
surf()
,以及朋友,效果会更好

这个答案与@twerdster的答案完全相同,只是符号有点复杂:

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))
更难的事情。练习并熟练掌握
函数
s和
plot()
surf()
,以及朋友,效果会更好

实际上,更为Matlabby:)+1表示
ezplot
不应用于“复杂”(即现实生活)绘图目的。更为Matlabby:)+1表示
ezplot
不应用于“复杂”(即现实生活)绘图目的。