Реализация в Matlab алгоритмов построения фрактальных объектов

 

Задание


Тема курсового проекта: Реализация в MATLAB алгоритмов построения фрактальных объектов.

Исходные данные: Журнал Exponenta Pro. Математика в приложениях. №3, 2003 г.

Основные вопросы, подлежащие исследованию:

.Применение рекурсивного алгоритма.

.Применение L-системы и терл - графики.

.Применение системы итерированных функций.

К защите представить:

·пояснительную записку объемом не менее 40 листов:

·теоретическое обоснование;

·листинг программы;

·результаты расчетов.

·электронную версию всех материалов курсового проекта;

·слайды плакатов в Ms Off PowerPoint 2003:

·тема и цель курсового проекта;

·алгоритм решения задачи;

·результаты решения задачи в виде графиков и таблиц;

·экранный вид интерфейса задачи.


Содержание


Введение

1. Рекурсивный алгоритм

1.1 Ковёр Серпинского

1.1.1 Код программы "Serpinsky.m"

1.1.2 Изображения ковра Серпинского

1.2 Квадратный ковёр Серпинского

1.2.1 Код программы "Serpinsky2.m"

.2.2 Изображения ковра Серпинского

.3 Кривая Коха

.3.1 Код программы "Koch.m"

.3.2 Изображения кривой Коха

. L - системы и терл - графика

.1 Снежинка Коха

.1.1 Код программы "RuleKoch.m" (возвращает функцию)

.1.2 Код программы "Snowflake.m" (вывод изображения)

.1.3 Изображение снежинки Коха

.2 Дракон Хартера-Хайтвея

.2.1 Код программы "Dracon.m"

.2.2 Изображение дракона Хартера-Хайтвея

.2.3 Изображение кривой Гильберта

.2.4 Изображение кривой Госпера

.2.5 Изображение кривой Серпинского

.3 Ветвление

.3.1 Код программы "Flower.m"

.3.2 Изображение цветка

.3.3 Изображение куста

.3.4 Изображение Снежинки

. Системы итерированных функций

.1 Построение ковра Серпинского с помощью ДСИФ

3.1.1 Код программы "SerpDSIF.m"

.1.2 Изображение ковра Серпинского построенного при помощи ДСИФ

.2 Кристалл построенный по алгоритму РСИФ

.2.1 Код программы "Cristal.m"

.2.2 Изображение кристалла

.2.3 Код программы "Maple.m"

.2.4 Изображение Листа

.2.5 Код программы "Paporotnic.m"

.2.6 Изображение папоротника

Заключение

Список использованных источников


Введение


Фракталы - математические объекты дробной размерности, название которых было введено в математику Б. Мандельбротом, являются в настоящее время, как предметом самостоятельных математических исследований, так и инструментарием, используемым в целом ряде прикладных задач нелинейной динамики, теории хаоса, обработки сигналов. Однако только относительно недавно появилось первое полноценное учебное пособие по новой быстро развивающейся математической дисциплине, основой которого стал учебный курс, преподававшийся автором книги в течение ряда лет в университете Миссури Колумбия. Так как при изучении фракталов и хаоса большую роль играет компьютерное моделирование, в курсе предусмотрено параллельное изучение теоретических вопросов и проведение компьютерных экспериментов. Это отличает его структуру от традиционной структуры большинства математических курсов: теорема-доказательство-пример-задача. В обобщенном виде подробно описаны известные алгоритмы построения фрактальных объектов (L-системы и терл-графика, аффинные преобразования, системы итерированных функций, случайные системы итерированных функций). Однако соответствующих программ, созданных на каком-либо языке программирования или в математическом пакете, не приводится. В то же время опыт практической реализации алгоритмов построения фрактальных объектов, описанных в каком-либо из современных математических пакетов (MATLAB, Mathcad, Maple, Matematica и т. д.), широко используемых в настоящее время в преподавании целого ряда физико-математических дисциплин, показывает, что существует необходимость внесения в них определенных корректировок, учитывающих особенности выбранного пакета (в первую очередь графические). В курсовой работе отражены алгоритмы построения классических фракталов и их программные реализации в пакете MATLAB.

1. Рекурсивный алгоритм


.1 Ковёр Серпинского


Рассматривается алгоритм, основанный на использовании рекурсивной функции. Приведён пример построения простого самоподобного фрактала - ковра Серпинского. В рассматриваемом в данном разделе алгоритме используется способ построения, основанный на последовательном удалении из начальной области внутренних подобластей в соответствии с заданными правилами.

Выберем в качестве начального множества S0 равносторонний треугольник вместе с областью, которую он замыкает. Удалим внутренность центральной треугольной области и назовем оставшееся множество S1. Затем повторим описанный процесс для каждого из трех оставшихся треугольников и получим приближение S2. Продолжая, таким образом, получим последовательность вложенных множеств , Sn пересечение которых и образует ковер Серпинского S (рис. 1). Из построения видно, что ковер является объединением N=3 непересекающихся уменьшенных в два раза копий (коэффициенты подобия по горизонтали и вертикали в данном случае оказываются одинаковыми, r = 1/2). Фрактальная размерность ковра Серпинского d равна:



Для построения рассматриваемого фрактала, очевидно, можно использовать следующий алгоритм.

. Задать порядок ковра N.

. Задать координаты вершин исходного треугольника ABC: (XA, YA), (XB, YB), (XC, YC).

. Построить равносторонний треугольник ABC и залить его синим цветом.

Вычислить координаты середин сторон треугольника ABC:



5. Построить треугольник A?B?C? и залить его красным цветом.

. Повторить N раз действия, описанные в пп. 4, 5, для треугольников AA?C?, A?BB?, C?B?C, соответственно.

Наиболее просто описанный выше алгоритм можно реализовать при использовании рекурсивной процедуры, выполняющей последовательность действий, описанных в пп. 4, 5.

