Понятия фрактал и фрактальная геометрия появились в конце 70-х, а с середины 80-х они
прочно вошли в обиход математиков и программистов. Слово фрактал образовано от латинского fractus и в переводе означает состоящий из фрагментов. Оно было предложено Бенуа Мандельбротом в
1975 году для обозначения нерегулярных, но самоподобных
структур, которыми он занимался.
Одним из основных свойств фракталов является самоподобие. В самом простом случае небольшая часть
фрактала содержит информацию о всем фрактале.
Определение фрактала, данное Мандельбротом, звучит
так: "Фракталом называется
структура, состоящая из частей, которые в каком-то смысле подобны целому".
Геометрические
фракталы являются наиболее наглядными. Их получают с помощью некоторой ломаной
(или поверхности в трехмерном случае), называемой генератором. За один шаг алгоритма каждый из отрезков, составляющих
ломаную, заменяется на ломаную-генератор в
соответствующем масштабе. В результате бесконечного повторения этой процедуры,
получается геометрический фрактал.
Рассмотрим
один из таких фрактальных объектов – триадную кривую
Коха. Построение кривой начинается с отрезка единичной длины (0-е поколение).
Далее каждое звено (в нулевом поколении один отрезок) заменяется на образующий элемент, обозначенный на Фиг.1
через n=1. В результате такой замены
получается следующее поколение кривой. В 1-ом поколении – это кривая из четырех
прямолинейных звеньев, каждое длиной по 1/3. Для получения 3-го поколения
проделываются те же действия – каждое звено заменяется на уменьшенный
образующий элемент. Итак, для получения каждого последующего поколения, все
звенья предыдущего поколения необходимо заменить уменьшенным образующим
элементом. Кривая n-го поколения при
любом конечном n
называется предфракталом.
На Фиг.1 представлены пять поколений кривой. При n, стремящимся к бесконечности,
кривая Коха становится фрактальным объектом.
Одним из методов описания и генерации фрактальных
структур являются системы итерированных
функций (Iterated Functions
System – IFS).
IFS
– это совокупность отображений одного многомерного множества на другое.
Предельное множество, порожденное многократным (в пределе – бесконечно большим)
итерационным применением IFS,
называется аттрактором IFS. Наиболее простая IFS состоит из аффинных преобразований плоскости:
Таким образом, одно аффинное преобразование задается
шестью коэффициентами. Как правило, объект описывается несколькими аффинными
преобразованиями.
Фиг. 1. Геометрический
фрактал «Кривая Коха».
В качестве начального множества задается точка на
плоскости (0, 0). Затем к этому множеству итерационно применяется IFS, заданное матрицей
коэффициентов аффинных преобразований (каждая строка матрицы соответствует
одному аффинному преобразованию, а число столбцов матрице равняется 6). Таким
образом, если фрактал задан, например, тремя аффинными преобразованиями, после
первой итерации будет получено множество из трех точек, после второй – из 9,
после n итераций – 3n точек на
плоскости.
Проект geometric_fractal
демонстрирует использование функциональных подстановок для генерации
фрактальных структур методом систем итерированных функций (IFS), задающих
аффинные преобразования на плоскости.
Модель содержит следующие клеточные объекты (Фиг. 2,
3):
·
float::area – основное поле моделирования размером 300x300x3. В первом, верхнем слое выполняется
собственно генерация фрактала (клетки, принадлежащие фракталу, отмечаются
красным цветом, а не принадлежащие – белым). Второй и третий слои являются
вспомогательными, в них записываются x и
y координаты клетки, принадлежащих фракталу. Размеры объекта float::area по x и
y можно
менять произвольным образом, исходя из вычислительных возможностей компьютера,
на котором выполняется моделирование: чем больше эти размеры, тем больше
времени требуется на каждую итерацию, но тем красивее получается фрактал;
·
float::matrix – поле для хранения матрицы коэффициентов аффинных
преобразований (неиспользуемые строки заполняются значением 0);
·
t – шаблон для основной
функциональной подстановки, реализующей однократное применение IFS;
·
void и
init – вспомогательные
объекты для очистки клеточного массива float::area перед началом моделирования.
Моделирование осуществляется следующим образом.
Вначале пользователю предлагается выбрать один из 9 геометрических фракталов. В
соответствие с тем, какой фрактал был выбран, заполняются коэффициенты аффинных
преобразований в клеточном массиве float::matrix. Затем инициализируется стартовая точка float::area(0,0,0), т.е.
окрашивается в красный цвет. Далее выполняется 9 итераций применения IFS. Для каждой красной точки
верхнего слоя массива float::area считываются ее x и
y координаты из второго и третьего слоя соответственно и
вычисляются координаты новых точек фрактала (от одной до пяти – в зависимости
от того, сколько строк массива float::matrix содержат ненулевые значения). Эти новые точки
окрашиваются красным в первом слое, а во втором и третьем слоях запоминаются их
x и y
координаты.
Число итераций 9 подобрано эмпирически – при
увеличении размеров по x и y массива float::area число итераций также
рекомендуется увеличить.
Анализируя полученные изображения, можно заметить на
некоторых из них отдельно стоящие красные точки, которые, очевидно, не
принадлежат моделируемому фракталу. Эти «лишние» точки всегда относятся к самым
первым поколениям и возникают в том случае, если фракталу не принадлежит точка,
заданная в качестве начального множества (в нашем случае точка (0,0)). Поэтому
данное явление наблюдается, например, в модели фрактала «Кривая Коха» (Фиг. 2),
и не наблюдается в модели фрактала «Ковер Серпинского»
(Фиг. 3). Если в модели фрактала «Кривая Коха» в качестве начального множества
выбрать точку, заведомо принадлежащую фракталу, то «лишние» точки перестанут
появляться.
Фиг. 2. Моделирование геометрического
фрактала «Кривая Коха» в WinALT.
Фиг. 3. Моделирование геометрического
фрактала «Ковер Серпинского» в WinALT.
Алгебраические
фракталы – это самая крупная группа фракталов, получаемых с помощью нелинейных
процессов в n-мерных пространствах
(наиболее изучены двухмерные процессы). В качестве примера рассмотрим множество Жюлиа. Алгоритм его построения
основан на простом итеративном выражении:
где Zi и C
– комплексные переменные. Итерации выполняются для каждой стартовой точки Z прямоугольной или
квадратной области – подмножестве комплексной плоскости. Итерационный процесс
продолжается до тех пор, пока Zi не
выйдет за пределы окружности радиуса 2, центр которой лежит в точке (0,0), что
означает, что аттрактор динамической системы находится в бесконечности, или
после достаточно большого числа итераций Zi
сойдется к какой-нибудь точке окружности. В зависимости от количества итераций,
в течение которых Zi оставалась
внутри окружности, можно установить цвет исходной точки: точки, которые в
течение бесконечного числа итераций
не уходят в бесконечность, окрашиваются в черный цвет, а точки, уходящие в
бесконечность за конечное число итераций окрашиваются в цвет фона.
Проект algebraic_fractal демонстрирует
использование функциональных подстановок для генерации фракталов, относящихся к
множеству Жюлиа.
Модель содержит следующие клеточные объекты (Фиг. 4):
·
float::area – основное поле моделирования размером 200x200x3. В первом, верхнем слое выполняется
собственно генерация фрактала (клетки, принадлежащие фракталу, отмечаются
красным цветом, а не принадлежащие – белым). Второй и третий слои являются
вспомогательными, в них записываются полученные в текущей итерации Re(Zi)
и Im(Zi)
соответственно. Размеры объекта float::area по x и y можно
менять произвольным образом, исходя из вычислительных возможностей компьютера,
на котором выполняется моделирование: чем больше эти размеры, тем больше
времени требуется на каждую итерацию, но тем красивее получается фрактал;
·
t – шаблон для основной
функциональной подстановки, реализующей определение принадлежности точки
множеству Жюлиа.
Моделирование осуществляется следующим образом.
Вначале пользователю предлагается выбрать одно из 10 выражений, задающих
фрактал. Далее инициируется массив float::area: все клетки первого слоя окрашиваются в красный
цвет, клеткам второго слоя присваивается значение, соответствующее их x-координате, а
клеткам второго слоя – значение, соответствующее их y-координате (координаты
пересчитываются таким образом, чтобы массив float::area представлял плоскость от
(-1,-1) до (1,1)).
Затем выполняется 30 итераций применения итеративного
выражения, задающего фрактал. Для каждой красной точки верхнего слоя массива float::area считываются ее x- и y-координаты из второго и третьего слоя
соответственно, соответствующие Re(Zi) и Im(Zi), вычисляются значения Re(Zi+1) и
Im(Zi+1),
запоминаются во втором и третьем слое вместо предыдущих значений. Затем
проверяется, не вышла ли новая точка за пределы окружности радиусом 2, и, если
это так, соответствующая клетка в первом слое окрашивается в белый цвет, как не
принадлежащая фракталу.
Число итераций 30 подобрано эмпирически – при
увеличении размеров по x и y массива float::area число итераций также рекомендуется увеличить.
Фиг. 4. Моделирование алгебраического
фрактала «Множество Жюлиа» в WinALT