绘制复杂函数的分支
Plotting the branches of a complex function
我正在尝试绘制一种函数的黎曼曲面(我不确定它是否是正确的名称),如下所示:
这是我尝试过的:
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)';
这给了我以下信息:
我的问题是:
我以为我会绘制第一张图片上的内容,但我得到了其他东西。如果不是黎曼曲面我画的是什么?
如何更改我的代码以获得顶部图?
是否可以在第一个图表上使用弧度刻度?
您的第一个图显示了多值 "function" 的多个分支。它不是通常意义上的真正函数,因为对于给定的 z
你有不止一个函数值。您只能通过绕原点不止一次来重现这一点,即在您的 angular 变量中超过 2*pi
。您绘制的是该函数的主要分支,即对应于从 -pi
到 pi
.
的复杂阶段的 sheet
此外,还有一个更根本的问题。一旦您切换到表示为双精度的复数,您将丢失有关原点周围附加相位的任何信息(表示为实部 + 虚部的复数只会导致其复数相位的主值,该值介于 -pi
之间和 pi
)。所以你需要根据复数的三角形式计算平方根"manually":
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)';
如您所见,该函数运行正常。请注意,图中 "the scale in radians" 没有意义。您绘制的所有内容都具有 "linear" 维度:实部和虚部。弧度仅对 角度 有意义,即 theta
类数量。
此外,您可能会注意到上图有圆边,因为我们使用的是极坐标绘图。可以创建一个 rectangular 图,但需要做更多的工作。这是一个部分解决方案。这个想法是将同一个网格缝合两次以绘制函数的两个分支:
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)';
结果如下:
如您所见,复杂的部分看起来很奇怪。这是因为复数的相位沿负实半轴跳跃。这个 可以 补救,但需要更多的工作,这留给 reader 作为练习。我向数据中注入一列 nan
s 的原因是为了防止在第一个图中出现类似的跳跃伪像。另一种选择是分别绘制函数的两个分支,中间有 hold on
,但是必须做额外的工作来标准化图形上的颜色图。
最后,请考虑不使用 jet
,而是使用默认的 parula
颜色图。 Jet 对色觉受损的人来说非常糟糕,parula
接近于感知均匀。对于问题的简短介绍,我建议观看 scipy 人的 this great talk。
我正在尝试绘制一种函数的黎曼曲面(我不确定它是否是正确的名称),如下所示:
这是我尝试过的:
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)';
这给了我以下信息:
我的问题是:
我以为我会绘制第一张图片上的内容,但我得到了其他东西。如果不是黎曼曲面我画的是什么?
如何更改我的代码以获得顶部图?
是否可以在第一个图表上使用弧度刻度?
您的第一个图显示了多值 "function" 的多个分支。它不是通常意义上的真正函数,因为对于给定的 z
你有不止一个函数值。您只能通过绕原点不止一次来重现这一点,即在您的 angular 变量中超过 2*pi
。您绘制的是该函数的主要分支,即对应于从 -pi
到 pi
.
此外,还有一个更根本的问题。一旦您切换到表示为双精度的复数,您将丢失有关原点周围附加相位的任何信息(表示为实部 + 虚部的复数只会导致其复数相位的主值,该值介于 -pi
之间和 pi
)。所以你需要根据复数的三角形式计算平方根"manually":
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)';
如您所见,该函数运行正常。请注意,图中 "the scale in radians" 没有意义。您绘制的所有内容都具有 "linear" 维度:实部和虚部。弧度仅对 角度 有意义,即 theta
类数量。
此外,您可能会注意到上图有圆边,因为我们使用的是极坐标绘图。可以创建一个 rectangular 图,但需要做更多的工作。这是一个部分解决方案。这个想法是将同一个网格缝合两次以绘制函数的两个分支:
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)';
结果如下:
如您所见,复杂的部分看起来很奇怪。这是因为复数的相位沿负实半轴跳跃。这个 可以 补救,但需要更多的工作,这留给 reader 作为练习。我向数据中注入一列 nan
s 的原因是为了防止在第一个图中出现类似的跳跃伪像。另一种选择是分别绘制函数的两个分支,中间有 hold on
,但是必须做额外的工作来标准化图形上的颜色图。
最后,请考虑不使用 jet
,而是使用默认的 parula
颜色图。 Jet 对色觉受损的人来说非常糟糕,parula
接近于感知均匀。对于问题的简短介绍,我建议观看 scipy 人的 this great talk。