Вы находитесь на странице: 1из 11

Мастерская решений

УДК 519.68 С. В. Поршнев

Реализация в MATLAB алгоритмов


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

Задача 1. Введение
Построение фракталь
ных объектов. Фракталы — математические объекты дроб мость внесения в них определенных корректиро
ной размерности, название которых было введе вок, учитывающих особенности выбранного па
Программные но в математику Б. Мандельбротом [1], являются в кета (в первую очередь графические). В статье
средства настоящее время как предметом самостоятельных обсуждаются алгоритмы построения классичес
MATLAB математических исследований, так и инструмен ких фракталов и их программные реализации,
тарием, используемым в целом ряде прикладных созданные в пакете МАТLAB.
Результаты задач нелинейной динамики [2, 3], теории хаоса
Реализованы алгоритмы [4], обработки сигналов [5]. Однако только отно 2. Рекурсивный алгоритм
построения фракталов в
среде MATLAB. сительно недавно появилось первое полноценное Обсуждение алгоритма, основанного на ис
учебное пособие по новой быстро развивающей пользовании рекурсивной функции, проведем на
ся математической дисциплине [6], основой кото примере построения простого самоподобного
рого стал учебный курс, преподававшийся авто фрактала — ковра Серпинского. В рассматривае
ром книги в течение ряда лет в университете Мис мом в данном разделе алгоритме используется
суриКолумбия. способ построения, основанный на последова
Так как при изучении фракталов и хаоса боль тельном удалении из начальной области внутрен
шую роль играет компьютерное моделирование, них подобластей в соответствии с заданными пра
в курсе предусмотрено параллельное изучение вилами. Выберем в качестве начального множе
теоретических вопросов и проведение компью ства S0 равносторонний треугольник вместе с
терных экспериментов. Это отличает его струк областью, которую он замыкает. Удалим внутрен
туру от традиционной структуры большинства ность центральной треугольной области и назо
математических курсов: теорема–доказатель вем оставшееся множество S1 (рис. 1). Затем по
ство–пример–задача. В [6] в обобщенном виде вторим описанный процесс для каждого из трех
подробно описаны известные алгоритмы постро оставшихся треугольников и получим приближе
ения фрактальных объектов (Lсистемы и терл ние S 2 . Продолжая таким образом, получим пос
графика, аффинные преобразования, системы ледовательность вложенных множеств Sn , пере
итерированных функций, случайные системы сечение которых и образует ковер Серпинского
итерированных функций и др.). Однако соответ S (рис. 1). Из построения видно, что ковер явля
ствующих программ, созданных на какомлибо ется объединением N = 3 существенно непере
языке программирования или в математическом секающихся уменьшенных в два раза копий (ко
пакете, не приводится. В то же время опыт прак эффициенты подобия по горизонтали и вертика
тической реализации алгоритмов построения ли в данном случае оказываются одинаковыми,
фрактальных объектов, описанных в [6], в каком r = 1 2 ). Фрактальная размерность ковра Сер
либо из современных математических пакетов пинского d равна
(MATLAB, Mathcad, Maple, Matematica и т. д.), ши
log(3)
роко используемых в настоящее время в препо d= ≈ 1.5850.
давании целого ряда физикоматематических log(2)
Рис. 1. Построение
ковра Серпинского. дисциплин, показывает, что существует необходи Для построения рассматриваемого фрактала,
очевидно, можно использовать следующий алго
ритм.
1. Задать порядок ковра N .
2. Задать координаты вершин исходного тре
угольника ABC: ( X A , YA ), ( X B , YB ), ( X C , YC ).
3. Построить равносторонний треугольник
ABC и залить его синим цветом.
4. Вычислить координаты середин сторон
треугольника ABC:
XB − XA Y − YA
dx = , dy = B ,
2 2
X A′ = X A + dx, YA′ = YA + dy,

72 Exponenta Pro
Мастерская решений

X B ′ = X B + dx + dx 2, YB ′ = YB + dy, % Листинг файла Serpinsky.m


X C ′ = X C + dx 2, YC ' = YC + dy. function z = Serpinsky(Lmax)
% функциЯ, возвращающаЯ изображение ковра Серпинского
5. Построить треугольник A′B ′C ′ и залить его % Lmax — порядок ковра
% задание координат вершин равнобедренного треугольника
белым цветом. x1=0; y1=0; x2=1; y2=0; x3=0.5; y3=sin(pi/3);
6. Повторить N раз действия, описанные в h=figure(1); % инициализациЯ графического окна
пп. 4, 5, для треугольников AA′C ′, A′BB′, C ′B′C , hold on; % включение режима рисованиЯ фигур в одном графическом окне
fill([x1 x2 x3],[y1 y2 y3],’k’);
соответственно. % прорисовка равностороннего треугольника
Наиболее просто описанный выше алгоритм set(gca,’xtick’,[],’ytick’,[]); % отключение режима оцифровки осей
можно реализовать при использовании рекурсив set(gca,’XColor’,’w’,’YColor’,’w’); % установка цвета рисования осей
Simplex(x1,y1,x2,y2,x3,y3,0,Lmax);
ной процедуры, выполняющей последователь % обращение к функции, прорисовывающей равносторонние треугольники
ность действий, описанных в пп. 4, 5. Для реали % белого цвета
зации алгоритма в пакете MATLAB следует создать hold off % отключение режима рисованиЯ фигур в одном графическом окне
function z=Simplex(x1,y1,x2,y2,x3,y3,n,Lmax)
специальную функцию, возвращающую изобра
% рекурсивнаЯ функциЯ, прорисовывающаЯ равносторонние треугольники
жение ковра Серпинского, используя для этого % белого цвета
встроенный текстовый редактор MATLAB или лю if n<Lmax
бой другой текстовый редактор (например, «Блок % задание координат вершин текущего равностороннего треугольника
dx=(x2!x1)/2; dy=(y3!y1)/2; x1n=x1+dx; y1n=y1; x2n=x1+dx+dx/2;
нот»), и сохранить текст в файле Serpinsky.m. y2n=y1+dy;x3n=x1+dx/2; y3n=y1+dy;
Для вывода изображения ковра Серпинского, fill([x1n x2n x3n],[y1n y2n y3n],’w’);
например, пятого порядка, следует ввести в ко % прорисовка текущего равностороннего треугольника
n=n+1;
мандной строке пакета MATLAB имя функции с со % рекурсиЯ
ответствующим значением: Simplex(x1,y1,x1n,y1n,x3n,y3n,n,Lmax);
Simplex(x1n,y1n,x2,y2,x2n,y2n,n,Lmax);
Simplex(x3n,y3n,x2n,y2n,x3,y3,n,Lmax);
>> Serpinsky(5); end

Результат, возвращаемый функцией


