Introducción
Esta práctica te guiará a través de la generación de una representación iluminada y normalizada en potencia del conjunto de Mandelbrot utilizando la librería Matplotlib de Python.
Consejos sobre la VM
Una vez finalizada la inicialización de la VM, haz clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.
En ocasiones, es posible que tengas que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.
Si tienes problemas durante el aprendizaje, no dudes en preguntar a Labby. Proporciona retroalimentación después de la sesión y resolveremos rápidamente el problema para ti.
Importar las bibliotecas necesarias
En primer lugar, necesitamos importar las bibliotecas que utilizaremos: NumPy, Matplotlib y Colors.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors
Definir la función del conjunto de Mandelbrot
A continuación, definiremos una función que genera el conjunto de Mandelbrot. La función toma varios parámetros:
xmin,xmax,ymin,ymax: los valores mínimo y máximo para los ejes x e yxneyn: el número de puntos a generar a lo largo de cada ejemaxiter: el número máximo de iteraciones a realizar para cada puntohorizon: el valor máximo en el que se considera que un punto es parte del conjunto
def mandelbrot_set(xmin, xmax, ymin, ymax, xn, yn, maxiter, horizon=2.0):
X = np.linspace(xmin, xmax, xn).astype(np.float32)
Y = np.linspace(ymin, ymax, yn).astype(np.float32)
C = X + Y[:, None] * 1j
N = np.zeros_like(C, dtype=int)
Z = np.zeros_like(C)
for n in range(maxiter):
I = abs(Z) < horizon
N[I] = n
Z[I] = Z[I]**2 + C[I]
N[N == maxiter-1] = 0
return Z, N
Generar el conjunto de Mandelbrot
Ahora generaremos el conjunto de Mandelbrot llamando a la función mandelbrot_set con los parámetros deseados. Esto nos dará dos matrices:
Z: los valores finales de los números complejos sobre los que iteramosN: el número de iteraciones realizadas para cada punto antes de determinar que era parte del conjunto
xmin, xmax, xn = -2.25, +0.75, 3000 // 2
ymin, ymax, yn = -1.25, +1.25, 2500 // 2
maxiter = 200
horizon = 2.0 ** 40
log_horizon = np.log2(np.log(horizon))
Z, N = mandelbrot_set(xmin, xmax, ymin, ymax, xn, yn, maxiter, horizon)
Normalizar los datos
Para crear una representación iluminada y normalizada en potencia del conjunto de Mandelbrot, necesitamos normalizar nuestros datos. Lo haremos utilizando la siguiente fórmula:
M = N + 1 - np.log2(np.log(abs(Z))) + log_horizon
with np.errstate(invalid='ignore'):
M = np.nan_to_num(N + 1 - np.log2(np.log(abs(Z))) + log_horizon)
Crear la gráfica
Ahora que tenemos nuestros datos normalizados, podemos crear la gráfica. Utilizaremos la función imshow para mostrar los datos como una imagen, y también agregaremos algo de texto a la gráfica para indicar de qué se trata.
dpi = 72
width = 10
height = 10*yn/xn
fig = plt.figure(figsize=(width, height), dpi=dpi)
ax = fig.add_axes([0, 0, 1, 1], frameon=False, aspect=1)
light = colors.LightSource(azdeg=315, altdeg=10)
M = light.shade(M, cmap=plt.cm.hot, vert_exag=1.5,
norm=colors.PowerNorm(0.3), blend_mode='hsv')
ax.imshow(M, extent=[xmin, xmax, ymin, ymax], interpolation="bicubic")
ax.set_xticks([])
ax.set_yticks([])
year = time.strftime("%Y")
text = ("El conjunto fractal de Mandelbrot\n"
"Renderizado con matplotlib %s, %s - https://matplotlib.org"
% (matplotlib.__version__, year))
ax.text(xmin+.025, ymin+.025, text, color="white", fontsize=12, alpha=0.5)
plt.show()
Resumen
En este laboratorio, aprendimos cómo generar una representación iluminada y normalizada en potencia del conjunto de Mandelbrot utilizando la biblioteca Matplotlib de Python. Lo logramos definiendo una función para generar el conjunto, normalizando los datos y creando una gráfica utilizando los datos normalizados. Esta técnica se puede aplicar a otros conjuntos de datos para crear imágenes visualmente atractivas e informativas.