Для реализации алгоритма в пакете MATLAB создана специальная функция, возвращающая изображение ковра Серпинского. Для этого использовался встроенный текстовый редактор MATLAB. Код программы приведён ниже. Изображение ковра Серпинского на рисунках 1 - 6.


.1.1 Код программы "Serpinsky.m"


% Листинг файла Serpinsky.mz = Serpinsky(Lmax)

% функциЯ, возвращающая изображение ковра Серпинского

% Lmax - порядок ковра

% задание координат вершин равнобедренного треугольника

x1=0; y1=0; x2=1; y2=0; x3=0.5; y3=sin(pi/3);

h=figure(1); % инициализациЯ графического окнаon; % включение режима рисования фигур в одном графическом окне

fill([x1 x2 x3],[y1 y2 y3],'b');

% прорисовка равностороннего треугольника(gca,'xtick',[],'ytick',[]); % отключение режима оцифровки осей(gca,'XColor','w','YColor','w'); % установка цвета рисования осей

Simplex(x1,y1,x2,y2,x3,y3,0,Lmax);

% обращение к функции, прорисовывающей равносторонние треугольники

% белого цветаoff % отключение режима рисования фигур в одном графическом окне

function z=Simplex(x1,y1,x2,y2,x3,y3,n,Lmax)

% рекурсивная функция, прорисовывающая равносторонние треугольники

% белого цветаn<Lmax

% задание координат вершин текущего равностороннего треугольника

dx=(x2-x1)/2; dy=(y3-y1)/2; x1n=x1+dx; y1n=y1; x2n=x1+dx+dx/2;n=y1+dy;x3n=x1+dx/2; y3n=y1+dy;([x1n x2n x3n],[y1n y2n y3n],'r');=n+1;

% рекурсия(x1,y1,x1n,y1n,x3n,y3n,n,Lmax); Simplex(x1n,y1n,x2,y2,x2n,y2n,n,Lmax);(x3n,y3n,x2n,y2n,x3,y3,n,Lmax); end


1.1.2 Изображения ковра Серпинского


Рисунок 1 - Ковёр Серпинского 0 порядка


Рисунок 2 - Ковёр Серпинского 1 порядка


Рисунок 3 - Ковёр Серпинского 2 порядка


Рисунок 4 - Ковёр Серпинского 3 порядка


Рисунок 5 - Ковёр Серпинского 4 порядка


Рисунок 6 - Ковёр Серпинского 5 порядка


.2 Квадратный ковёр Серпинского


Алгоритм визуализации фрактального объекта, основные этапы построения которого представлены на рисунках 7 - 12, реализуется следующей последовательностью действий.

.Задать порядок ковра N.

.Задать координаты вершин исходного квадрата ABCD: (XA,YA), (XB, YB) (XC, YC),(XD, YD).

3.Построить квадрат ABCD и залить его синим цветом.

.Вычислить координаты точек, делящих стороны квадрата ABCD на три равные части: dx=(XB-XA)/3, dy=(YB-YA)/3, XA=XA+dx, YA=YA+dy, XB=XA+dx+dx, YB=YA+dy, XC=XA+dx+dx, YC=YA+dy+dy, XD=XA+dx, YD=YA+dy+dy.

.Построить квадрат A?B?C?D? и залить его белым цветом.

.Повторить N раз действия, описанные в пп. 4, 5, для квадратов с вершинами, имеющими следующие координаты:


(XA,YA), (XA,YA), (XA,YA), (XA,YA),

(XA,YA), (XB,YA), (XB,YB), (XA,YB),

(XB,YA), (XB,YB), (XB,YB), (XB,YB),

(XB,YB), (XB,YB), (XB,YC), (XC,YC),

(XC,YC), (XB,YC), (XC,YC), (XC,YC),

(XD,YD), (XC,YC), (XC,YC), (XD,YC),

(XA,YD), (XD,YD), (XD,YC), (XD,YD),

(XA,YA), (XA,YD), (XD,YD), (XA,YD)


соответственно. Ниже приведен листинг файла Serpinsky2.m, который содержит описание функции, возвращающей изображение квадратного ковра Серпинского.


.2.1 Код программы "Serpinsky2.m"


% Листинг файла Serpinsky2.mz=Serpinsky2(Lmax)

% функция, возвращающая изображение квадратного ковра Серпинского

% Lmax - порядок ковра

% Задание координат вершин исходного квадрата

x1=0; y1=0; x2=1; y2=0; x3=1; y3=1; x4=0; y4=1;(1); hold on; fill([x1 x2 x3 x4],[y1 y2 y3 y4],'b');(gca,'xtick',[],'ytick',[]); set(gca,'XColor','w','YColor','w');(x1,y1,x2,y2,x3,y3,x4,y4,0,Lmax);offz=Quadrate(x1,y1,x2,y2,x3,y3,x4,y4,n,Lmax)

% рекурсивная функция, прорисовывающая квадраты белого цвета

if n<Lmax=(x2-x1)/3; dy=(y3-y1)/3;n=x1+dx; y1n=y1+dy; x2n=x1+dx+dx; y2n=y1+dy;n=x1+dx+dx; y3n=y1+dy+dy; x4n=x1+dx; y4n=y1+dy+dy;([x1n x2n x3n x4n],[y1n y2n y3n y4n],'r');=n+1;(x1,y1,x1+dx,y1,x1+dx,y1+dy,x1,y1+dy,n,Lmax);(x1+dx,y1,x1+2*dx,y1,x1+2*dx,y1+dy,x1+dx,y1+dy,n,Lmax);(x1+2*dx,y1,x2,y1,x2,y1+dy,x1+2*dx,y1+dy,n,Lmax);(x1+2*dx,y1+dy,x2,y1+dy,x2,y1+2*dy,x1+2*dx,y1+2*dy,n,Lmax);(x1+2*dx,y1+2*dy,x2,y1+2*dy,x2,y3,x1+2*dx,y3,n,Lmax);(x1+dx,y1+2*dy,x1+2*dx,y1+2*dy,x1+2*dx,y4,x1+dx,y4,n,Lmax);(x1,y1+2*dy,x1+dx,y1+2*dy,x1+dx,y4,x1,y4,n,Lmax);(x1,y1+dy,x1+dx,y1+dy,x1+dx,y1+2*dy,x1,y1+2*dy,n,Lmax);nd