Serpinsky( ), показан на рис. 1 (множество S5 ).
( X A , YD′ ) , ( X D′ , YD′ ) , ( X D′ , YC ) , ( X D , YD ) ,
Описанный выше алгоритм легко обобщает ( X A , YA′ ) , ( X A′ , YD′ ) , ( X D′ , YD′ ) , ( X A , YD′ )
ся для фрактальных объектов, правила построе
ния которых аналогичны правилам построения соответственно.
треугольного ковра Серпинского. Например, ал Ниже приведен листинг файла Serpinsky2.m,
горитм визуализации фрактального объекта, ос который содержит описание функции, возвраща
новные этапы построения которого представле ющей изображение квадратного ковра Серпинс
ны на рис. 2, реализуется следующей последова кого, представленного на рис. 2.
тельностью действий.
1. Задать порядок ковра N . % Листинг файла Serpinsky2.m
2. Задать координаты вершин исходного квад function z=Serpinsky2(Lmax)
рата ABCD: ( X A , YA ), ( X B , YB ), ( X C , YC ), % функциЯ, возвращающаЯ изображение квадратного ковра Серпинского
( X D , YD ). % Lmax — порядок ковра
% Задание координат вершин исходного квадрата
3. Построить квадрат ABCD и залить его си x1=0; y1=0; x2=1; y2=0; x3=1; y3=1; x4=0; y4=1;
ним цветом. figure(1); hold on; fill([x1 x2 x3 x4],[y1 y2 y3 y4],’b’);
4. Вычислить координаты точек, делящих set(gca,’xtick’,[],’ytick’,[]); set(gca,’XColor’,’w’,’YColor’,’w’);
стороны квадрата ABCD на три равные части:
Quadrate(x1,y1,x2,y2,x3,y3,x4,y4,0,Lmax);
hold off
dx = ( X B − X A ) 3, dy = (YB − YA ) 3,
X A′ = X A + dx, YA′ = YA + dy,
X B′ = X A + dx + dx, YB ′ = YA + dy,
X C ' = X A + dx + dx, YC ' = YA + dy + dy,
X D′ = X A + dx, YD′ = YA + dy + dy.
5. Построить квадрат A′B ′C ′D ′ и залить его
белым цветом.
6. Повторить N раз действия, описанные в
пп. 4, 5, для квадратов с вершинами, имеющими
следующие координаты:
( X A , YA ) , ( X A′ , YA ) , ( X A′ , YA′ ) , ( X A , YA′ ) ,
( X A′ , YA ) , ( X B′ , YA ) , ( X B′ , YB′ ) , ( X A′ , YB′ );
№3 (3) / 2003

( X B′ , YA ) , ( X B , YB ) , ( X B , YB′ ) , ( X B′ , YB′ ) ,
( X B′ , YB′ ) , ( X B , YB′ ) , ( X B , YC ′ ) , ( X C ′ , YC ′ );
( X C ′ , YC ′ ) , ( X B , YC ′ ) , ( X C , YC ) , ( X C ′ , YC ′ ) ,
( X D′ , YD′ ) , ( X C ′ , YC ′ ) , ( X C ′ , YC ′ ) , ( X D′ , YC′ ); Рис. 2. Этапы построения квадратного ковра Серпинского.

Математика в приложениях 73
Мастерская решений

function z=Quadrate(x1,y1,x2,y2,x3,y3,x4,y4,n,Lmax)
Изображение кривой Коха пятого порядка
% рекурсивнаЯ функциЯ, прорисовывающаЯ квадраты белого цвета K 5 , возвращенное описанной выше функцией,
if n<Lmax представлено на рис. 4.
dx=(x2!x1)/3; dy=(y3!y1)/3;
x1n=x1+dx; y1n=y1+dy; x2n=x1+dx+dx; y2n=y1+dy;
x3n=x1+dx+dx; y3n=y1+dy+dy; x4n=x1+dx; y4n=y1+dy+dy;
fill([x1n x2n x3n x4n],[y1n y2n y3n y4n],’g’);
n=n+1;
Quadrate(x1,y1,x1+dx,y1,x1+dx,y1+dy,x1,y1+dy,n,Lmax);
Quadrate(x1+dx,y1,x1+2*dx,y1,x1+2*dx,y1+dy,x1+dx,y1+dy,n,Lmax);
Quadrate(x1+2*dx,y1,x2,y1,x2,y1+dy,x1+2*dx,y1+dy,n,Lmax);
Рис. 4. Кривая Коха пятого порядка.
Quadrate(x1+2*dx,y1+dy,x2,y1+dy,x2,y1+2*dy,x1+2*dx,y1+2*dy,n,Lmax);
Quadrate(x1+2*dx,y1+2*dy,x2,y1+2*dy,x2,y3,x1+2*dx,y3,n,Lmax);
Quadrate(x1+dx,y1+2*dy,x1+2*dx,y1+2*dy,x1+2*dx,y4,x1+dx,y4,n,Lmax); 2. L!системы и терл!графика
Quadrate(x1,y1+2*dy,x1+dx,y1+2*dy,x1+dx,y4,x1,y4,n,Lmax);
Quadrate(x1,y1+dy,x1+dx,y1+dy,x1+dx,y1+2*dy,x1,y1+2*dy,n,Lmax);
Понятие «Lсистема» было введено А. Лидер
end майером в 1968 г. при изучении формальных язы
ков. С их помощью оказывается возможным не
Еще одним приме только строить многие известные самоподобные
ром фрактального фракталы, например, снежинку Коха, ковер Сер
объекта, для построе пинского, кривые Пеано, Гильберта, Серпинско
ния которого оказыва го и др., но и создавать бесконечное разнообра
ется удобным исполь зие новых фракталов, укладывающихся в данную
зовать рекурсивный схему. Понятия «Lсистема» и «Терлграфика» в
алгоритм, является данном разделе излагаются в соответствии с [6].
кривая Коха. Построе Терлграфика (от turtle — черепашка) являет
ние данной кривой на ся подсистемой вывода графического представ
чинается с отрезка K 0 ления фрактального объекта. Основным испол
единичной длины. нителем данной системы является «черепашка»
Удалим из отрезка K 0 (точка), которая перемещается по экрану дискрет
отрезок длины 1 3 и ными шагами, прочерчивая или не прочерчивая
добавим два новых от свой след. «Мгновенное» положение «черепашки»
резка такой же длины, задается тремя параметрами ( x, y, α), где
Рис. 3. Построение как показано на рис. 3. Назовем полученное мно ( x, y ) — координаты «черепашки», α — направ
кривой Коха: a) K 0 , жество K1 . На следующем шаге разделим каждый ление следующего шага (угол, отсчитываемый от
b) K1 , c) K 2 , d) K 3 .
отрезок длины 1 3 на три части длины 1 9 и по положительного направления оси x). Последова
вторим описанную процедуру, заменяя на каждом тельность команд, определяющая направление
шаге среднюю ветвь двумя новыми отрезками. перемещения и действия «черепашки», задается
Обозначим через K n фигуру, получившуюся пос кодовым словом, буквы которого читаются слева
ле nго шага. Можно строго доказать [6], что пос направо. Кодовое слово, представляющее собой

