Визуализация множества Мандельброта с использованием Python и Matplotlib

PythonPythonBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии вы научитесь генерировать отображение множества Мандельброта с затенением и нормализацией мощности с использованием библиотеки Matplotlib для Python.

Советы по работе с ВМ

После запуска виртуальной машины кликните в левом верхнем углу, чтобы переключиться на вкладку Ноутбук и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импортируем необходимые библиотеки

Сначала нам нужно импортировать библиотеки, которые будем использовать: NumPy, Matplotlib и Colors.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors

Определяем функцию для множества Мандельброта

Далее мы определим функцию, которая генерирует множество Мандельброта. Функция принимает несколько параметров:

  • xmin, xmax, ymin, ymax: минимальные и максимальные значения по осям x и y
  • xn и yn: количество точек, которое нужно сгенерировать вдоль каждой оси
  • maxiter: максимальное количество итераций, которое нужно выполнить для каждой точки
  • horizon: максимальное значение, при котором точка считается частью множества
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

Генерируем множество Мандельброта

Теперь мы сгенерируем множество Мандельброта, вызвав функцию mandelbrot_set с нашими желаемыми параметрами. Это даст нам два массива:

  • Z: конечные значения комплексных чисел, по которым мы итерировались
  • N: количество итераций, выполненных для каждой точки, прежде чем она была определена как часть множества
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)

Нормализуем данные

Для создания затененного и мощностно-нормализованного отображения множества Мандельброта нам нужно нормализовать наши данные. Мы это сделаем с использованием следующей формулы:

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)

Создаем график

Теперь, когда у нас есть нормализованные данные, мы можем создать график. Мы будем использовать функцию imshow для отображения данных в виде изображения, и мы также добавим некоторый текст на график, чтобы показать, что мы наблюдаем.

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 = ("The Mandelbrot fractal set\n"
        "Rendered with 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()

Резюме

В этом практическом занятии мы научились генерировать затененное и мощностно-нормализованное отображение множества Мандельброта с использованием библиотеки Matplotlib для Python. Мы добились этого, определив функцию для генерации множества, нормализовав данные и создав график с использованием нормализованных данных. Эта техника может быть применена к другим наборам данных для создания визуально привлекательных и информативных изображений.