2011-03-21 14 views
20

¿Cómo puedo hacer un gráfico de Mathematica que copie el comportamiento de complex_plot en sabio? es decirTrazar una función compleja en Mathematica

... tiene una función compleja de uno variable y parcelas salida de la función sobre el xrange especificado y yrange como se demuestra a continuación. La magnitud de la salida se indica por el brillo (siendo cero negro y el infinito ser blanco), mientras que el argumento está representado por el matiz (con rojo real positivo ser, y creciente a través de naranja, amarillo, .. a medida que aumenta el argumento).

He aquí un ejemplo (robado de M. Hampton de Neutral Drifts) de la función zeta de contornos superpuestos de valor absoluto:

zeta function complex_plot

En la página de documentación de Mathematica Functions Of Complex Variables se dice que se puede visualizar funciones complejas usando ContourPlot y DensityPlot "potencialmente coloreado por fase". Pero el problema está en ambos tipos de gráficos, ColorFunction solo toma una sola variable igual al contorno o la densidad en el punto, por lo que parece imposible hacer que coloree la fase/argumento al trazar el valor absoluto. Tenga en cuenta que esto no es un problema con Plot3D donde los 3 parámetros (x,y,z) pasan a ColorFunction.

Sé que hay otras maneras de visualizar funciones complejas, como el "buen ejemplo" en el Plot3D docs, pero eso no es lo que quiero.

Además, tengo one solution below (que en realidad se ha usado para generar algunos gráficos utilizados en Wikipedia), pero define una función de nivel bastante bajo, y creo que debería ser posible con una función de alto nivel como ContourPlot o DensityPlot. ¡No es que esto te impida dar tu enfoque favorito que utiliza una construcción de nivel inferior!


Editar: Había algunos artículos agradables de Michael Trott en la revista Mathematica en:
Visualización de superficies de Riemann of algebraic functions, IIa, IIb, IIc, IId.
Visualización de superficies Riemann demo.
The Return of Riemann surfaces (updates for Mma v6)

Por supuesto, Michael Trott escribió el Mathematica guide books, que contienen muchos gráficos hermosos, pero parece haber quedado atrás el calendario de lanzamientos Mathematica acelerada!

+0

No he leído la pregunta todavía, pero 1 para la parcela preciosa :) –

+0

@belisarius: No es mi terreno, pero gracias! – Simon

+0

¿Estás seguro de que no puedes pasar (x, y, z) a ColorFunction en DensityPlot? He podido hacer algo como DensityPlot [..., ColorFunction-> Function [{x, y, z}, f [x, y, z]]] –

Respuesta

18

Aquí está mi intento. Elevé un poco la función de color.

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

no he pensado en una buena manera de obtener las líneas de malla que varían en color. Lo más probable es que simplemente los genere con ContourPlot en lugar de MeshFunctions.

+1

¡Agradable! Es muy similar a la solución que he visto que usa 'RegionPlot [True, {x, xmin, xmax}, {y, ymin, ymax}, opts ...]' como el objeto 'Graphics' base. – Simon

+0

@BrettChampion ¡Buena trama! ¿Hay alguna manera fácil de incluir algún tipo de argumento donde el color va de -pi a pi? – Dominique

7

No es una respuesta adecuada, por dos razones:

  • Esto no es lo que usted pidió
  • estoy descaradamente utilizando el código de Brett

De todos modos, para mí, el siguiente es mucho más claro para interpretar (el brillo es ... bueno, solo brillo):

enter image description here

código

de Brett casi intacto:

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

No es una respuesta adecuada, pero estoy de acuerdo, sí hace que algunos aspectos sean más claros y ¡es bonito! +1 – Simon

15

Aquí está mi variación de la función dada por Axel Boldt que se inspiró en Jan Homann. Ambos enlaces a las páginas tienen algunos buenos gráficos.

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

entonces podemos hacer la trama sin los contornos mediante la ejecución de

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

Zeta without contours

Podemos añadir contornos ya sea por copia Brett utilizando y mostrando una malla de trama específica en el ComplexGraph:

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

o mediante la combinación con un gráfico de contorno como

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

with contours

+0

+1 buenas imágenes y enlaces –

Cuestiones relacionadas