ледовательность кривых {K n }n =1 сходится к пре результат работы Lсистемы, может включать в
дельной кривой K бесконечной длины, фрак себя следующие буквы:
тальная размерность которой равна · F — переместиться на один шаг вперед,
log ( 4 )
прорисовывая след;
d= ≈ 1.2618. · b — переместиться на один шаг вперед, не
log (3) прорисовывая след;
· [ — открыть ветвь;
Ниже приводится листинг рекурсивной фун · ] — закрыть ветвь;
кции, возвращающей изображение кривой Коха. · + — увеличить угол α на величину Θ;
· − — уменьшить угол α на величину Θ;
% Листинг рекурсивной функции, возвращающей изображение · X , Y — вспомогательные переменные.
кривой Коха Размер шага и величина приращения по углу Θ
function z=Koch(N) задаются изначально и остаются неизменными
% функциЯ, возвращающаЯ изображение кривой Коха
для всех перемещений «черепашки».
x1=0; y1=0; % леваЯ точка начального отрезка
x2=1; y2=0; % праваяЯ точка начального отрезка Формально, детерминированная Lсистема
figure(1); axis([0 1 0 1]); set(gca,’XColor’,’w’,’YColor’,’w’); состоит из алфавита, слова инициализации, назы
hold on; ваемого аксиомой или инициатором, и набора
Coord(x1,y1,x2,y2,N);
% вызов рекурсивной функции, прорисовывающей кривую Коха порождающих правил, указывающих как следует
function z=Coord(x1,y1,x2,y2,n) преобразовывать слово при каждой следующей
% рекурсивнаЯ функция, прорисовывающаЯ кривую Коха итерации. Например, Lсистема, соответствующая
if n>0
% вычисление координат концов отрезков на очередном шаге рекурсии снежинке Коха, представленной на рис. 5, задает
dx=(x2!x1)/3; dy=(y2!y1)/3; ся следующим образом:
x1n=x1+dx; y1n=y1+dy; Аксиома: F ++F ++F
Порождающее правило: Newf =F - F + + F - F
x2n=x1+2*dx; y2n=y1+2*dy;
xmid=dx/2!dy*sin(pi/3)+x1n; ymid=dy/2+dx*sin(pi/3)+y1n;
% рекурсиЯ Θ := π 3
Coord(x1,y1,x1n,y1n,n!1); Очевидно, что графическим представлением
аксиомы F + + F + + F является равносторонний
Coord(x1n,y1n,xmid,ymid,n!1);
Coord(xmid,ymid,x2n,y2n,n!1);
Coord(x2n,y2n,x2,y2,n!1); треугольник. «Черепашка» делает один шаг вперед,
else затем угол увеличивается на 2π 3 и «черепашка»
r1=[x1 y1]; r2=[x2 y2]; R=cat(1,r1,r2);
делает еще один шаг вперед, далее угол вновь уве
plot(R(:,1),R(:,2),’Color’,’k’); % построение кривой Коха
end; личивается на 2π 3 и «черепашка» делает еще
один шаг.

74 Exponenta Pro
Мастерская решений

alpha=0;
p=[0;0]; % стартоваЯ точка
p=Coord(p,Lmax,Axiom,Newf,alpha,teta);
% обращение к функции, возвращающей координаты вершин
M=size(p,2); % число вершин снежинки Коха
X=p(1:1,1:M);
% создание вектора, содержащего Х!е координаты вершин снежинки
Y=p(2:2,1:M);
% создание вектора, содержащего Y!е координаты вершин снежинки
figure(1); % инициализациЯ графического окна
plot(X,Y,’Color’,’k’); % построение снежинки Коха
function z=Coord(p,Lmax,Axiom,Newf,alpha,teta)
% функциЯ, возвращающаЯ координаты вершин снежинки Коха
Rule=RuleKoch(Lmax,Axiom,Newf,1,’ ’); % задание L!системы
M=length(Rule);
for i=1:M
Tmp=p(1:2,size(p,2):size(p,2));
if Rule(i)==’F’ % шаг вперед
R=[cos(alpha);sin(alpha)]; R=R/(4^Lmax);
Tmp=Tmp+R; p=cat(2,p,Tmp);
Рис. 5. Снежинка Коха 4го порядка. end
if Rule(i)==’+’ % увеличение угла, задающего направление движениЯ
alpha=alpha+teta;
На первом шаге каждая буква F в словеини end
циаторе заменяется на слово Newf : if Rule(i)==’!’ % уменьшение угла, задающего направление движениЯ
alpha=alpha!teta;
F − F + +F − F + +F − F + + end
end
F − F + +F − F + +F − F. z=p;
Повторяя этот процесс, на втором шаге полу
чим: Однако при пост
F − F + +F − F − F − F + +F − F + + роении других фрак
талов, например, дра
F − F + +F − F − F − F + +F − F + + кона ХартераХайтвея
F − F + +F − F − F − F + +F − F + + (рис. 6), на некоторых
шагах возникает необ
F − F + +F − F − F − F + +F − F + +
ходимость в измене
F −F ++ F −F −F −F ++ F −F нии направления чте
и т. д. ния правила (не слева
В пакете MATLAB наиболее просто реализо направо, а справа на
вать Lсистему, используя рекурсивную функцию. лево). Для решения
Ниже приведен пример рекурсивной функции, данной проблемы вво
возвращающей снежинку Коха, представленную дят две дополнитель
на рис. 5. ные команды, обозна
чаемые X и Y , кото
рые используются для
function z=RuleKoch(Lmax,Axiom,Newf,n,tmp); Рис. 6. Дракон Хат
% функциЯ, возвращающаЯ L!систему
создания соответствующей Lсистемы, но игнори
тераХайтвея 12го по
% длЯ снежинки Коха руются «черепашкой» при перемещении. При ис
рядка.
% Входные параметры: пользовании этих команд порождающее прави
% Lmax — порядок снежинки
ло для дракона имеет вид:
% Axiom — строка, содержащаЯ аксиому
% Newf — строка, содержащаЯ порождающее правило Аксиома: FX
% tmp — входная L!система Порождающие правила:
while n<=Lmax
if n==1
Newf = FX
tmp=Аxiom; n=n+1; Newx = X + YF +
else Newy = − FX − Y
tmp=strrep(tmp,’F’,Newf); В соответствии с данными правилами Lсис
% замена всех букв F на порождающее правило
n=n+1; тема имеет следующий вид:
tmp=RuleKoch(Lmax,Axiom,Newf,n,tmp); 1 шаг: FX + YF +
% рекурсиЯ 2 шаг: FX + YF + + − FX − YF +
end
end 3 шаг:
z=tmp; FX + YF + + − FX − YF + +
− FX + YF + − − FX − YF +
Для вывода изображения снежинки Коха мож
но использовать следующую mфункцию, 4 шаг:
реализующую описанный выше алгоритм терл FX + YF + + − FX - YF + +
№3 (3) / 2003

графики:
− FX + YF + − − FX − YF + +
function [X,Y]=Snowflake (Lmax) − FX + YF + + − FX − YF +
% функциЯ, возвращающаЯ изображение
% снежинки Коха
− − FX + YF + − − FX − YF +
% Lmax — порядок снежинки
% порождающие правила Ниже приводится листинг файла Dracon.m,
Axiom=’F++F++F’; содержащего описание функции, возвращающей
Newf=’F!F++F!F’; изображение дракона, в соответствии с описан
teta=pi/3;
ной выше Lсистемой.

Математика в приложениях 75
Мастерская решений