1.2.2 Изображения ковра Серпинского


Рисунок 7 - Квадратный ковёр Серпинского 0 порядка


Рисунок 8 - Квадратный ковёр Серпинского 1 порядка

Рисунок 9 - Квадратный ковёр Серпинского 2 порядка


Рисунок 10 - Квадратный ковёр Серпинского 3 порядка


Рисунок 11 - Квадратный ковёр Серпинского 4 порядка


Рисунок 12 - Квадратный ковёр Серпинского 5 порядка


.3 Кривая Коха


Еще одним примером фрактального объекта, для построения которого оказывается удобным использовать рекурсивный алгоритм, является кривая Коха. Построение данной кривой начинается с отрезка K0 единичной длины.

Удалим из отрезка K0 отрезок длины 1/3 и добавим два новых отрезка такой же длины. Назовем полученное множество K1. На следующем шаге разделим каждый отрезок длины 1/3 на три части длины 1/9 и повторим описанную процедуру, заменяя на каждом шаге среднюю ветвь двумя новыми отрезками. Обозначим через Kn фигуру, получившуюся после n-го шага. Можно строго доказать, что последовательность кривых сходится к предельной кривой K бесконечной длины, фрактальная размерность которой равна



Ниже приводится листинг рекурсивной функции, возвращающей изображение кривой Коха.

Изображение кривой Коха, возвращенное описанной выше функцией, представлено на рисунках 13-18.


.3.1 Код программы "Koch.m"


% Листинг рекурсивной функции, возвращающей изображение кривой Кохаz=Koch(N)

% функция, возвращающая изображение кривой Коха=0; y1=0; % левая точка начального отрезка=1; y2=0; % праваяя точка начального отрезка

figure(1); axis([0 1 0 1]); set(gca,'XColor','w','YColor','w');on;(x1,y1,x2,y2,N);

% вызов рекурсивной функции, прорисовывающей кривую Коха

function z=Coord(x1,y1,x2,y2,n)

% рекурсивная функция, прорисовывающая кривую Кохаn>0

% вычисление координат концов отрезков на очередном шаге рекурсии

dx=(x2-x1)/3; dy=(y2-y1)/3;n=x1+dx; y1n=y1+dy;n=x1+2*dx; y2n=y1+2*dy;=dx/2-dy*sin(pi/3)+x1n; ymid=dy/2+dx*sin(pi/3)+y1n;

% рекурсиЯ(x1,y1,x1n,y1n,n-1);(x1n,y1n,xmid,ymid,n-1);(xmid,ymid,x2n,y2n,n-1);(x2n,y2n,x2,y2,n-1);=[x1 y1]; r2=[x2 y2]; R=cat(1,r1,r2);

plot(R(:,1),R(:,2),'Color','b'); % построение кривой Коха;


.3.2 Изображения кривой Коха


Рисунок 13 - Кривая Коха 0 порядка


Рисунок 14 - Кривая Коха 1 порядка


Рисунок 15 - Кривая Коха 2 порядка

Рисунок 16 - Кривая Коха 3 порядка


Рисунок 17 - Кривая Коха 4 порядка


Рисунок 18 - Кривая Коха 5 порядка


2. L - системы и терл - графика


.1 Снежинка Коха

рекурсивный самоподобный фрактал программа

Понятие "L-система" было введено А. Лидермайером в 1968 г. при изучении формальных языков. С их помощью оказывается возможным не только строить многие известные самоподобные фракталы, например, снежинку Коха, ковер Серпинского, кривые Пеано, Гильберта, Серпинского и др., но и создавать бесконечное разнообразие новых фракталов, укладывающихся в данную схему.

Терл-графика (от turtle - черепашка) является подсистемой вывода графического представления фрактального объекта. Основным исполнителем данной системы является "черепашка" (точка), которая перемещается по экрану дискретными шагами, прочерчивая или не прочерчивая свой след. "Мгновенное" положение "черепашки" задается тремя параметрами (x, y, ?), где (x, y) - координаты "черепашки", ? - направление следующего шага (угол, отсчитываемый от положительного направления оси x). Последовательность команд, определяющая направление перемещения и действия "черепашки", задается кодовым словом, буквы которого читаются слева направо. Кодовое слово, представляющее собой результат работы L-системы, может включать в себя следующие буквы:

·F - переместиться на один шаг вперед, прорисовывая след;

·b - переместиться на один шаг вперед, не прорисовывая след;

·[ - открыть ветвь;

·] - закрыть ветвь;

·+ - увеличить угол ? на величину ?;

·? - уменьшить угол ? на величину ?;

·X , Y - вспомогательные переменные.

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

Формально, детерминированная L-система состоит из алфавита, слова инициализации, называемого аксиомой или инициатором, и набора порождающих правил, указывающих как следует преобразовывать слово при каждой следующей итерации. Например, L-система, соответствующая снежинке Коха, представленной на рисунке 19, задается следующим образом:

Аксиома: F++F++F

Порождающее правило:


Newf =F - F + +F - F

?:= ?/3


Очевидно, что графическим представлением аксиомы F + +F + +F является равносторонний треугольник. "Черепашка" делает один шаг вперед, затем угол увеличивается на 2?/3 и "черепашка" делает еще один шаг вперед, далее угол вновь увеличивается на 2?/3 и "черепашка" делает еще один шаг. На первом шаге каждая буква F в слове инициаторе заменяется на слово New:


F?F ++F ?F ++F ? ++F?F ++F ?F ++F ?F


