22

sage でcomplex_plotの動作をコピーする Mathematica グラフィックスを作成するにはどうすればよいですか? すなわち

... 1 つの変数の複素関数を取り、以下に示すように、指定された xrange と yrange で関数の出力をプロットします。出力の大きさは明るさで示され (ゼロは黒、無限大は白)、引数は色相で表されます (赤は正の実数で、引数が大きくなるにつれてオレンジ、黄色、... と増加します)。 .

絶対値の等高線を重ねたゼータ関数の例 ( Neutral Driftsの M. Hampton から盗んだもの) を次に示します。

ゼータ関数 complex_plot

Mathematica のドキュメンテーション ページFunctions Of Complex Variablesでは、複雑な関数を使用して視覚化し、「潜在的にフェーズごとに色付けする」ことができると書かれていContourPlotますDensityPlot。しかし、問題は両方のタイプのプロットにあり、ColorFunctionその点の等高線または密度に等しい単一の変数しかとらないため、絶対値をプロットするときにフェーズ/引数に色を付けることは不可能に思えます。Plot3Dこれは、 3 つのパラメータすべて(x,y,z)が に渡される場所の問題ではないことに注意してくださいColorFunction

Plot3D docsの「きれいな例」など、複雑な関数を視覚化する方法が他にもあることは知っていますが、それは私が望むものではありません。

また、以下に1 つの解決策がありますContourPlot(Wikipedia で使用されているグラフィックスを生成するために実際に使用されています) が、かなり低レベルの関数を定義しており、またはのような高レベルの関数で可能であると思いますDensityPlot。これは、より低いレベルの構造を使用するお気に入りのアプローチを提供することを妨げるものではありません!


編集: Mathematica ジャーナルに Michael Trott による素晴らしい記事がいくつかありました:
Visualizing Riemann surface of algebraic functions , IIa , IIb , IIc , IId .
リーマン面の視覚化デモ.
リーマン曲面の復活 (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}]

輪郭のないゼータ

ComplexGraph で特定のプロット メッシュを使用して表示することでBrettをコピーすることで、等高線を追加できます。

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

次の 2 つの理由から、適切な回答ではありません。

  • これはあなたが求めたものではありません
  • 私は恥知らずにブレットのコードを使用しています

とにかく、私にとっては、次の解釈がはるかに明確です(明るさは...まあ、明るさだけです):

ここに画像の説明を入力

ブレットのコードはほとんど無傷です:

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 に答える