function [X,Y]=Dracon(Lmax)
Или кривую Госпера (рис. 8):
% функциЯ, возвращающаЯ изображение дракона Аксиома: XF
% Lmax — порЯдок дракона Порождающие правила:
Newx = X + YF + +YF − FX − − FXFX − YF +
% порождающие правила
Axiom=’FX’;
Newf=’F’; Newy = − FX + YFYF + +YF + FX − − FX − Y д
Newx=’X+YF+’; α = 0, θ = π 3
Newy=’!FX!Y’;
teta=pi/2; alpha=0; p=[0;0];
p=Coord(p,Lmax,Axiom,Newf,Newx,Newy,alpha,teta);
% обращение к функции, возвращающей координаты угловых точек дракона
M=size(p,2);
X=p(1:1,1:M);
% создание вектора, содержащего Х!е координаты угловых точек дракона
Y=p(2:2,1:M);
% создание вектора, содержащего Y!е координаты угловых точек дракона
figure(1); plot(X,Y,’Color’,’b’);
set(gca,’xtick’,[],’ytick’,[]);
set(gca,’XColor’,’w’,’YColor’,’w’);
function z=Coord(p,Lmax,Axiom,Newf,Newx,Newy,alpha,teta)
% функциЯ, возвращающаЯ координаты угловых точек дракона
Rule=DraconString(Lmax,Axiom,Newf,Newx,Newy,1,’’); % задание L!системы
M=length(Rule);
for i=1:M
Tmp=p(1:2,size(p,2):size(p,2));
if Rule(i)==’F’ % шаг вперед
R=[cos(alpha);sin(alpha)]; R=R/(2^Lmax);
Tmp=Tmp+R; p=cat(2,p,Tmp);
Рис. 8. Кривая Госпера 3го порядка.
end
if Rule(i)==’+’ % увеличение угла, задающего направление движениЯ
alpha=alpha+teta; Или кривую Серпинского (рис. 9):
end Аксиома: F + XF + F + XF
if Rule(i)==’!’ % уменьшение угла, задающего направление движениЯ
alpha=alpha!teta;
Порождающие правила:
end Newf = F
end Newx = XF − F + F − XF + F + XF − F + F − X
z=p;
function z=DraconString(Lmax,Axiom,Newf,Newx,Newy,n,tmp); Newy = ''
% функциЯ, возвращающаЯ L!систему α = π 4, θ = π 2.
a=1;
if n<=Lmax
if n==1 tmp=Axiom; end
M=length(tmp); tmp1=’’;
for i=1:M
if tmp(i)==‘F’ tmp1=strcat(tmp1,Newf); end
if tmp(i)==’X’ tmp1=strcat(tmp1,Newx); end
if tmp(i)==’Y’ tmp1=strcat(tmp1,Newy); end
if not(tmp(i)==’F’) &not(tmp(i)==’X’) &not(tmp(i)==’Y’)
tmp1=strcat(tmp1,tmp(i)); end
end
end
tmp=tmp1; n=n+1; tmp=DraconString(Lmax,Axiom,Newf,Newx,Newy,n,tmp);
end;
z=tmp;

Заменяя в описанной программе порождаю


щие правила, можно получить и другие фракталь
ные кривые, например, кривую Гильберта (рис. 7):
Аксиома: X Рис. 9. Кривая Серпинского 3го порядка.

Порождающие правила:
Newf = F В заключение остановимся на операции ветв
Newx = -YF + XFX + FY - ления. Когда в Lсистеме встречается символ [
Newy = + XF - YFY - FX + (открыть ветвь), необходимо запомнить коорди
α = 0, θ = π 2 наты точки нахождения «черепашки» и направле
ние ее движения, т. е. переменные ( x, y , α). К со
храненным переменным следует вернуться пос
ле обнаружения символа ] (закрыть ветвь). Для
хранения триплетов ( x, y , α ) в [6] предлагается
использовать стек:

 x1 y1 α1 
x y α 
 2 2 2
,
! ! ! 
 
 xn yn α n 

в конец которого записываются новые данные.


При закрытии ветви переменным ( x, y , α ) при
сваиваются значения, считанные из конца стека,
затем эти значения из стека удаляются. В пакете
Рис. 7. Кривая Гильберта 4го порядка.

76 Exponenta Pro
Мастерская решений

MATLAB оказывается более удобным использовать if Rule(i)==’+’ % увеличение угла, задающего направление движениЯ
матрицу с переменным числом столбцов: alpha=alpha+teta;
end
 x1 x2 … xn  if Rule(i)==’!’ % уменьшение угла, задающего направление движениЯ
  alpha=alpha!teta;
M =  y1 y2 … yn  , end
α1 α2 … α n  if Rule(i)==’[’; % открыть ветвь
if L==0 St=[x0;y0;alpha]; L=1; else St=cat(2,St,[x0;y0;alpha]);
end
причем координаты каждой новой точки ветвле
end
ния добавляются в новый столбец матрицы M . if Rule(i)==’]’ % закрыть ветвь
После закрытия ветви переменным ( x, y , α ) M=size(St,2); R=St(1:3,M:M);
x0=R(1); y0=R(2);
присваиваются значения, считанные из последне
alpha=R(3); St=St(1:3,1:M!1);
го столбца матрицы M , затем этот столбец уда end
ляется. end
Таким образом, ветвление задается двумя сим hold off
function z=FlowerString(Lmax,Axiom,Newf,n,tmp)
волами:
x
% функциЯ, возвращающая L!систему
while n<=Lmax
[ — открыть ветвь: добавить вектор
 y как но if n==1
  tmp=Axiom; n=n+1; else
α  tmp=strrep(tmp,’F’,Newf);
вый столбец матрицы M , n=n+1; tmp=FlowerString(Lmax,Axiom,Newf,n,tmp); % рекурсиЯ
] — закрыть ветвь: присвоить переменным end
( x, y , α) значения координат вектора, являюще end
z=tmp;
гося последним столбцом матрицы M .
Пример фрактала, построенного с помощью
Заменяя в описанной программе порождаю
операции ветвления, представлен на рис. 10. Ниже
щие правила, можно получить и другие ветвя
приводится листинг файла Flower.m, содержаще
щиеся фрактальные объекты, например, куст
го описание функции, возвращающей изображе
(рис. 11):
ние цветка, в соответствии с описанной выше
Аксиома: F
Lсистемой.
Порождающие правила:
Newf = − F + F + [+ F − F −] − [− F + F + F ]
α = π 2, θ = π 8

Рис. 11. Куст 3го порядка.

Рис. 10. Цветок 3го порядка.


Или снежинку (рис. 12):
Аксиома: [ F ] + [ F ] + [ F ] + [ F ] + [ F ] + [ F ]
% Листинг файла Flower.m
Порождающие правила:
function [X,Y]=Flower(Lmax)
% функциЯ, возвращающаЯ изображение цветка
Newf = F [+ + F ][− FF ]FF [+ F ][− F ]FF
% Lmax ! порЯдок цветка α = 0, θ = π 3
% порождающие правила
Axiom=’F[+F+F][!F!F][++F][—F]F’;
Newf=’FF[++F][+F][F][!F][—F]’;
teta=pi/16;
alpha=pi/2;
p=[0;0]; % начальнаЯ точка
Coord(p,Lmax,Axiom,Newf,alpha,teta);
% обращение к функции, возвращающей
% изображение цветка
№3 (3) / 2003

function z=Coord(p,Lmax,Axiom,Newf,alpha,teta)
% функциЯ, возвращающаЯ изображение цветка
Rule=FlowerString(Lmax,Axiom,Newf,1,’’);
% задание L!системы
figure(1); hold on;
M=length(Rule);L=0; x0=p(1);y0=p(2);
for i=1:M
if Rule(i)==’F’ % шаг вперед
x1=x0+cos(alpha); y1=y0+sin(alpha);
X=[x0,x1]; Y=[y0,y1]; x0=x1; y0=y1; Рис. 12. Снежинка 3го порядка.
plot(X,Y,’Color’,’k’); end