Повторяя этот процесс, на втором шаге получим:


F?F++F?F?F?F++F?F+F?F++F?F?F?F++F?F++F?F++F?F?F?F++F?F++F?F++F?F?F?F++F?F++F?F++F?F?F?F++F?F и т. д.


В пакете MATLAB наиболее просто реализовать L-систему, используя рекурсивную функцию. Ниже приведен пример рекурсивной функции, возвращающей снежинку Коха.


2.1.1 Код программы "RuleKoch.m" (возвращает функцию)


function z=RuleKoch(Lmax,Axiom,Newf,n,tmp);

% функция, возвращающая L-систему для снежинки Коха

% Входные параметры:

% Lmax - порядок снежинки

% Axiom - строка, содержащая аксиому

% Newf - строка, содержащая порождающее правило

% tmp - входная L-система

while n<=Lmaxn==1=Axiom;=n+1;=strrep(tmp,'F',Newf); % замена всех букв F на

% порождающее правило=n+l;

tmp=RuleKoch (Lmax,Axiom,Newf ,n, tmp) ; %

% рекурсия;;=tmp;[X,Y]=Koch(Lmax)

% функция, возвращающая изображение снежинки Коха

% Lmax - порядок снежинки

% порождающие правила='F++F++F';

Newf='F-F++F-F';

teta=pi/3;=0;=[0;0]; % стартовая точка=Coord(p,Lmax,Axiom,Newf,alpha,teta,p); % обращение к функции,

% возвращающей координаты вершин=size(p,2); % число вершин снежинки Коха=p(1:1,1:M); % создание вектора, содержащего Х-е координаты вершин снежинки=p(2:2,1:M); % создание вектора, содержащего Y-e координаты вершин снежинки(1); % инициализация графического окна(X,Y,'Color','k'); % построение снежинки Коха

set(gca,'xtick',[],'ytick',[]);(gca,'XColor','w','YColor','w');z=Coord(p,Lmax,Axiom,Newf, alpha,teta)

% функция, возвращающая координаты вершин снежинки Коха=RuleKoch(Lmax,Axiom,Newf,1,' '); % задание L-системы

M=length(Rule);i=l:M=p(1:2, size(p,2):size(p,2));Rule(i)=='F' % шаг вперед=[cos(alpha);sin(alpha)];=R/(4^Lmax);=Tmp+R;=cat(2,p,Tmp);;

if Rule(i)=='+' % увеличение угла, задающего направление движения=alpha+teta;;Rule(i)== '-' % уменьшение угла, задающего направление движения

alpha=alpha-teta; end; end;

z=p;

2.1.2 Код программы "Snowflake.m" (вывод изображения)


function [X,Y]=Snowflake (Lmax)

% функция, возвращающая изображение

% снежинки Коха

% Lmax - порядок снежинки

% порождающие правила='F++F++F';

Newf='F-F++F-F';

teta=pi/3;=0;=[0;0]; % стартовая точка

p=Coord(p,Lmax,Axiom,Newf,alpha,teta);

% обращение к функции, возвращающей координаты вершин=size(p,2); % число вершин снежинки Коха=p(1:1,1:M);

% создание вектора, содержащего Х-е координаты вершин снежинки=p(2:2,1:M);

% создание вектора, содержащего Y-е координаты вершин снежинки(1); % инициализация графического окна(X,Y, 'Color', 'k'); % построение снежинки Коха

function z=Coord(p,Lmax,Axiom,Newf,alpha,teta)

% функциЯ, возвращающаЯ координаты вершин снежинки Коха=RuleKoch(Lmax,Axiom,Newf,1, ' '); % задание L-системы

M=length(Rule);i=1:M=p(1:2,size(p,2):size(p,2));Rule(i)== 'F ' % шаг вперед=[cos(alpha);sin(alpha)]; R=R/(4^Lmax);=Tmp+R; p=cat(2,p,Tmp);

endRule(i)== '+' % увеличение угла, задающего направление движения

alpha=alpha+teta;

end

if Rule(i)== '-' % уменьшение угла, задающего направление движения

alpha=alpha-teta;=p;


2.1.3 Изображение снежинки Коха


Рисунок 19 - Снежинка Коха 4 порядка


.2 Дракон Хартера-Хайтвея


Однако при построении других фракталов, например, дракона Хартера-Хайтвея (рисунок 20), на некоторых шагах возникает необходимость в изменении направления чтения правила (не слева направо, а справа налево). Для решения данной проблемы вводят две дополнительные команды, обозначаемые X и Y, которые используются для создания соответствующей L-системы, но игнорируются "черепашкой" при перемещении. При использовании этих команд порождающее правило для дракона имеет вид:

Аксиома: FX

Порождающие правила:= FX

Newx = X +YF += ?FX ?Y


В соответствии с данными правилами L-система имеет следующий вид:


шаг: FX+YF+

шаг: FX+YF++?FX?YF+

шаг: FX+YF ++?FX?YF++?FX+YF+??FX?YF+

шаг:

FX+YF++?FX?YF++?FX+YF+??FX?YF++?FX+YF++?FX?YF+??FX+YF+??FX?YF+


Ниже приводится листинг файла Dracon.m, содержащего описание функции, возвращающей изображение дракона, в соответствии с описанной выше L-системой.


.2.1 Код программы "Dracon.m"


function [X,Y]=Dracon(Lmax)

% функция, возвращающая изображение дракона

% Lmax - порЯядок дракона

% порождающие правила='FX';='F';

Newx='X+YF+';='-FX-Y';=pi/2; alpha=0; p=[0;0];=Coord(Lmax,Axiom,Newf,Newx,Newy,alpha,teta);

% обращение к функции, возвращающей координаты угловых точек дракона=size(p,2);=p(1:1,1:M);

% создание вектора, содержащего Х-е координаты угловых точек дракона=p(2:2,1:M);

