【问题标题】:Plotting the branches of a complex function绘制复杂函数的分支
【发布时间】:2019-04-13 12:56:24
【问题描述】:

我正在尝试绘制一种函数的黎曼曲面(我不确定它是否是正确的名称),如下所示:

这是我尝试过的:

r = (0:1:15)';                           % create a matrix of complex inputs
theta = pi*(-1:0.05:1);
z = r*exp(1i*theta);
w = z.^(1/2)  ;                          % calculate the complex outputs

figure('Name','Graphique complexe','units','normalized','outerposition',[ 0.08 0.1 0.8 0.55]);
subplot(121)

surf(real(z),imag(z),real(w),imag(w))    % visualize the complex function using surf
xlabel('Real(z)')
ylabel('Imag(z)')
zlabel('Real(u)')
cb = colorbar;
colormap jet;                            % gradient from blue to red
cb.Label.String = 'Imag(v)';

subplot(122)
surf(real(z),imag(z),imag(w),real(w))    % visualize the complex function using surf
xlabel('Real(z)')
ylabel('Imag(z)')
zlabel('Imag(v)')
cb = colorbar;
colormap jet;                            % gradient from blue to red
cb.Label.String = 'Real(u)';

这给了我以下信息:

我的问题是:

  1. 我以为我会绘制第一张图像上的内容,但我得到了其他东西。如果不是黎曼曲面,我会绘制什么?

  2. 如何更改代码以获得顶部图?

  3. 是否可以在第一张图上使用弧度刻度?

【问题讨论】:

    标签: matlab plot visualization complex-numbers surface


    【解决方案1】:

    您的第一个图显示了多值“函数”的多个分支。它实际上并不是通常意义上的函数,因为对于给定的z,您有多个函数值。您只能通过绕原点多次转来重现这一点,即在您的角度变量中超过2*pi。您绘制的是该函数的主要分支,即对应于从-pipi 的复杂阶段的工作表。

    此外,还有一个更根本的问题。一旦切换到表示为双精度数的复数,您将丢失有关原点周围附加相位的任何信息(表示为实部 + 虚部的复数只会导致其复数相位的主值,介于 -pi 和 @ 987654332@)。因此,您需要从复数的三角形式“手动”计算平方根:

    r = (0:1:15)';                           % create a matrix of complex inputs
    theta = pi*(-2:0.05:2);
    z = r*exp(1i*theta);
    %w = z.^(1/2)  ;                          % calculate the complex outputs
    w = sqrt(r)*exp(1i*theta/2);
    
    figure('Name','Graphique complexe','units','normalized','outerposition',[ 0.08 0.1 0.8 0.55]);
    subplot(121)
    
    surf(real(z),imag(z),real(w),imag(w))    % visualize the complex function using surf
    xlabel('Real(z)')
    ylabel('Imag(z)')
    zlabel('Real(u)')
    cb = colorbar;
    colormap jet;                            % gradient from blue to red
    cb.Label.String = 'Imag(v)';
    
    subplot(122)
    surf(real(z),imag(z),imag(w),real(w))    % visualize the complex function using surf
    xlabel('Real(z)')
    ylabel('Imag(z)')
    zlabel('Imag(v)')
    cb = colorbar;
    colormap jet;                            % gradient from blue to red
    cb.Label.String = 'Real(u)';
    

    如您所见,该函数按应有的方式运行。请注意,在图中使用“弧度刻度”是没有意义的。您绘制的所有内容都有“线性”尺寸:实部和虚部。弧度只对角度有意义,即theta-like 数量。

    此外,您可能会注意到上图的边缘是圆形的,因为我们使用极坐标进行绘图。可以创建一个矩形图,但需要做更多的工作。这是部分解决方案。这个想法是将相同的网格缝合在一起两次,以绘制函数的两个分支:

    r0 = 15;
    re = linspace(-r0, r0, 31).';                           % create a matrix of complex inputs
    im = linspace(-r0, r0, 31);
    z = re + 1j*im;
    theta = angle(z);  % atan2(imag(z), real(z));
    r = abs(z);
    
    % concatenate the same mesh twice (plotting trick) back to back, insert nan in between
    w1 = sqrt(r).*exp(1i*theta/2); % first branch
    w2 = sqrt(r).*exp(1i*(theta+2*pi)/2); % second branch
    
    z = [z, nan(size(w1,1),1), z(:,end:-1:1)];
    w = [w1, nan(size(w1,1),1), w2(:,end:-1:1)];
    
    figure('Name','Graphique complexe','units','normalized','outerposition',[ 0.08 0.1 0.8 0.55]);
    subplot(121)
    surf(real(z),imag(z),real(w),imag(w))    % visualize the complex function using surf
    xlabel('Real(z)')
    ylabel('Imag(z)')
    zlabel('Real(u)')
    cb = colorbar;
    colormap jet;                            % gradient from blue to red
    cb.Label.String = 'Imag(v)';
    
    subplot(122)
    surf(real(z),imag(z),imag(w),real(w))    % visualize the complex function using surf
    xlabel('Real(z)')
    ylabel('Imag(z)')
    zlabel('Imag(v)')
    cb = colorbar;
    colormap jet;                            % gradient from blue to red
    cb.Label.String = 'Real(u)';
    

    结果如下:

    正如您所见,复杂的部分看起来很奇怪。这是因为复数的相位沿负实半轴跳跃。这可以补救,但需要更多的工作,这留给读者作为练习。我在数据中注入一列nans 的原因是为了防止在第一个图中出现类似的跳转伪影。另一种选择是分别绘制函数的两个分支,hold on 介于两者之间,但随后必须做额外的工作来标准化图形上的颜色图。

    最后,请考虑不要使用jet,而是使用默认的parula 颜色图。 Jet 对于色觉受损的人来说非常糟糕,parula 接近于感知均匀。对于这个问题的简短介绍,我建议观看 scipy 家伙的 this great talk

    【讨论】:

    • 好话。谢谢你的帮助!
    • 作者还发布了这段代码的Python版本here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多