在复杂坐标上定义的Matlab绘图函数

时间:2014-05-14 14:09:48

标签: matlab plot

我想绘制一些像这样的数字:

-axis是真实的,并且是某些复数值向量的一部分(通常是纯粹的或真实的)

- 在给定的情况下有一些3D可视化

enter image description here

1 个答案:

答案 0 :(得分:3)

首先,将复杂函数定义为(Re(x), Im(x))的函数。在复杂分析中,您可以将任何复杂函数分解为其实部和虚部。换句话说:

F(x) = Re(x) + i*Im(x) 

对于二维网格,您显然可以扩展到以(x,y)方式定义函数。换句话说:

F(x,y) = Re(x,y) + i*Im(x,y) 

在您的情况下,我假设您需要2D方法。因此,让我们使用IJ分别表示实部和虚部。另外,让我们从一个简单的示例开始,例如cos(x) + i*sin(y) 基于非常受欢迎的Euler exponential function。它并不准确,但我对其进行了略微修改,因为情节看起来不错。

以下是您在MATLAB中要做的步骤:

  1. 根据IJ
  2. 定义您的功能
  3. 在两个域中创建一组点 - 类似meshgrid的工作
  4. 使用三维可视化图 - 您可以绘制各个点,或在曲面上绘制(如surfmesh)。
  5. NB:因为这是一个复数值函数,所以让我们绘制输出的幅度。你对你的细节非常模糊,所以让我们假设我们正在绘制幅度。

    让我们逐行代码执行此操作:

    % // Step #1
    F = @(I,J) cos(I) + i*sin(J);
    
    % // Step #2
    [I,J] = meshgrid(-4:0.01:4, -4:0.01:4);
    
    % // Step #3
    K = F(I,J);
    
    % // Let's make it look nice!
    mesh(I,J,abs(K));
    xlabel('Real');
    ylabel('Imaginary');
    zlabel('Magnitude');
    colorbar;
    

    这是你得到的结果:

    enter image description here

    让我们慢慢地逐步完成这段代码。步骤#1是一个匿名函数,它是根据IJ定义的。第2步将IJ定义为矩阵,其中IJ中的每个位置都会在匹配的空间位置为您提供实数和虚数坐标,以便进行评估复杂的功能。我已将两个域定义为[-4,4]之间。第一个参数跨越实轴,而第二个参数跨越虚轴。显然可以根据需要更改限制。确保步长足够小,以使绘图平滑。步骤#3将获取每个复数值并评估结果是什么。之后,您将创建一个3D网格图,该图将绘制前两个维中的实轴和虚轴以及第三个维中复数的幅度abs()取MATLAB中的绝对值。如果矩阵内的内容是真实的,那么它只返回数字的正数。如果矩阵内的内容很复杂,则返回复数值的大小/长度。

    我已经标记了轴并在侧面放置了colorbar,以将表面图的高度可视化为颜色。它还可以让您了解这些值的高度和长度,以更加愉悦和直观的方式。

    轻轻推动你的方向,让我们从这个复杂的功能中取出一片。让实部分等于0,而虚部则跨越[-4,4]。您可以使用mesh绘制积分,而不是使用surfplot3。因此,尝试这样的事情:

    F = @(I,J) cos(I) + i*sin(J);
    
    J = -4:0.01:4;
    I = zeros(1,length(J));
    
    K = F(I,J);
    plot3(I, J, abs(K));
    xlabel('Real');
    ylabel('Imaginary');
    zlabel('Magnitude');
    grid;
    

    plot3默认情况下不提供网格,这就是grid命令存在的原因。这就是我得到的:

    enter image description here

    正如预期的那样,如果函数纯粹是虚构的,那么应该只有正弦贡献(i*sin(y))。

    如果需要,您可以使用它并添加更多痕迹。

    希望这有帮助!