Участник:Nbvehbectw/Алгоритм нахождения точек множества Мандельброта

Материал из Алговики
Версия от 16:38, 22 октября 2017; Nbvehbectw (обсуждение | вклад) (Новая страница: «Жалеев Тимур, группа 404. == Свойства и структура алгоритмов == File:Mandelset hires.png|400px|thumb|right|Множ…»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

Жалеев Тимур, группа 404.

Свойства и структура алгоритмов

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

Общее описание алгоритма

Множество Мандельброта - множество точек [math]\displaystyle{ c }[/math] комплексной плоскости таких, что последовательность [math]\displaystyle{ z_{n+1} = z_n^2 + c, z_0 = 0 }[/math] ограничена[1]. Для изображения области множества выбирается некоторое количество итераций (обычно зависящее от размеров изображаемой области) и так называемый "радиус выхода", и для соответствующих [math]\displaystyle{ c }[/math] из области вычисляются элементы данной последовательности. Если на всех итерациях модуль элемента остается не больше радиуса выхода, то считается, что последовательность ограничена, и данная точка принадлежит множеству. В противном случае последовательность считается уходящей в бесконечность, а точка - не принадлежащей множеству. Можно доказать, что если для какого-либо элемента последовательности выполняется [math]\displaystyle{ \left| z_n \right| \gt 2 }[/math], то последовательность не ограничена[1], то есть в качестве радиуса выхода можно взять число 2.

Математическое описание алгоритма

Для изображения прямоугольной области множества Мандельброта можно выбрать следующие параметры: координаты центра изображения [math]\displaystyle{ (\overline{x}, \overline{y}) }[/math], ширина [math]\displaystyle{ W }[/math] и высота [math]\displaystyle{ H }[/math] изображения и расстояние между соседними пикселями [math]\displaystyle{ p }[/math]. Тогда для каждого пикселя с координатами [math]\displaystyle{ i }[/math] по горизонтали и [math]\displaystyle{ j }[/math] по вертикали вычисляется число [math]\displaystyle{ c }[/math] по следующим правилам:

[math]\displaystyle{ \operatorname{Re} \, c = \overline{x} + \left(i - \frac{W}{2}\right)p }[/math]

[math]\displaystyle{ \operatorname{Im} \, c = \overline{y} - \left(j - \frac{H}{2}\right)p }[/math]

Для полученных [math]\displaystyle{ c }[/math] определяется их принадлежность множеству по указанному выше алгоритму с количеством итераций [math]\displaystyle{ O \left( \frac{1}{\sqrt p} \right) }[/math][2] и радиусом выхода 2. В зависимости от того, определяется точка принадлежащей или не принадлежащей множеству, соответствующий ей пиксель окрашивается одним или другим цветом.

Также существуют различные способы построить изображение более наглядно с использованием цвета. Самый простой - окрашивать точки множества черным цветом, а остальные точки окрашивать различными цветами в зависимости от того, сколько потребовалось итераций [math]\displaystyle{ n }[/math], чтобы элемент последовательности [math]\displaystyle{ z_{n+1} = z_n^2 + c, z_0 = 0 }[/math] превысил радиус выхода. Однако этот метод тоже дает изображение с резкими границами: число итераций - это всегда целое число, и образуются области, окрашенные одним цветом. Более гладкий способ окрашивания точек вне множества использует следующую формулу:

[math]\displaystyle{ \mu = n + 1 - \frac{\ln(\ln \left| z_n \right|)}{\ln 2} }[/math],

где [math]\displaystyle{ n }[/math] - число итераций, потребовавшееся для для превышения элементом последовательности радиуса выхода, а [math]\displaystyle{ z_n }[/math] - этот элемент[3]. Для понимания сути этой формулы можно использовать описание, приведенное Earl L. Hinrichs:

«Игнорируя [math]\displaystyle{ + c }[/math] в обычной формуле, получим, что точки последовательности растут как [math]\displaystyle{ z := z^2 }[/math]. То есть у нас есть последовательность [math]\displaystyle{ z, z^2, z^4, z^8, z^{16} }[/math], и т.д. Подсчет числа итераций означает присвоение целого числа этим значениям. Если игнорировать множитель, логарифм этой последовательности получится: [math]\displaystyle{ 1, 2, 4, 8, 16 }[/math]». Логарифм логарифма: [math]\displaystyle{ 0, 1, 2, 3, 4 }[/math], что соответствует целому значению из подсчета итераций. Таким образом, подходящим обобщением дискретного подсчета итераций на непрерывную функцию будет двойной логарифм»[3].

При использовании этой формулы число [math]\displaystyle{ \mu }[/math] получается примерно равным [math]\displaystyle{ n }[/math], однако меняющимся практически непрерывно по [math]\displaystyle{ c }[/math].

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

Вычислительное ядро алгоритма

Макроструктура алгоритма

Схема реализации последовательного алгоритма

Последовательная сложность алгоритма

Информационный граф

Ресурс параллелизма алгоритма

Входные и выходные данные алгоритма

Свойства алгоритма

Программная реализация алгоритма

Особенности реализации последовательного алгоритма

Локальность данных и вычислений

Возможные способы и особенности параллельной реализации алгоритма

Масштабируемость алгоритма и его реализации

Динамические характеристики и эффективность реализации алгоритма

Выводы для классов архитектур

Существующие реализации алгоритма

Литература

Шаблон:Примечания