Визуализируйте красоту рекурсии, запрограммировав генератор фракталов

Множество Мандельброта

Рекурсия - концепция, знакомая большинству программистов и математиков, и важная в обеих областях. На пересечении этих двух дисциплин вы можете визуализировать истинную красоту и сложность рекурсии с помощью множества Мандельброта, своеобразного набора чисел, впервые открытого Адрианом Дуади и Джоном Хаббардом в 1985 году и названного в честь великого математика Бенуа Мандельброта. .

Теория

Набор Мандельброта - прекрасный пример силы рекурсии. Используемая функция чрезвычайно проста - настолько проста, что вы выучили ее в начальной школе. Набор формируется направляющей функцией f(x) = x² + c, где выходные данные f(x) возвращаются в себя.

Например, пусть c = 1, а для инициализации x = 1.

Всего после трех итераций итерация функции сама по себе сформировала своего рода экспоненциальную кривую. Когда дополнительная константа c равна 1, функция ускользает или стремится к бесконечности. Однако это, конечно, не так для всех значений c - возьмем, например, c = -1, c = -1.38 и c = -1.9. Они не стремятся к бесконечности или «бегству».

Это также демонстрация уникальных паттернов, которые могут образовываться при повторении итерационной функции:

  • Когда c = -1, серия дает предсказуемые 2 цикла между -1 и 0.
  • Когда c = -1.38, серия повторяется каждые 8 ​​итераций.
  • Когда c = -1.9, ряд кажется хаотичным и не дает закономерностей, хотя может просто иметь очень большой цикл итераций.

Набор Мандельброта включает в себя все точки, значение которых c не заставляет функцию двигаться по спирали к бесконечности (или отрицательной бесконечности) и выходить из нее. Поскольку невозможно точно измерить, будет ли серия закручиваться по спирали к бесконечности, если четкий цикл не установлен (например, с c = -1.9, нет четкого цикла, но мы предполагаем, что он не исчезнет), генераторы выполняют рекурсию на определенное количество раз - обычно 256 раз - и объявляют точку, действительную для входа в набор Мандельброта, если она не превышает предопределенную константу для измерения функций экранирования (например, не превышает 4 или -4).

В настоящее время мы имеем дело с реальными значениями x, что означает, что они одномерные. Чтобы визуализировать прекрасный фрактал, созданный множеством, x должен быть сложным, состоять из реального и воображаемого элементов, но логика остается той же. Однако в комплексной плоскости труднее найти стабильные значения c, учитывая большую степень свободы и, следовательно, направления выхода.

На трех диаграммах ниже каждая точка начиналась с комплексной точки 0i+0 или (0, 0) (начало координат) в системе координат. Каждая соединительная линия представляет собой движение точки после итерации рекурсивной функции.

Два значения c, c = i-0.05 и c = -i + 0.001 ускользают, потому что они внезапно стремятся к бесконечности после, казалось бы, случайных движений. Однако, когда c = i, движение стабилизируется в двойном цикле между сложными точками (-i+0) и (i-1). В контексте комплексных чисел набор Мандельброта формально определяется как

… состоящий из всех комплексных c-значений, для которых точка, начинающаяся в начале координат и перемещающаяся под рекурсивной функцией x² + c, не уходит в бесконечность.

Реализация

Во-первых, мы должны импортировать matplotlib.pyplot библиотеку для визуализации и numpy для работы с операциями линейной алгебры.

Давайте создадим функцию mandelbrot_set(), которая генерирует значения пикселей для визуализации набора. Они будут храниться в массиве NumPy.

Ширина и высота визуализации определяют размеры массива, в котором будет храниться визуализация. pixels - пустой массив, высота и ширина которого указаны в параметре функции.

Затем функция заполнит значение для каждой из ячеек в массиве pixels. Положение ячейки в pixels будет представлено двумя координатами x и y. Значение c, комплексной константы, которая будет добавляться к квадрату при каждой итерации рекурсивной функции, представляет собой математическое произведение текущей строки, столбца и высоты, просто оптимизированное для визуализации. Очень важно понимать, что значение c (которое определяет, будет ли оно принадлежать набору Мандельброта) является функцией строки и столбца массива пикселей.

Затем для каждой итерации (по умолчанию 256 раз) рекурсивная функция возводит себя в квадрат и добавляет комплексную константу c. Если оно больше 4 (или меньше -4), математически функция должна быть экранирована, и дальнейшие вычисления будут пустой тратой вычислительного пространства.

Цвет пикселя зависит от того, сколько итераций он прошел перед выходом. Если значение i равно 255 (цикл повторяется 256 раз), значение c является частью набора Мандельброта. В противном случае он может быть «ближе», чем другие, поэтому константа c, которая выполнила 200 итераций перед выходом, все равно будет отображаться, просто на оттенок светлее, чем истинные члены набора Мандельброта. Цвет каждого пикселя показывает, насколько он «близок» к принадлежности к Набору Мандельброта.

Чтобы определить окончательное значение цвета, количество итераций, которые текущее значение c сделало, подвергается побитовым операциям, техническим требованиям для математики и визуализации. Соответствующие строка и столбец пикселей массива будут обновлены значением цвета.

Наконец, функция вернет массив пикселей, теперь заполненный отображаемыми цветами.

Функция отображения массива проста. Оси отключаются и задается соотношение размеров фигуры. .imshow() автоматически считывает цвет из массива и отображает его, в то время как аргумент cmap позволяет пользователям передавать одну из многих «тем», которые определяют, какие значения соответствуют каким цветам.

Наконец, когда вызывается функция отображения, будет отображен красивый фрактал Мандельброта.

Варьируя аргумент cmap с другими палитрами, такими как ocean и viridis, получаются впечатляющие дизайны:

Результат математики и рекурсивных вычислений может создать красоту, которую люди никогда раньше не осмеливались даже представить.

Спасибо за прочтение!

Если вам понравилось, возможно, вам понравятся некоторые из моих других работ о пересечении математики и вычислений.





Все графики и изображения созданы Андре Е.

Подписывайтесь на нас в Twitter 🐦 и Facebook 👥 и Instagram 📷 и присоединяйтесь к нашим Facebook и Linkedin Группы 💬 .

Чтобы присоединиться к нашему чату команды Slack в сообществе 🗣️ прочтите наши еженедельные темы о Фавнах 🗞️, и присоединитесь к сообществу 📣 нажмите здесь⬇

Если этот пост был полезен, пожалуйста, несколько раз нажмите кнопку хлопка 👏 ниже, чтобы выразить поддержку автору! ⬇