% создание вектора, содержащего Y-е координаты угловых точек дракона

plot(X,Y,'Color','k');(gca,'xtick', 'уtick',[]);(gca,'XColor','w','YColor','w');z=Coord(p,Lmax,Axiom,Newf,Newx,Newy, alpha,teta)

% функция, возвращающая координаты угловых точек дракона

Rule=DraconString(Lmax,Axiom,Newf,Newx,Newy, 1, ' ') ; % задание L-системы=length(Rule)i=l:M=p(1:2, size(p,2) :size(p,2));Rule(i)=='F' % шаг вперед=[cos(alpha);sin(alpha)];=R/(2^Lmax);=cat(2,p,Tmp);

end;Rule(i) == ' + ' % увеличение угла, задающего направление движения=alpha+teta;;Rule(i) == '-' % уменьшение угла, задающего направление движения

alpha=alpha-teta;;;=p;z=DraconString(Lmax,Axiom,Newf,Newx,Newy,n,tmp);

% функция, возвращающая L-систему=1;

if n<=Lmaxn==1=Axiom;;=length (tmp);=' ';i=l:Mtmp(i)=='X' tmpl=streat(tmpl,Newx); end;tmp(i)=='Y' tmpl=streat(tmpl,Newy); end;not(tmp(i)=='F') &not(tmp(i)=='X') &not(tmp(i)=='Y') tmpl=strcat(tmpl,tmp(i)); end;=tmpl; n=n+l; tmp=DraconString(Lmax,Axiom,Newf,Newx,Newy ,n, tmp);

end;;=tmp;


2.2.2 Изображение дракона Хартера-Хайтвея


Рисунок 20 - Дракон Хартера - Хайтвея 12 порядка


.2.3 Изображение кривой Гильберта

Заменяя в описанной выше программе порождающие правила, можно получить и другие фрактальные кривые, например, кривую Гильберта. Аксиома: X

Порождающие правила:

= F= -YF + XFX + FY -= +XF -YFY - FX +

? = 0, ? = ?/2


Рисунок 21 - Кривая Гильберта 4 порядка

2.2.4 Изображение кривой Госпера

Аксиома: XF

Порождающие правила:

= X +YF + +YF ? FX ? ?FXFX ?YF += ?FX +YFYF + +YF + FX ? ?FX ?Y д

? = 0, ? = ?/3


Рисунок 22 - Кривая Госпера 3 порядка


.2.5 Изображение кривой Серпинского

Аксиома: F + XF + F + XF

Порождающие правила:

= F= XF ? F + F ? XF + F + XF ? F + F ? X= ' '

? = ? 4, ? = ?/2.


Рисунок 23 - Кривая Серпинского 3 порядка


.3 Ветвление


Когда в L-системе встречается символ [ (открыть ветвь), необходимо запомнить координаты точки нахождения "черепашки" и направление ее движения, т. е. переменные (x, y,?). К сохраненным переменным следует вернуться после обнаружения символа ] (закрыть ветвь). Для хранения триплетов (x, y, ?) в [6] предлагается использовать стек:



в конец которого записываются новые данные. При закрытии ветви переменным (x, y, ?) присваиваются значения, считанные из конца стека, затем эти значения из стека удаляются. В пакете MATLAB оказывается более удобным использовать матрицу с переменным числом столбцов:


причем координаты каждой новой точки ветвления добавляются в новый столбец матрицы M. После закрытия ветви переменным (x, y, ?) присваиваются значения, считанные из последнего столбца матрицы M, затем этот столбец удаляется.

Таким образом, ветвление задается двумя символами:

[ - открыть ветвь: добавить вектор

] - закрыть ветвь: присвоить переменным

(x, y, ?) значения координат вектора, являющегося последним столбцом матрицы M.

Пример фрактала, построенного с помощью операции ветвления, представлен на рисунке 24. Ниже приводится листинг файла Flower.m, содержащего описание функции, возвращающей изображение цветка, в соответствии с описанной выше L-системой.


.3.1 Код программы "Flower.m"


% Листинг файла Flower.m

function [X,Y]=Flower(Lmax)

% функция, возвращающая изображение цветка

% Lmax - порядок цветка

% порождающие правила

Axiom='F[+F+F][-F-F][++F][-F]F';

Newf='FF[++F][+F][F][-F][-F] ';

teta=pi/16;=pi/2;=[0;0]; % начальная точка

Coord(p,Lmax,Axiom,Newf,alpha,teta);

% обращение к функции, возвращающей

% изображение цветка

function z=Coord(p,Lmax,Axiom,Newf,alpha,teta)

% функциЯ, возвращающаЯ изображение цветка=FlowerString(Lmax,Axiom,Newf,1, ' ');

% задание L - системы(1); hold on;=length(Rule);L=0; x0=p(1);y0=p(2);i=1:MRule(i)== 'F' % шаг вперед=x0+cos(alpha); y1=y0+sin(alpha);=[x0,x1]; Y=[y0,y1]; x0=x1; y0=y1;(X,Y, 'Color', 'k'); end

if Rule(i)== '+' % увеличение угла, задающего направление движениЯ

alpha=alpha+teta;Rule(i)== '! ' % уменьшение угла, задающего направление движениЯ

alpha=alpha-teta;Rule(i)== ' ['; % открыть ветвьL==0 St=[x0;y0;alpha]; L=1; else St=cat(2,St,[x0;y0;alpha]);endRule(i)== ']' % закрыть ветвь=size(St,2); R=St(1:3,M:M);=R(1); y0=R(2);=R(3); St=St(1:3,1:M-1);offz=FlowerString(Lmax,Axiom,Newf,n,tmp)

% функция, возвращающая L - системуn<=Lmax

if n==1=Axiom; n=n+1; else=strrep(tmp, 'F',Newf);=n+1; tmp=FlowerString(Lmax,Axiom,Newf,n,tmp); % рекурсия

end=tmp;


.3.2 Изображение цветка