Математика в приложениях 77
Мастерская решений

3. Системы итерированных функций 2. Привязка алгоритма к размеру графическо


Напомним, следуя [6], что в общем случае для го окна и, как следствие, большой объем вычис
построения системы итерированных функций лений (число операций прямо пропорционально
2
(СИФ) в рассмотрение вводится совокупность числу точек m и числу итераций).
сжимающих отображений: 3. Возникновение аварийных остановов про
T1 , с коэффициентом сжатия s1 , граммы с сообщением об ошибке «Индекс вышел
за пределы» при попадании точки за пределы окна
T2 , с коэффициентом сжатия s2 , m × m.
! Рассмотрим модификацию алгоритма ДСИФ,
Tm , с коэффициентом сжатия sm , позволяющую реализовать его в пакете MATLAB,
действующих в R . Эти m отображений исполь
n
на примере уже рассмотренного в первом разде
зуются для построения одного сжимающего ото ле ковра Серпинского. Вопервых, заметим, что,
бражения T в пространстве Ω всех непустых как видно из рис. 13, для получения изображения
компактов из R . Преобразование Хатчинсона
n
ковра Серпинского S1 необходимо на каждую
(0) (0)
T : Ω → Ω определяется следующим образом: точку ( xi , yi ), находящуюся внутри исходно
го треугольника S0 , раздельно подействовать
T ( E ) = T1 ( E ) ∪T2 ( E ) ∪…∪ Tm ( E ) , каждым из аффинных преобразований T1 , T2 ,
E ∈ Ω. T3 :
Данное преобразование ставит в соответствие  x (0 )   x (1)   x (0)   x (1) 
«точкам» из Ω , под которыми здесь понимаются T1  i 0  =  i11  , T2  i 0  =  i 21  ,
( ) ()
компактные множества, также «точки» из Ω.  yi   yi1   yi( )   yi(2) 
Системой итерированных функций называет
ся совокупность приведенных выше отображе  x (0 )   x (1) 
T3  i 0  =  i 31  .
 yi( )   yi(3) 
ний вместе с итерационной схемой
E1 = T ( E0 ) , E2 = T ( E1 ) , ...,

En = T ( En −1 ) , ...,
( E0 — произвольное компактное множество).
Существование предельного множества E
( E = lim En ) системы итерированных функций
n →∞
в смысле сходимости в метрике Хаусфдорфа:
H ( E , F ) = min {ε > 0 : E ⊂ F + ε & F ⊂ E + ε},
где E и F — непустые компактные подмноже
ства в R , доказывает соответствующая тео
n Рис. 13. Аффинные преобразования для ковра Сер
пинского.
рема [6].
Например, СИФ при построении ковра Сер Таким образом, каждая точка ( xi , yi ) на пер
(0) (0)
пинского (рис. 1) задается тремя аффинными вом шаге итерации порождает три новые точки
преобразованиями, которые в матричной форме
( xi(0) (0) (0) (0) (0) (0)
1 , yi1 ), ( xi 2 , yi 2 ), ( xi 3 , yi 3 ).
На каждую из
имеют следующий вид: этих точек на втором шаге итерации вновь следу
  x   1 2 0   x1  0  ет подействовать аффинными преобразованиями
T1   1   =     +  , T1 , T2 , T3 . В результате каждая из трех точек ков
  x2    0 1 2   x2   0  ра S1 вновь породит три точки ковра S 2 и т. д.
Описанный процесс удобно изобразить в виде
  x   1 2 0   x1  1 2 
T2   1   =     +  ,
графа (рис. 14). Из рис. 14 видно, что на втором
  x2    0 1 2   x2   0  шаге итерации существует 9 ( 3n = 9, где n = 2 )
правил, по которым каждой начальной точке
  x   1 2 0   x1   1 4  (0) (0)
( xi , yi ) ставится в соответствие 9 точек ковра
T2   1   =   + . Серпинского S1 . Соответственно, на третьем
  x2    0 1 2   x2   3 4 
шаге итерации таких правил будет 27 = 33 :
Различают два подхода к реализации СИФ: де
терминированный (ДСИФ) (в котором аффинные T1T1T1 T1T2T1 T1T3T1 T1T1T2
преобразования применяются последовательно к T1T2T2 T1T3T2 T1T1T3 T1T2T3 T1T3T3
каждой точке начальной конфигурации) и рандо
мизированный (РСИФ) (в котором случайно вы T2T1T1 T2T2T1 T2T3T1 T2T1T2
бираемые аффинные преобразования применя T2T2T2 T2T3T2 T2T1T3 T2T2T3 T2T3T3
ют к единственной начальной точке).
T3T1T1 T3T2T1 T3T3T1 T3T1T2
Известный детерминированный алгоритм
вычисления СИФ, ориентированный на реализа T3T2T2 T3T3T2 T3T1T3 T3T2T3 T3T3T3
цию в виде компьютерной программы на каком
либо языке программирования, допускающем
компиляцию, описан в [6]. К недостаткам данного
алгоритма можно отнести следующее.
1. Зависимость качества изображения от раз
мера графического окна (удовлетворительное Рис. 14. Граф аффинных преобразований ковра
качество изображения достигается для m ≥ 256 ). Серпинского.

78 Exponenta Pro
Мастерская решений

