22

如何制作 Mathematica 图形来复制复杂绘图在 sage 中的行为?IE

... 采用一个变量的复杂函数,并在指定的 xrange 和 yrange 上绘制函数的输出,如下所示。输出的大小由亮度表示(零为黑色,无穷大为白色),而参数由色调表示(红色为正实数,随着参数的增加通过橙色、黄色……增加) .

这是 zeta 函数的示例(从 M. Hampton of Neutral Drifts窃取),具有绝对值的叠加轮廓:

zeta 函数 complex_plot

在 Mathematica 文档页面Functions Of Complex VariablesContourPlot中,它说您可以使用DensityPlot“可能按阶段着色”来可视化复杂函数。但是问题出在这两种类型的图中,ColorFunction只需要一个等于该点的轮廓或密度的变量 - 所以在绘制绝对值时似乎不可能让它为相位/参数着色。请注意,这不是Plot3D所有 3 个参数(x,y,z)都传递给的问题ColorFunction

我知道还有其他方法可以可视化复杂的函数 - 例如Plot3D 文档中的“简洁示例” ,但这不是我想要的。

另外,我在下面确实有一个解决方案ContourPlot(实际上已用于生成维基百科中使用的一些图形),但它定义了一个相当低级的函数,我认为它应该可以使用像or这样的高级函数DensityPlot。并不是说这应该阻止您提供您最喜欢的使用较低级别结构的方法!


编辑: Michael Trott 在 Mathematica 杂志上有一些不错的文章:
可视化代数函数的黎曼曲面,IIaIIbIIcIId
可视化黎曼曲面演示
黎曼曲面的回归(Mma v6 的更新)

当然,Michael Trott 编写了Mathematica 指南,其中包含许多精美的图形,但似乎落后于加速的 Mathematica 发布时间表!

4

4 回答 4

20

这是我的尝试。我稍微改进了颜色功能。

ParametricPlot[
 (*just need a vis function that will allow x and y to be in the color function*)
 {x, y}, {x, -6, 3}, {y, -3, 3},

 (*color and mesh functions don't trigger refinement, so just use a big grid*)
 PlotPoints -> 50, MaxRecursion -> 0, Mesh -> 50,

 (*turn off scaling so we can do computations with the actual complex values*)
 ColorFunctionScaling -> False,

 ColorFunction -> (Hue[
     (*hue according to argument, with shift so arg(z)==0 is red*)
     Rescale[Arg[Zeta[# + I #2]], {-Pi, Pi}, {0, 1} + 0.5], 1,

     (*fudge brightness a bit: 
       0.1 keeps things from getting too dark, 
       2 forces some actual bright areas*)
     Rescale[Log[Abs[Zeta[# + I #2]]], {-Infinity, Infinity}, {0.1, 2}]] &),

 (*mesh lines according to magnitude, scaled to avoid the pole at z=1*)
 MeshFunctions -> {Log[Abs[Zeta[#1 + I #2]]] &},

 (*turn off axes, because I don't like them with frames*)
 Axes -> False
 ]

复杂情节

我还没有想到让网格线颜色变化的好方法。ContourPlot最简单的可能是使用而不是生成它们MeshFunctions

于 2011-03-22T02:45:56.427 回答
15

这是我对受Jan Homann启发的Axel Boldt给出的函数的变体。两个链接到的页面都有一些漂亮的图形。

ComplexGraph[f_, {xmin_, xmax_}, {ymin_, ymax_}, opts:OptionsPattern[]] := 
 RegionPlot[True, {x, xmin, xmax}, {y, ymin, ymax}, opts, 
  PlotPoints -> 100, ColorFunctionScaling -> False,
  ColorFunction -> Function[{x, y}, With[{ff = f[x + I y]}, 
    Hue[(2. Pi)^-1 Mod[Arg[ff], 2 Pi], 1, 1 - (1.2 + 10 Log[Abs[ff] + 1])^-1]]]
 ]

然后我们可以通过运行制作没有等高线的图

ComplexGraph[Zeta, {-7, 3}, {-3, 3}]

没有轮廓的 Zeta

我们可以通过使用复制Brett并在 ComplexGraph 中显示特定的绘图网格来添加轮廓:

ComplexGraph[Zeta, {-7, 3}, {-3, 3}, Mesh -> 30, 
 MeshFunctions -> {Log[Abs[Zeta[#1 + I #2]]] &},
 MeshStyle -> {{Thin, Black}, None}, MaxRecursion -> 0]

或通过与等高线图相结合,如

ContourPlot[Abs[Zeta[x + I y]], {x, -7, 3}, {y, -3, 3}, PlotPoints -> 100,
 Contours -> Exp@Range[-7, 1, .25], ContourShading -> None];
Show[{ComplexGraph[Zeta, {-7, 3}, {-3, 3}],%}]

带轮廓

于 2011-03-22T04:28:11.657 回答
8

不是一个正确的答案,有两个原因:

  • 这不是你要求的
  • 我无耻地使用布雷特的代码

无论如何,对我来说,以下内容更容易解释(亮度是......好吧,只是亮度):

在此处输入图像描述

Brett 的代码几乎完好无损:

Plot3D[
 Log[Abs[Zeta[x + I y]]], {x, -6, 3}, {y, -3, 3},
 (*color and mesh functions don't trigger refinement,so just use a big grid*)
 PlotPoints -> 50, MaxRecursion -> 0, 
 Mesh -> 50, 
 (*turn off scaling so we can do computations with the actual complex values*)
 ColorFunctionScaling -> False, 
 ColorFunction -> (Hue[
     (*hue according to argument,with shift so arg(z)==0 is red*)
     Rescale[Arg[Zeta[# + I #2]], {-Pi, Pi}, {0, 1} + 0.5], 
     1,(*fudge brightness a bit:
     0.1 keeps things from getting too dark,
     2 forces some actual bright areas*)
     Rescale[Log[Abs[Zeta[# + I #2]]], {-Infinity, Infinity}, {0.1, 2}]] &),
     (*mesh lines according to magnitude,scaled to avoid the pole at z=1*)
     MeshFunctions -> {Log[Abs[Zeta[#1 + I #2]]] &},
     (*turn off axes,because I don't like them with frames*)
     Axes -> False]
于 2011-03-22T04:21:46.977 回答
1

对于有兴趣在Python中实现这一点的每个人,我创建了cplot。安装

pip install cplot

这绘制了exp 的 6次泰勒多项式的域着色图:

import cplot


def exp_taylor(z):
    s = 1.0
    t = 1.0
    for k in range(1, 7):
        t *= z / k
        s += t
    return s

plt = cplot.plot(
    exp_taylor,
    # or something simpler
    # lambda z: z ** 6 + 1,
    (-5, +5, 400),
    (-5, +5, 400),
)
plt.show()

在此处输入图像描述

于 2021-10-20T08:57:49.937 回答