Рисунок 24 - Цветок 3 порядка


2.3.3Изображение куста

Заменяя в описанной программе порождающие правила, можно получить и другие ветвящиеся фрактальные объекты, например, куст.

Аксиома: F

Порождающие правила:

= ?F + F +[+F ? F?]?[?F + F + F]

? = ?/2, ? = ?/8


Рисунок 25 - Куст 3 порядка


.3.4 Изображение Снежинки

Аксиома: [F]+[F]+[F]+[F]+[F]+[F]

Порождающие правила:

= F[+ + F][?FF]FF[+F][?F]FF

? = 0, ? = ?/3


Рисунок 26 - Снежинка 3 порядка


3. Системы итерированных функций


.1 Построение ковра Серпинского с помощью ДСИФ


В общем случае для построения системы итерированных функций (СИФ) в рассмотрение вводится совокупность сжимающих отображений



действующих в R. Эти m отображений используются для построения одного сжимающего отображения T в пространстве ? всех непустых компактов из R Преобразование Хатчинсона T :??? определяется следующим образом:



Данное преобразование ставит в соответствие "точкам" из ?, под которыми здесь понимаются компактные множества, также "точки" из ?. Системой итерированных функций называется совокупность приведенных выше отображений вместе с итерационной схемой



Например, СИФ при построении ковра Серпинского задается тремя аффинными преобразованиями, которые в матричной форме имеют следующий вид:



Таким образом, для построения ковра Серпинского в пакете MATLAB с помощью ДСИФ можно использовать следующий алгоритм.

. Задать порядок ковра Серпинского n.

. Задать число точек начальной конфигурации m.

. Задать координаты i точек (i = 1, 2,…, m), заполняющих начальное множество.

. Перевести каждое из чисел 1, 2,…, 3n в троичную систему счисления.

. Сформировать массив, состоящий из 3n строк длиной n символов.

. Задать аффинные преобразования.

. Для i-ой точки начальной конфигурации последовательно применить каждое из j = 1, 2,…, 3n итерационных правил и отобразить в графическом окне полученные образы каждой начальной точки.

Пример ковра Серпинского, построенного с помощью описанной выше модификации алгоритма ДСИФ, представлен на рисунке 27. Ниже приводится листинг файла SerpDSIF.m, содержащего описание соответствующей функции, возвращающей изображение ковра Серпинского.


.1.1 Код программы "SerpDSIF.m"


% Листинг файла SerpDSIF.m

function z=SerpDSIF(Niter,NPoints)

% функциЯ, возвращающая изображение ковра Серпинского

% Niter - порядок ковра

% NPoints - число точек начальной конфигурации=zeros(NPoints,1); y=zeros(NPoints,1);

% задание координат точек начальной конфигурации=0; y1=0; x2=1; y2=0; x3=1/2; y3=sin(pi/3);

j=1;j<=NPoints=rand(1,1);=sqrt(3)/2*rand(1,1);(-sqrt(3)*tmpx+tmpy<=0)&(sqrt(3)*tmpx+tmpy-sqrt(3)<=0)(j)=tmpx;(j)=tmpy;

j=j+1;;

% Формирование массива, содержащего правила итерации

for i=1:3^Niter(i)=system3(i-1);

% перевод числа из десятичной в троичную систему счисления

end=1; s='0';n<Niter=strcat(s, '0'); n=n+1;i=1:3^Niter=num2str(Tmp(i)); tmp1=s;m=1:length(tmp)(Niter-m+1)=tmp(length(tmp)-m+1);(i,1:Niter)=tmp1;=[0;0]; a2=[1/2;0]; a3=[1/4;sqrt(3)/4]; A=[1/2,0;0,1/2];

% задание аффинных преобразований(1); hold on; set(gca, 'xtick',[], 'ytick',[]);(gca, 'XColor', 'w', 'YColor', 'w'); fill([x1 x2 x3],[y1 y2 y3], 'w');(Niter,NPoints,x,y,A,a1,a2,a3,Cod);

% построение ковра Серпинскогоz=GosperDraw(Niter,NPoints,x,y,A,a1,a2,a3,Cod)

% функциЯ, создающаЯ изображение ковра Серпинскогоm=1:3^Niter

X=x; Y=y; Rule=Cod(m,:);i=1:Niter=Rule(Niter+1!i);

if tmp=='0 '

[X Y]=T(NPoints,X,Y,A,a1); % первое аффинное преобразование

endtmp=='1'

[X Y]=T(NPoints,X,Y,A,a2); % второе аффинное преобразование

if tmp=='2'

[X Y]=T(NPoints,X,Y,A,a3); % третье аффинное преобразование

end(X,Y, '. ', 'MarkerSize',1, 'MarkerEdgeColor', 'b');

% отображение результатов итерации

end[X,Y]=T(NPoints,x,y,A,a)

% ФункциЯ, возвращающаЯ результат аффинного преобразования=zeros(NPoints,1); Y=zeros(NPoints,1);

for i=1:NPoints=[x(i);y(i)]; R=A*R+a; X(i)=R(1); Y(i)=R(2);z=system3(D);

% функциЯ, возвращающаЯ значение целого числа

% в троичной системе счислениЯ

% D - число в десЯтичной системе счислениЯ

n=1;D>=3^n n=n+1; endn>1=floor(D/3^(n-1))*10^(n-1); b=mod(D,3^(n-1));b>=3=system3(b); % рекурсия=a+b;=D;

end


.1.2 Изображение ковра Серпинского построенного при помощи ДСИФ


Рисунок 27 - Ковёр Серпинского 4 порядка (ДСИФ)


.2 Кристалл построенный по алгоритму РСИФ


В отличие от ДСИФ в рандомизированном алгоритме начальное множество S0 состоит из одной точки (x0 , y0 ), а правило, по которому точке ставится в соответствие точка ( xi,yi ), где i - номер правила, выбирается случайным образом из набора, содержащего все возможные правила аффинных преобразований. Например, применительно к ковру Серпинского это означает, что при построении ковра 2_го порядка преобразование должно случайным образом выбираться из следующего множества преобразований:



