Octave(Matlab)中复杂函数的域着色(色轮)图。

3
我理解域或色轮绘图在复杂函数中很常见。
令人难以置信的是,在网上搜索一百万多个结果,我仍然无法轻松地复制维基百科中的这个艺术品。

enter image description here

有这个在线资源,它可以用黑色呈现带零的图形——还不错……但是,我想要请求一些简单的Octave注释代码来生成复数函数的彩色图形。
以下是一个示例:

domain plotting of complex functions

我看到这里有一个绘制复合函数的代码(链接)。然而,它使用一种不同的技巧,其中高度代表函数图像的实部,颜色则代表虚部。

Example of Matlab solution to visualize 4D data


你在说二维函数吗? - Cris Luengo
@CrisLuengo 我正在研究复变量的复函数: R^2映射到R^2。 - Antoni Parellada
2个回答

4

Peter Kovesi有一些非常棒的色彩地图。他提供了一个MATLAB函数,名为colorcet, 我们可以在这里使用它来获取我们需要表示相位的循环色彩地图。请在运行下面的代码之前下载此函数。

让我们从创建一个复值测试函数f开始,其中幅度从中心增加,相位等于围绕中心的角度。就像你展示的例子一样:

% A test function
[xx,yy] = meshgrid(-128:128,-128:128);
z = xx + yy*1i;
f = z;

接下来,我们将获取其相位,将其转换为colorcet C2颜色映射的索引(循环的),最后将其重新塑造回原始函数的形状。 这里的out具有3个维度,前两个是原始维度,最后一个是RGB。imshow将这样的3D矩阵显示为彩色图像。
% Create a color image according to phase
cm = colorcet('C2');
phase = floor((angle(f) + pi) * ((size(cm,1)-1e-6) / (2*pi))) + 1;
out = cm(phase,:);
out = reshape(out,[size(f),3]);

最后一步是使用f的大小来调节这些颜色的强度。为了使不连续点处于2的幂次方,我们取以2为底的对数,应用模运算,再次计算2的幂次方。与out简单相乘可以降低必要时的颜色强度:
% Compute the intensity, with discontinuities for |f|=2^n
magnitude = 0.5 * 2.^mod(log2(abs(f)),1);
out = out .* magnitude;

最后一个乘法在Octave和较新版本的MATLAB中有效。对于旧版本的MATLAB,您需要使用bsxfun代替:

out = bsxfun(@times,out,magnitude);

最后,使用imshow显示:
% Display
imshow(out)

output of code above

请注意,这里的颜色比您的示例更柔和。 colorcet 颜色映射是感知均匀的。这意味着相同角度的变化会导致相同的感知颜色变化。在您发布的示例中,例如黄色是一个非常狭窄、明亮的带子。这样的带子会导致对函数中某些特征的虚假突出,这些特征可能根本不相关。感知均匀的颜色映射对于正确解释数据非常重要。还要注意,这种特定的颜色映射具有易于命名的颜色(紫色、蓝色、绿色、黄色)在四个基本方向上。纯实值为绿色(正数)或紫色(负数),纯虚值为蓝色(正数)或黄色(负数)。

非常好。谢谢!由于声望不足,我无法点赞。稍后我会回来看看它... - Antoni Parellada
你的回答很棒。我在尝试使用Octave时遇到了问题,具体来说,我得到了error: 'colorcet' undefined near line 5 column 6。我并不经常使用Octave/Matlab,而我之所以特别要求使用Matlab是因为我无法访问Mathematica,并且我认为Matlab对复杂的绘图选项会更加专业。但是,我的导入软件包等方面的技能程度非常有限。我也在等待其他备选答案。我的意图是给您点赞,并最终关闭此帖子。 - Antoni Parellada
@shouldn'tbehere:你需要从我在答案顶部提供的链接下载colorcet。很抱歉没有明确说明。 - Cris Luengo
我实际上是通过访问那个页面来复制你的发现。我看到URL地址以.m结尾,这是一个很大的提示,它是一个matlab文件。但我不知道该怎么办。您是选择页面中的全部内容,复制并粘贴到Octave控制台中,还是右键单击(Windows),并将其保存在Octave文件夹中的某个位置?如果是这样,您是否知道在哪里保存? - Antoni Parellada
我已经明确指出要绘制 f = z。如果您想绘制不同的函数,只需从 z 计算即可:例如,f = (z/30).^3 - 4 看起来非常漂亮。请注意 z/30,这是为了使绘图采样更密集,如果采样太稀疏,它看起来不好。您还可以尝试绘制 f = exp(z/30) - Cris Luengo
显示剩余4条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接