Таким образом, для построения ковра Серпин водится листинг файла SerpDSIF.m, содержащего
ского nго уровня с помощью ДСИФ необходимо описание соответствующей функции, возвраща
научиться генерировать 3n правил, по которым ющей изображение ковра Серпинского.
(0) (0)
каждой точке ( x , y ) ставится в соответствие
i i
% Листинг файла SerpDSIF.m
3n точек ( xij(0) , y ), j = 1, 2, … , 3n. Введем обо
(0)
ij function z=SerpDSIF(Niter,NPoints)
значения: T1 ⇔ 0, T2 ⇔ 1, T3 ⇔ 2. В выбран % функциЯ, возвращающаЯ изображение ковра Серпинского
ных обозначениях правила преобразования на % Niter ! порЯдок ковра
% NPoints ! число точек начальной конфигурации
третьем шаге итерации имеют вид: x=zeros(NPoints,1); y=zeros(NPoints,1);
% задание координат точек начальной конфигурации
000 010 020 001 011 021 002 012 022 x1=0; y1=0; x2=1; y2=0; x3=1/2; y3=sin(pi/3);
100 110 120 101 111 121 102 112 122 j=1;
while j<=NPoints
200 210 220 201 211 221 202 212 222 tmpx=rand(1,1);
tmpy=sqrt(3)/2*rand(1,1);
Анализ таблицы закодированных правил пре if (!sqrt(3)*tmpx+tmpy<=0)&(sqrt(3)*tmpx+tmpy!sqrt(3)<=0)
образований показывает, что названия правил x(j)=tmpx;
y(j)=tmpy;
являются множеством натуральных чисел
j=j+1;
1, 2, …, 27, записанных в троичной системе счис end;
ления. При этом для представления кода каждого end
правила используется число цифр, совпадающее % Формирование массива, содержащего правила итерации
for i=1:3^Niter
с порядком ковра n. Соответственно, для случая Tmp(i)=system3(i!1);
n = 4 имеем множество, состоящее из 3 = 81
4
% перевод числа из десЯтичной в троичную систему счислениЯ
правила, названия которых есть множество чисел end
n=1; s=’0’;
1, 2, …, 81, записанных в троичной системе счис while n<Niter
ления. При этом для представления каждого чис s=strcat(s,’0’); n=n+1;
ла используются четыре цифры. Очевидно, что end
for i=1:3^Niter
для хранения названия правил наиболее удобно tmp=num2str(Tmp(i)); tmp1=s;
использовать массив строковых переменных дли for m=1:length(tmp)
4
ной n, число элементов которого равно 3 . tmp1(Niter!m+1)=tmp(length(tmp)!m+1);
end
Таким образом, для построения ковра Серпин
Cod(i,1:Niter)=tmp1;
ского в пакете MATLAB с помощью ДСИФ можно end
использовать следующий алгоритм. a1=[0;0]; a2=[1/2;0]; a3=[1/4;sqrt(3)/4]; A=[1/2,0;0,1/2];
1. Задать порядок ковра Серпинского n. % задание аффинных преобразований
figure(1); hold on; set(gca,’xtick’,[],’ytick’,[]);
2. Задать число точек начальной конфигура set(gca,’XColor’,’w’,’YColor’,’w’); fill([x1 x2 x3],[y1 y2 y3],’w’);
ции m. GosperDraw(Niter,NPoints,x,y,A,a1,a2,a3,Cod);
3. Задать координаты i точек (i = 1, 2, … , m), % построение ковра Серпинского
заполняющих начальное множество. function z=GosperDraw(Niter,NPoints,x,y,A,a1,a2,a3,Cod)
n
4. Перевести каждое из чисел 1, 2, … , 3 в тро % функциЯ, создающаЯ изображение ковра Серпинского
ичную систему счисления. for m=1:3^Niter
n
5. Сформировать массив, состоящий из 3
X=x; Y=y; Rule=Cod(m,:);
for i=1:Niter
строк, длиной n символов. tmp=Rule(Niter+1!i);
6. Задать аффинные преобразования. if tmp==’0’
[X Y]=T(NPoints,X,Y,A,a1); % первое аффинное преобразование
7. Для iой точки начальной конфигурации
end
последовательно применить каждое из if tmp==’1’
j = 1, 2, … , 3n итерационных правил и отобра [X Y]=T(NPoints,X,Y,A,a2); % второе аффинное преобразование
end
зить в графическом окне полученные образы каж
if tmp==’2’
дой начальной точки. [X Y]=T(NPoints,X,Y,A,a3); % третье аффинное преобразование
Пример ковра Серпинского, построенного с end
помощью описанной выше модификации алго end
plot(X,Y,’.’,’MarkerSize’,1,’MarkerEdgeColor’,’b’);
ритма ДСИФ, представлен на рис. 15. Ниже при % отображение результатов итерации
end

function [X,Y]=T(NPoints,x,y,A,a)
% ФункциЯ, возвращающаЯ результат аффинного преобразования
X=zeros(NPoints,1); Y=zeros(NPoints,1);
for i=1:NPoints
R=[x(i);y(i)]; R=A*R+a; X(i)=R(1); Y(i)=R(2);
end

function z=system3(D);
% функциЯ, возвращающаЯ значение целого числа
% в троичной системе счислениЯ
% D ! число в десЯтичной системе счислениЯ
№3 (3) / 2003

n=1;
while D>=3^n n=n+1; end
if n>1
a=floor(D/3^(n!1))*10^(n!1); b=mod(D,3^(n!1));
if b>=3
b=system3(b); % рекурсия
Рис. 15. Ковер Серпинского 4го порядка, получен end
ный с помощью модифицированного алгоритма z=a+b;
ДСИФ; начальная конфигурация S 0 — 1000 точек, слу else
z=D;
чайным образом размещенных в равностороннем тре
end
угольнике.

Математика в приложениях 79
Мастерская решений
Пример фрактала, называемого лист, постро
% Листинг файла Cristal.m
енного с использованием ДСИФ, и листинг соот
function z=Cristal(Niter,NTrial)
ветствующей программы представлен в Приложе % функциЯ, возвращающаЯ изображение кристалла
нии 1. % Niter ! порЯдок кристалла
В отличие от ДСИФ в рандомизированном ал % NTrial ! число испытаний
Na=4; % число аффинных преобразований
горитме начальное множество S0 состоит из од % Создание массива, содержащего набор
ной точки ( x0 , y0 ), а правило, по которому точ % правил длЯ аффинных преобразований
ке ставится в соответствие точка ( xi , yi ), где i — k=1;
for m=1:Niter
номер правила, выбирается случайным образом for i=1:4^m Tmp(k)=system3(i!1,Na); k=k+1;
из набора, содержащего все возможные правила end
аффинных преобразований. Например, приме Q(1)=Na;
for m=2:Niter Q(m)=Q(m!1)+Na^m; end
нительно к ковру Серпинского это означает, что
n=1; s=’0’; M=1;
при построении ковра 2го порядка преобразо while n<=length(Tmp)
вание должно случайным образом выбираться из m=1;
следующего множества преобразований: while n>Q(m) m=m+1; end
if m==1
{T1 , T2 , T3 , T1T1 , T1T2 , T1T3 , T2T3 , T3T1 , T3T2 , T3T3 }, else
S(n,1:1)=s;