число элементов N которого равно

Таким образом, для построения ковра Серпинского в пакете MATLAB с помощью РСИФ можно использовать следующий алгоритм.

. Задать порядок ковра Серпинского n.

. Задать число испытаний NTrial.

. Задать число аффинных преобразований m = 3.

. Сформировать массив, содержащий набор правил для аффинных преобразований.

. Задать координаты начальной точки (x0 , y0 ).

. Перевести каждое из чисел 1, 2,…, 3n в троичную систему счисления.

. Задать аффинные преобразования.

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

. Отобразить вычисленное множество точек в графическом окне.

Пример кристалла, построенного с помощью описанного выше алгоритма РСИФ, представлен на рисунке 28. Ниже приводится листинг файла Cristal.m, содержащего описание соответствующей функции.


3.2.1 Код программы "Cristal.m"


% Листинг файла Cristal.m

function z=Cristal(Niter,NTrial)

% функция, возвращающая изображение кристалла

% Niter - порядок кристалла

% NTrial - число испытаний=4; % число аффинных преобразований

% Создание массива, содержащего набор

% правил для аффинных преобразований

k=1;m=1:Niteri=1:4^m Tmp(k)=system3(i-1,Na); k=k+1;(1)=Na;m=2:Niter Q(m)=Q(m-1)+Na^m; end=1; s='0'; M=1;n<=length(Tmp)=1;n>Q(m) m=m+1; endm==1(n,1:1)=s;(n,1:1)=s;i=2:m S(n,1:i)=strcat(S(n,:),s); end=n+1;i=1:k-1 tmp=num2str(Tmp(i)); m=1;i>Q(m) m=m+1; end(1:m)=S(i,1:m);m=1:length(tmp)(length(tmp1)-m+1:length(tmp1)!m+1)=tmp(length(tmp)!m+1:length(tmp)!m+1);(i,1:length(tmp1))=tmp1;

end=0; y=0; % координаты начальной точки

% задание аффинных преобразований=[0.2550,0.0000;0.0000,0.2550];=[0.2550,0.0000;0.0000,0.2550];

A3=[0.2550,0.0000;0.0000,0.2550];

=[0.3700,-0.6420;0.6420,0.3700];=[0.3726;0.6714]; a2=[0.1146;0.2232];=[0.6306;0.2232]; a4=[0.6356;!0.0061];(1); hold on;(gca, 'xtick',[], 'ytick',[]);(gca, 'XColor ', 'w', 'YColor', 'w');(Niter,NTrial,x,y,A1,A2,A3,A4,...,a2,a3,a4,Cod); % визуализация фракталаz=DrawFractal(Niter,NTrial,x,y,...,A2,A3,A4,a1,a2,a3,a4,Cod)

% функция, возвращающая изображение фрактала=zeros(NTrial,1); Y1=zeros(NTrial,1);

X=x; Y=y;m=1:NTrial=1+round((size(Cod,1)-1)*rand(1,1));

% выбор номера преобразования=Cod(Np,:);

for i=1:length(Rule)=Rule(length(Rule)+1-i);tmp=='0' [X Y]=T(X,Y,A1,a1); endtmp=='1' [X Y]=T(X,Y,A2,a2); endtmp=='2 ' [X Y]=T(X,Y,A3,a3); endtmp=='3' [X Y]=T(X,Y,A4,a4); end(m)=X; Y1(m)=Y;(X1,Y1, '. ', 'MarkerSize',1,'MarkerEdgeColor', 'b');[X,Y]=T(x,y,A,a)

% Функция, возвращающая результат

% аффинного преобразования=[x;y]; R=A*R+a;

X=R(1); Y=R(2);z=system3(D,m);

% функция, возвращающая значение

% числа в четверичной системе координат

n=1;D>=m^n n=n+1; endn>1=floor(D/m^(n-1))*10^(n-1);=mod(D,m^(n-1));b>=m b=system3(b,m); end=a+b;=D;


3.2.2 Изображение кристалла


Рисунок 28 - Кристалл (РСИФ)


.2.3 Код программы "Maple.m"


function z=Maple(Niter,NPoints)=0; y1=0;=1; y2=0;=1/2; y3=sin(pi/3);=zeros(NPoints,1); y=zeros(NPoints,1);=1;j<=NPoints=rand(1,1);=sqrt(3)/2*rand(1,1);(-sqrt(3)*tmpx+tmpy<=0)&(sqrt(3)*...+tmpy-sqrt(3)<=0)(j)=tmpx; y(j)=tmpy; j=j+1;i=1:2^Niter Tmp(i)=system2(i-1,2); end=1; s='0';n<Niter s=strcat(s,'0'); n=n+1; endi=1:2^Niter=num2str(Tmp(i)); tmp1=s;m=1:length(tmp) tmp1(Niter-m+1)=...(length(tmp)-m+1); end(i,1:Niter)=tmp1;=[0.4,-0.3733;0.0600,0.6000];=[-0.8000,-0.1867;0.1371,0.8000];=[0.3533;0.000]; a2=[1.1000;0.1000];(1); hold on;(gca,'xtick',[],'ytick',[]);(gca,'XColor','w','YColor','w');(Niter,NPoints,x,y,A1,A2,...,a2,Cod);z=FractalDraw(Niter,NPoints,x,y,...,A2,a1,a2,Cod)m=1:2^Niter=x; Y=y;=Cod(m,:);i=1:Niter=Rule(Niter+1-i);tmp=='0' [X Y]=T(NPoints,X,Y,A1,a1); endtmp=='1' [X Y]=T(NPoints,X,Y,A2,a2); end(X,Y,'.','MarkerSize',1,...

'MarkerEdgeColor','b'); end[X,Y]=T(NPoints,x,y,A,a)=zeros(NPoints,1); Y=zeros(NPoints,1);i=1:NPoints R=[x(i);y(i)]; R=A*R+a;(i)=R(1); Y(i)=R(2); endz=system2(D,m);=1;D>=m^n n=n+1; endn>1=floor(D/m^(n-1))*10^(n-1);=mod(D,m^(n-1));b>=m b=system2(b,m);=a+b;=D; end


