【问题标题】:How can one use ezplot in MATLAB to effectively draw implicit curves and surfaces?如何在 MATLAB 中使用 ezplot 有效地绘制隐式曲线和曲面?
【发布时间】:2012-08-17 11:53:24
【问题描述】:

我需要使用其一般形式(x-c)'A(x-c)=1 绘制一个二维椭圆

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

【问题讨论】:

    标签: matlab plot implicit curve


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这个答案和@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() 和朋友中练习和变得流利更有成效。

      【讨论】:

      • 确实更像Matlabby :)
      • +1 表示 ezplot 不应用于“复杂”(即现实生活)绘图目的。
      猜你喜欢
      • 2018-01-30
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多