n S(n,1:1)=s;
число элементов N которого равно N = ∑ m k . for i=2:m S(n,1:i)=strcat(S(n,:),s); end
k =1 end
Таким образом, для построения ковра Сер n=n+1;
end
пинского в пакете MATLAB с помощью РСИФ мож for i=1:k!1 tmp=num2str(Tmp(i)); m=1;
но использовать следующий алгоритм. while i>Q(m) m=m+1; end
1. Задать порядок ковра Серпинского n. tmp1(1:m)=S(i,1:m);
for m=1:length(tmp)
2. Задать число испытаний NTrial . tmp1(length(tmp1)!...
3. Задать число аффинных преобразований m+1:length(tmp1)!m+1)=...
m = 3. tmp(length(tmp)!m+1:length(tmp)!m+1);
end
4. Сформировать массив, содержащий набор Cod(i,1:length(tmp1))=tmp1;
правил для аффинных преобразований. end
5. Задать координаты начальной точки x=0; y=0; % координаты начальной точки
( x0 , y0 ). % задание аффинных преобразований
A1=[0.2550,0.0000;0.0000,0.2550];
n
6. Перевести каждое из чисел 1, 2, … , 3 в тро A2=[0.2550,0.0000;0.0000,0.2550];
ичную систему счисления. A3=[0.2550,0.0000;0.0000,0.2550];
7. Задать аффинные преобразования. 4=[0.3700,!0.6420;0.6420,0.3700];
a1=[0.3726;0.6714]; a2=[0.1146;0.2232];
8. Для заданного числа испытаний последова a3=[0.6306;0.2232]; a4=[0.6356;!0.0061];
тельно, начиная с начальной точки, в соответ figure(1); hold on;
ствии с правилами аффинных преобразований, set(gca,’xtick’,[],’ytick’,[]);
set(gca,’XColor’,’w’,’YColor’,’w’);
выбираемых случайным образом, вычислить точ DrawFractal(Niter,NTrial,x,y,A1,A2,A3,A4,...
ки итерационной последовательности. a1,a2,a3,a4,Cod); % визуализациЯ фрактала
9. Отобразить вычисленное множество точек function z=DrawFractal(Niter,NTrial,x,y,...
A1,A2,A3,A4,a1,a2,a3,a4,Cod)
в графическом окне. % функциЯ, возвращающаЯ изображение фрактала
В общем случае для фракталов nго порядка, X1=zeros(NTrial,1); Y1=zeros(NTrial,1);
изображение которых создается с помощью m X=x; Y=y;
for m=1:NTrial
аффинных преобразований, как и при использо
Np=1+round((size(Cod,1)!1)*rand(1,1));
вании ДСИФ, необходимо переводить числа % выбор номера преобразования
1, 2, … , m n в mичную систему счисления. Rule=Cod(Np,:);
for i=1:length(Rule)
Пример кристалла, построенного с помощью
tmp=Rule(length(Rule)+1!i);
описанного выше алгоритма РСИФ, представлен if tmp==’0’ [X Y]=T(X,Y,A1,a1); end
на рис. l6. Ниже приводится листинг файла if tmp==’1’ [X Y]=T(X,Y,A2,a2); end
Cristal.m, содержащего описание соответствую if tmp==’2’ [X Y]=T(X,Y,A3,a3); end
if tmp==’3’ [X Y]=T(X,Y,A4,a4); end
щей функции. end
X1(m)=X; Y1(m)=Y;
end
plot(X1,Y1,’.’,’MarkerSize’,1,...
’MarkerEdgeColor’,’b’);
function [X,Y]=T(x,y,A,a)
% ФункциЯ, возвращающаЯ результат
% аффинного преобразованиЯ
R=[x;y]; R=A*R+a;
X=R(1); Y=R(2);
function z=system3(D,m);
% функциЯ, возвращающаЯ значение
% числа в четверичной системе координат
Автор: n=1;
Поршнев Сергей Вла while D>=m^n n=n+1; end
димирович, профессор, if n>1
доктор технических наук, a=floor(D/m^(n!1))*10^(n!1);
заведующий кафедрой b=mod(D,m^(n!1));
информатики и вычисли if b>=m b=system3(b,m); end
тельной техники; Нижне z=a+b;
тагильский государ else
ственный педагогичес z=D;
кий институт, г. Нижний Рис. 16. Кристалл 4го порядка, полученный с помо end
Тагил щью алгоритма РСИФ после 500000 испытаний.

80 Exponenta Pro
Мастерская решений

В Приложении 2 приведено изображение


фрактала, называемого веткой папоротника, и
листинг соответствующей программы.

Литература
1. Mandelbrot B. B. Les object fractals: forme, hasard et
dimantion.— Paris: Flamarion, 1975.
2. Каток А. Б., Хасселблат Б. Введение в современную те
орию динамических систем.— М.: Факториал, 1999.
3. Лихтенберг А., Либерман М. Регулярная и стохасти
ческая динамика.— М.: МеркурийПРЕСС, 2000.
4. Шустер Г. Детерминированный хаос.— М.: Мир, 1988.
5. Кренкель Э. Т. Сжатие сигналов с применением тео
рии фракталов.— М.: МТУСИ, 1996.
6. Кроновер Р. М. Фракталы и хаос в динамических сис
темах. Основы теории.— М.: Постмаркер, 2000. Рис. 17. Лист, построенный с помо Рис. 18. Ветка папоротника, построен
щью ДСИФ; число аффинных преобра ная с помощью ДСИФ; число аффинных
зований m = 2, число итераций n = 9, преобразований m = 4, число итераций
число начальных точек 2000. n = 5, число начальных точек 1000.

Приложение 1. Листинг файла, Приложение 2. Листинг файла, содержащего описание


содержащего описание функции, функции, возвращающей изображение ветки папоротника
возвращающей изображение листа (рис. 18)
(рис. 17) function z=Paporotnic(Niter,NPoints)
function z=Maple(Niter,NPoints) x1=0; y1=0; x2=1; y2=0; x3=1/2; y3=sin(pi/3);
x1=0; y1=0; x=zeros(NPoints,1); y=zeros(NPoints,1);
x2=1; y2=0; j=1;
x3=1/2; y3=sin(pi/3); while j<=NPoints
x=zeros(NPoints,1); y=zeros(NPoints,1); tmpx=rand(1,1); tmpy=sqrt(3)/2*rand(1,1);
j=1; if (!sqrt(3)*tmpx+tmpy<=0)&(sqrt(3)*tmpx+tmpy!sqrt(3)<=0)...
while j<=NPoints \hspace{12mm}x(j)=tmpx; y(j)=tmpy; j=j+1; end;
tmpx=rand(1,1); end;
tmpy=sqrt(3)/2*rand(1,1); for i=1:4^Niter Tmp(i)=system2(i!1,4); end;
if (!sqrt(3)*tmpx+tmpy<=0)&(sqrt(3)*... n=1; s=’0’;
tmpx+tmpy!sqrt(3)<=0) while n<Niter s=strcat(s,’0’); n=n+1; end;
x(j)=tmpx; y(j)=tmpy; j=j+1; for i=1:4^Niter
end tmp=num2str(Tmp(i)); tmp1=s;
end for m=1:length(tmp)
for i=1:2^Niter Tmp(i)=system2(i!1,2); end tmp1(Niter!m+1)=tmp(length(tmp)!m+1);
n=1; s=’0’; end;
while n<Niter s=strcat(s,’0’); n=n+1; end Cod(i,1:Niter)=tmp1;
for i=1:2^Niter end;
tmp=num2str(Tmp(i)); tmp1=s; A1=[0.7000,0;0,0.7000]; A2=[0.1000,!0.4330;0.1732,0.2500];
for m=1:length(tmp) tmp1(Niter!m+1)=... A3=[0.1000,0.4330;!0.1732,0.2500]; A4=[0,0;0,0.3000];
tmp(length(tmp)!m+1); end a1=[0.1496;0.2962]; a2=[0.4478;0.0014];
Cod(i,1:Niter)=tmp1; a3=[0.4450;0.1559]; a4=[0.4987;0.0070];
end figure(1); hold on; set(gca,’xtick’,[],’ytick’,[]);
A1=[0.4,!0.3733;0.0600,0.6000]; set(gca,’XColor’,’w’,’YColor’,’w’);
A2=[!0.8000,!0.1867;0.1371,0.8000]; FractalDraw(Niter,NPoints,x,y,A1,A2,A3,A4,a1,a2,a3,a4,Cod);
a1=[0.3533;0.000]; a2=[1.1000;0.1000]; function z=Simplex(Niter,NPoints,x,y,A1,A2,A3,A4,a1,a2,a3,a4,Cod)
figure(1); hold on; for m=1:4^Niter
set(gca,’xtick’,[],’ytick’,[]); X=x; Y=y; Rule=Cod(m,:);
set(gca,’XColor’,’w’,’YColor’,’w’); for i=1:Niter
FractalDraw(Niter,NPoints,x,y,A1,A2,... tmp=Rule(Niter+1!i);
a1,a2,Cod); if tmp==’0’ [X Y]=T(NPoints,X,Y,A1,a1); end;
function z=FractalDraw(Niter,NPoints,x,y,... if tmp==’1’ [X Y]=T(NPoints,X,Y,A2,a2); end;
A1,A2,a1,a2,Cod) if tmp==’2’ [X Y]=T(NPoints,X,Y,A3,a3); end;
for m=1:2^Niter if tmp==’3’ [X Y]=T(NPoints,X,Y,A4,a4); end;
X=x; Y=y; end;
Rule=Cod(m,:); plot(X,Y,’.’,’MarkerSize’,1,’MarkerEdgeColor’,’k’)
for i=1:Niter end;
tmp=Rule(Niter+1!i); function [X,Y]=T(NPoints,x,y,A,a)
if tmp==’0’ [X Y]=T(NPoints,X,Y,A1,a1); end X=zeros(NPoints,1); Y=zeros(NPoints,1);
if tmp==’1’ [X Y]=T(NPoints,X,Y,A2,a2); end for i=1:NPoints R=[x(i);y(i)]; R=A*R+a; X(i)=R(1); Y(i)=R(2); end;
end function z=FractalDraw(Niter,NPoints,x,y,A1,A2,a1,a2,Cod)
plot(X,Y,’.’,’MarkerSize’,1,... for m=1:2^ Niter
’MarkerEdgeColor’,’b’); X=x; Y=y; Rule=Cod(m,:);
end for i=1:Niter tmp=Rule(Niter+1!i);
function [X,Y]=T(NPoints,x,y,A,a) if tmp==’0’ [X Y]=T(NPoints,X,Y,A1,a1); end;
X=zeros(NPoints,1); Y=zeros(NPoints,1); if tmp==’1’ [X Y]=T(NPoints,X,Y,A2,a2); end;
for i=1:NPoints R=[x(i);y(i)]; R=A*R+a; end;
X(i)=R(1); Y(i)=R(2); end plot(X,Y,’.’,’MarkerSize’,1,’MarkerEdgeColor’,’k’);
function z=system2(D,m); end;
№3 (3) / 2003