3.2.4 Изображение Листа


Рисунок 29 - Лист (ДСИФ)


.2.5 Код программы "Paporotnic.m"


function z=Paporotnic(Niter,NPoints)=0; y1=0; x2=1; y2=0; x3=1/2; y3=sin(pi/3);=zeros(NPoints,1); y=zeros(NPoints,1);=1;j<=NPoints=rand(1,1); tmpy=sqrt(3)/2*rand(1,1);(-sqrt(3)*tmpx+tmpy<=0)&(sqrt(3)*tmpx+tmpy-sqrt(3)<=0)(j)=tmpx; y(j)=tmpy; j=j+1; end; end;i=1:4^Niter Tmp(i)=system2(i-1,4); end;=1; s='0';n<Niter s=strcat(s,'0'); n=n+1; end;i=1:4^Niter=num2str(Tmp(i)); tmp1=s;m=1:length(tmp)(Niter-m+1)=tmp(length(tmp)-m+1);;(i,1:Niter)=tmp1; end;=[0.7000,0;0,0.7000]; A2=[0.1000,-0.4330;0.1732,0.2500];=[0.1000,0.4330;-0.1732,0.2500]; A4=[0,0;0,0.3000];=[0.1496;0.2962]; a2=[0.4478;0.0014];=[0.4450;0.1559]; a4=[0.4987;0.0070];(1); hold on; set(gca,'xtick',[],'ytick',[]);(gca,'XColor','w','YColor','w');(Niter,NPoints,x,y,A1,A2,A3,A4,a1,a2,a3,a4,Cod);z=Simplex(Niter,NPoints,x,y,A1,A2,A3,A4,a1,a2,a3,a4,Cod)m=1:4^Niter=x; Y=y;=Cod(m,:);i=1:Niter=Rule(Niter+1-i);tmp=='0' [X Y]=T(NPoints,X,Y,A1,a1); end;tmp=='1' [X Y]=T(NPoints,X,Y,A2,a2); end;tmp=='2' [X Y]=T(NPoints,X,Y,A3,a3); end;tmp=='3' [X Y]=T(NPoints,X,Y,A4,a4); end;;(X,Y,'.','MarkerSize',1,'MarkerEdgeColor','k') end;[X,Y]=T(NPoints,x,y,A,a)=zeros(NPoints,1); Y=zeros(NPoints,1);i=1:NPoints R=[x(i);y(i)]; R=A*R+a; X(i)=R(1); Y(i)=R(2); end;z=FractalDraw(Niter,NPoints,x,y,A1,A2,a1,a2,Cod)m=1:2^ Niter=x; Y=y; Rule=Cod(m,:);i=1:Niter tmp=Rule(Niter+1-i);tmp=='0' [X Y]=T(NPoints,X,Y,A1,a1); end;tmp=='1' [X Y]=T(NPoints,X,Y,A2,a2); end;;(X,Y,'.','MarkerSize',1,'MarkerEdgeColor','k'); end;[X,Y]=T(NPoints,x,y,A,a)=zeros(NPoints,1); Y=zeros(NPoints,1);i=1:NPoints R=[x(i);y(i)]; R=A*R+a; X(i)=R(1); Y(i)=R(2); end;z=system2(D,m);=1;D>=m^n n=n+1; end;n>1=floor(D/m^(n-1))*10^(n-1); b=mod(D,m^(n-1));b>=m b=system2(b,m); end;=a+b;z=D; end;


3.2.6 Изображение папоротника


Рисунок 30 - Папоротник (ДСИФ)

Заключение


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

Фракталы - математические объекты дробной размерности, название которых было введено в математику Б. Мандельбротом, являются в настоящее время, как предметом самостоятельных математических исследований, так и инструментарием, используемым в целом ряде прикладных задач нелинейной динамики, теории хаоса, обработки сигналов. Однако только относительно недавно появилось первое полноценное учебное пособие по новой быстро развивающейся математической дисциплине, основой которого стал учебный курс, преподававшийся автором книги в течение ряда лет в университете Миссури Колумбия. Так как при изучении фракталов и хаоса большую роль играет компьютерное моделирование, в курсовой работе рассмотрено параллельное изучение теоретических вопросов и проведение компьютерных экспериментов.

В обобщенном виде подробно описаны известные алгоритмы построения фрактальных объектов (L-системы и терл-графика, аффинные преобразования, системы итерированных функций, случайные системы итерированных функций и др.).

Разработаны соответствующие программы, созданные в математическом пакете Matlab.


Список использованных источников


1.Mandelbrot B. B. Les object fractals: forme, hasard et dimantion.- Paris: Flamarion, 1975.

.Каток А. Б., Хасселблат Б. Введение в современную теорию динамических систем.- М.: Факториал, 1999.

.Кренкель Э. Т. Сжатие сигналов с применением теории фракталов.- М.: МТУСИ, 1996.

.Кроновер Р. М. Фракталы и хаос в динамических системах. Основы теории.- М.: Постмаркер, 2000.

.Лихтенберг А., Либерман М. Регулярная и стохастическая динамика.- М.: Меркурий_ПРЕСС, 2000.

.Шустер Г. Детерминированный хаос.- М.: Мир, 1988.

.Журнал Exponenta Pro. Математика в приложениях. №3, 2003 г.


Задание Тема курсового проекта: Реализация в MATLAB алгоритмов построения фрактальных объектов. Исходные данные: Журнал Exponenta Pro. Математика в пр

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