Tracer une fonction complexe dans Mathematica

Comment puis-je faire un graphisme Mathematica qui copie le comportement de complex_plot dans sage? c'est à dire

... prend une fonction complexe d'une variable, et la production de placettes de la fonction sur le xrange spécifié et yrange comme démontré ci-dessous. Le l'ampleur de la sortie est indiqué par la luminosité (avec zéro étant noir et infini étant blanc) alors que l'argument est représenté par la teinte (avec rouge étant positif réel, et croissant en orange, jaune,... l'argument augmente).

voici un exemple (volé à M. Hampton de Drifts neutres ) de la fonction zeta avec des contours superposés de valeur absolue:

zeta function complex_plot

dans la page de documentation de Mathematica fonctions de Variables complexes il dit que vous pouvez visualisez les fonctions complexes en utilisant ContourPlot et DensityPlot "coloration potentielle par phase". Mais le problème est dans les deux types de tracés, ColorFunction ne prend qu'une seule variable égale au contour ou à la densité au point - il semble donc impossible de lui faire colorer la phase/argument tout en traçant la valeur absolue. Notez que ce n'est pas un problème avec Plot3D où tous les 3 paramètres (x,y,z) passent à ColorFunction .

je sais qu'il y a d'autres façons de visualiser des fonctions complexes - comme "l'exemple soigné" dans le Plot3D docs , mais ce n'est pas ce que je veux.

aussi, j'ai une solution en dessous de (qui a été effectivement utilisé pour générer certains graphiques utilisés dans Wikipedia), mais il définit une fonction de niveau assez bas, et je pense que cela devrait être possible avec une fonction de haut niveau comme ContourPlot ou DensityPlot . Non pas que cela devrait vous arrêter de donner votre approche préférée qui utilise une construction de niveau inférieur!


Edit: il y avait quelques beaux articles de Michael Trott dans le Mathematica journal sur:

Visualisation des surfaces de Riemann de fonctions algébriques , IIa , IIb , IIc , IId .

La visualisation de surfaces de Riemann démo .

Le Retour de surfaces de Riemann (mises à jour pour Mma v6)

bien sûr, Michael Trott a écrit le Mathematica guide books , qui contiennent de nombreux beaux graphiques, mais semblent avoir pris du retard sur le calendrier de publication accélérée Mathematica!

22
demandé sur Community 2011-03-22 02:52:05

3 réponses

voici ma tentative. Je ailé de la fonction de mise en couleur un peu.

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

Je n'ai pas pensé à un bon moyen d'obtenir les lignes de maille pour varier dans la couleur. Le plus simple est probablement de simplement les générer avec ContourPlot au lieu de MeshFunctions .

19
répondu Brett Champion 2011-03-22 02:45:56

voici ma variation sur la fonction donnée par Axel Boldt qui a été inspiré par Jan Homann . Les deux pages liées ont de beaux graphismes.

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]]]
 ]

alors nous pouvons faire le tracé sans les contours en exécutant

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

Zeta without contours

nous pouvons ajouter des contours en copiant Brett en utilisant et en montrant un maillage spécifique de la placette dans le graphe complexe:

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

ou en combinant avec un tracé de contour comme

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
répondu Simon 2017-05-23 12:08:47

réponse inappropriée, pour deux raisons:

  • ce n'est pas ce que vous avez demandé""
  • j'utilise sans vergogne le code de Brett

de toute façon, pour moi, ce qui suit est beaucoup plus clair à interpréter (la luminosité est ... Eh bien, juste la luminosité):

enter image description here

code de Brett presque intact:

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]
7
répondu Dr. belisarius 2011-03-22 04:21:46