n=1; function [X,Y]=T(NPoints,x,y,A,a)


while D>=m^n n=n+1; end X=zeros(NPoints,1); Y=zeros(NPoints,1);
if n>1 for i=1:NPoints R=[x(i);y(i)]; R=A*R+a; X(i)=R(1); Y(i)=R(2); end;
a=floor(D/m^(n!1))*10^(n!1); function z=system2(D,m);
b=mod(D,m^(n!1)); n=1;
if b>=m b=system2(b,m); while D>=m^n n=n+1; end;
end if n>1
z=a+b; a=floor(D/m^(n!1))*10^(n!1); b=mod(D,m^(n!1));
else if b>=m b=system2(b,m); end;
z=D; z=a+b;
end else z=D; end;

Математика в приложениях 81
Мастерская решений

Новости образовательного математического сайта

Новые участники портала Exponenta.ru ких задач основным методом их решения является имита
http://lern.exponenta.ru. Сайт, разработанный на кафед ционное моделирование, т. е. моделирование, которое стро
ре экономической кибернетики Казанского государствен ится строго целенаправленно и для которого характерно
ного университета в поддержку препода адекватное отображение исследуемого объекта. Примене
вания курсов «Теория вероятностей и ма ние инновационных информационных технологий не толь
тематическая статистика», «Социально ко упрощает решение экономических задач, но и увеличи
экономическое прогнозирование» и др. вает точность их решения. Я считаю, что
На сайте представлены обучающие систе система Mathcad позволяет полностью до
мы по теории вероятностей и математи стичь поставленных целей в математичес
ческой статистике, а также по решению ком моделировании и решении конкрет
И. Краснов ных задач».
статистических задач с помощью матема
тического программного обеспечения — Победителем конкурса методических
пакетов Mathematica и Statistica. разработок стал Поршнев С. В. — профес
http://lestex.exponenta.ru. На сайте представлены сор, доктор технических наук, заведующий
учебные материалы, программы, тексты лекций и прак кафедрой информатики и вычислитель
тические задания для студентов вузов, изучающих кур С. В. Поршнев ной техники Нижнетагильского государ
сы «Информатика» и «Системное программное обеспе ственного педагогического института.
чение». Автор сайта — Баранова Елена Константиновна, до Поршнев С. В. давно сотрудничает с сайтом Exponenta.ru. Его
цент кафедры прикладной математики Московского госу вклад в раздел «Методические разработки» — 13 работ по ма
дарственного университета леса. тематическому моделированию в физике и решению при
кладных задач. В своих работах автор использует возмож
Победители весенних конкурсов сайта Exponenta.ru ности мощных математических систем — Maple, MATLAB,
В весеннем семестре 2003 года на сайте были проведе Mathcad.
ны очередные конкурсы методических разработок и студен М. В. Бессонова
ческих работ.
Среди студенческих работ лучшей была признана рабо
та «Формирование следящей системы управления темпом VII конкурc для студентов
производства по локальному критерию», выполненная с по и преподавателей
мощью системы Mathcad. Автор работы — Краснов Иван, вы
пускник факультета прикладной математики и кибернети
на Exponenta.ru
ки Томского государственного университета. Во время обу Даты подачи работ на конкурс:
чения занимался применением теории автоматического уп 1 сентября — 30 декабря 2003 г.
равления к техническим системам, а в дипломе доказал и Подведение итогов: январь 2004 г.
продемонстрировал возможность управления экономичес
Главный приз — лицензионный
кими системами. Выбор системы Mathcad Иван объясняет
так: «В настоящее время в связи с усложнением экономичес
математический пакет!

Новые книги Черняк А., Мельников О., Новиков В., Кузнецов А.


Математика для экономистов на базе Mathcad.
СПб.: БХВПетербург, 2003

Леоненков А. Традиционные методики преподавания высшей


Нечеткое моделирование математики в вузах претерпевают существенные из
в среде MATLAB и fuzzyTECH. менения в связи с появлением мощных математичес
СПб.: БХВПетербург, 2003 ких компьютерных пакетов — необходимых компо
нентов в постижении математики на современном
В книге рассматриваются основы нечеткого уровне. Они не способны полностью исключить тра
моделирования — нового направления примене диционные методы в преподавании математики, од
ния наукоемких технологий для решения практи нако могут сделать это преподавание намного эффек
ческих задач. Подробно описываются базовые по тивней и доступней. Методика, описанная в книге,
нятия теории нечетких множеств и нечеткой ло представляет собой синтез традиционных принци
гики, необходимые для построения нечетких моделей сис пов преподавания математики, соответствующих государ
тем в бизнесе, технике и политике. Рассматриваются ственным образовательным стандартам, с новейшими дос
особенности нечеткого моделирования в средах MATLAB и тижениями компьютерной математики. Книга написана на
fuzzyTECH. Изложение сопровождается примерами разра основании оригинальных авторских разработок, которые
ботки отдельных нечетких моделей и иллюстрациями вы позволяют традиционно сложные научные понятия сделать
полнения всех необходимых операций с нечеткими множе более доступными для усвоения без ущерба их математичес
ствами. Для системных аналитиков, программистов и студен кой строгости. Книга рассчитана на студентов всех форм
тов вузов. обучения: очной, заочной, дистанционной.

82 Exponenta Pro