web-dev-qa-db-ja.com

Mathematicaで複素関数をプロットする

complex_plot の動作をsageでコピーするMathematicaグラフィックを作成するにはどうすればよいですか?つまり.

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

これは、絶対値の等高線がオーバーレイされたゼータ関数の例(M.ハンプトンから盗まれた ニュートラルドリフト )です。

zeta function complex_plot

数学のドキュメントページ 複素変数の関数ContourPlotおよびDensityPlot「フェーズごとの潜在的な色付け」を使用して複素関数を視覚化できると書かれています。しかし、問題は両方のタイプのプロットにあり、ColorFunctionはその点の等高線または密度に等しい単一の変数のみを取ります-したがって、絶対値をプロットしている間、位相/引数に色を付けることは不可能のようです。これは、3つのパラメータPlot3DがすべてColorFunctionに渡される(x,y,z)では問題にならないことに注意してください。

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

また、私は 以下の1つの解決策 (実際にはウィキペディアで使用されるいくつかのグラフィックを生成するために使用されています)を持っていますが、それはかなり低レベルの関数を定義し、高レベルで可能になるはずだと思いますContourPlotDensityPlotのようなレベル関数。これにより、低レベルの構造を使用するお気に入りのアプローチを提供できなくなるわけではありません。


編集:MathematicaジャーナルにMichaelTrottによる素敵な記事がいくつかありました:
リーマン面の視覚化 代数関数のIIaIIbIIcIId
リーマン面の視覚化 デモ
リーマン面の戻り(Mma v6の更新)

もちろん、Michael Trottは Mathematicaガイドブック を書きました。これには多くの美しいグラフィックが含まれていますが、加速されたMathematicaのリリーススケジュールに遅れをとっているようです!

22
Simon

これが私の試みです。カラー機能を少し羽ばたきました。

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
 ]

complex plot

メッシュラインの色を変える良い方法を考えていませんでした。最も簡単なのは、おそらくContourPlotの代わりにMeshFunctionsを使用してそれらを生成することです。

20
Brett Champion

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 without contours

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}],%}]

with contours

15
Simon

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

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

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

enter image description here

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

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]
8
Dr. belisarius