Hoy estaba fluyendo Variables complejas y funciones analíticas por los estimados Fornberg y Piret, haciendo todo lo posible para comprender cómo se comportan las funciones de valores complejos. La visualización mental de tales funciones es muy difícil ya que toman una entrada real y otra imaginaria, y también generan dos componentes. Por lo tanto, un único gráfico tridimensional no es suficiente para ver cómo se comporta la función. Más bien, tenemos que dividir dicha visualización en parcelas separadas de las partes imaginaria y real, o alternativamente por magnitud y argumento, o ángulo.
Quería poder jugar con cualquier función que se me ocurriera, arrastrar y hacer zoom alrededor de sus gráficos, y explorarla en detalle visual para entender cómo resultaba de la ecuación. Para tal tarea, Wolfram Mathematica es una excelente herramienta inicial.
plotComplexFunction[f_]:=Module[{z,rePlot,imPlot,magPlot,phasePlot},z=x+I y;rePlot = Plot3D[Re[f[z]],{x,-2,2},{y,-2,2},AxesLabel->{"Re(z)","Im(z)","Re(f(z))"},Mesh->None];
imPlot = Plot3D[Im[f[z]],{x,-2,2},{y,-2,2},
AxesLabel->{"Re(z)","Im(z)","Im(f(z))"},
Mesh->None];
magPlot = Plot3D[Abs[f[z]], {x, -2, 2}, {y, -2, 2},
AxesLabel -> {"Re(z)", "Im(z)", "Abs(f(z))"},
Mesh -> None,
ColorFunction -> Function[{x, y, z}, ColorData["Rainbow"][Rescale[Arg[x + I y], {-Pi, Pi}]]],
ColorFunctionScaling -> False];
phasePlot=DensityPlot[Arg[f[z]],{x,-2,2},{y,-2,2},
ColorFunction->"Rainbow",
PlotLegends->Automatic,
AxesLabel->{"Re(z)","Im(z)"},
PlotLabel->"Phase"];
GraphicsGrid[{{rePlot,imPlot},{magPlot,phasePlot}},ImageSize->800]];
f[z_]:=(1/2)*(z+1/z);
plotComplexFunction[f]
https://github.com/dreamchef/complex-functions-visualization
https://github.com/dreamchef/complex-functions-visualization
Escribí el código de Mathematica anterior para producir una cuadrícula de gráficos que muestran la función en las dos formas que se acaban de describir. Arriba, las partes imaginaria y real de la función.
Se muestran, y en la parte inferior, y la magnitud, y la fase se muestran en color:
Después de jugar con algunas funciones usando este código y convencerme de que tenían sentido, estaba interesado en obtener la misma funcionalidad en Python para conectarla con mis otros proyectos de programación matemática.
Encontré un proyecto excelente en GitHub (https://github.com/artmenlope/complex-plotting-tools) que decidí utilizar como punto de partida y potencialmente contribuir en el futuro. El repositorio proporcionó una interfaz muy sencilla para trazar funciones de valores complejos de diversas formas. Gracias https://github.com/artmenlope! Por ejemplo, después de importar numpy, matplotliby el repositorio cplotting_tools módulo que define la función y llama cplt.complex_plot3D(x,y,f,log_mode=False) produce lo siguiente:
Todos estos son para el mismo f(z) que el anterior. Para ver las partes real e imaginaria de la función, una al lado de la otra, utilice cplot.plot_re_im(x,y,f,camp="twilight",contour=False,alpha=0.9:
Además, la biblioteca ofrece otras formas interesantes de estudiar funciones, incluido un diagrama de flujo:
¡La biblioteca es muy prometedora y es relativamente fácil de usar! Requiere un pts Variable a definir que codifica los polos y ceros de la función dada. Wolfram no requiere esto porque calcula las ubicaciones de estos puntos debajo del capó. Se ahorraría mucho esfuerzo al usuario si las herramientas de trazado complejas también tuvieran esta funcionalidad. Planeo implementar esto en el módulo en un futuro próximo.
Mientras tanto, diviértete trazando con Wolfram y Python, y comparte tus pensamientos y preguntas en los comentarios a continuación, conéctate conmigo en LinkedIn o colabora conmigo en GitHub!
A menos que se indique lo contrario, todas las imágenes fueron creadas por el autor.