Грицай Александр

advertisement
Международный Детский Творческий
Фестиваль «Южный полюс»
Полное название темы работы
Рекурсивные алгоритмы и фракталы
Название секции форума
Информационные системы и технологии в
науке, технике, образовании
Тип работы
исследовательская работа
Возрастная номинация
9 класс
Фамилия имя отчество
Грицай Александр Андреевич
Место учебы:
МБОУ Шушенская СОШ №3
Класс
9 класс
Место выполнения работы
НОУ «Интеллект-академия»
Руководитель
Астальцева Галина Георгиевна, МБОУ
Шушенская СОШ№3, учитель математики .
Баранова Татьяна Анатольевна, педагог
дополнительного образовательного МБОУ
ДОД ЦДЮТТ.
Научный руководитель
-
Аннотация
Грицай Александр Андреевич
п. Шушенское, МБОУ Шушенская СОШ№3
«Рекурсивные алгоритмы и фракталы»
руководители: Астальцева Галина Георгиевна, МБОУ Шушенская СОШ №3,
учитель
математики, Баранова Татьяна Анатольевна, педагог дополнительного образовательного
МБОУ
ДОД
ЦДЮТТ,
автор
дополнительной
образовательной
программы
«Программирование на языке Паскаль»
Цель исследовательской работы: Определение места рекурсивных алгоритмов при
создании фрактальной графики через изучение основных операторов, написание и отладку
программ на языке программирования Pascal ABC.
Методы проведенных исследований: анализ, синтез, сравнение, эксперимент,
моделирование.
Основные результаты:
- изучены понятия «гномон», «фрактал», «самоподобие», «язык программирования»,
«рекурсия», «рекурсивный алгоритм», «рекурсивная программа»;
- выявлены существующие приемы и способы программирования фракталов;
- проведено экспериментальное программирование цепочек «гномон» - «фрактал»,
- написаны программы для построения собственных фракталов, с использованием
рекурсивных и не рекурсивных алгоритмов.
1.ВВЕДЕНИЕ
Актуальность: Данная работа является продолжением школьного метапредметного
исследовательского проекта «Гномоны: от фараонов до фракталов», в котором изучается
понятия «гномон» в разных предметных областях, строятся цепочки «гномон – фрактал»,
определяется возможности практического применения гномонной теории. Результатом
данного исследования стали программы, позволяющие строить фракталы, написанные на
языке Pascal ABC и попытка менять программу так, чтобы можно было программировать
фрактал посредством цикличного построения самоподобных форм с использованием
рекурсивных и не рекурсивных алгоритмов.
Проблема: при создании программ для построения фракталов возникает вопрос о
возможности написать программу таким образом, чтобы она позволяла строить фракталы
через программирование самоподобных форм.
Разработанность исследуемой проблемы заключается в том, что известные знания о
фракталах, способах их построения, посредством программирования на языке Pascal,
используются во всем мире. [2], [6], [9], [11]. Мы же попробуем повторить программы,
созданные
посредством рекурсивных и не рекурсивных алгоритмов и написать
собственные программы для построения самоподобных форм.
2. ОСНОВНОЕ СОДЕРЖАНИЕ.
Цель: Определение места рекурсивных алгоритмов при создании фрактальной графики
через изучение основных операторов, написание и отладку программ на языке
программирования Pascal ABC.
Задачи:
- изучить понятия «гномон», «фрактал», «самоподобие», «язык программирования»,
«рекурсия», «рекурсивный алгоритм», «рекурсивная программа»;
-выявить сущность рекурсивных и не рекурсивных алгоритмов, приемы и способы
программирования фракталов;
- провести экспериментальное программирование цепочек «гномон» - «фрактал», написать
программы для построения собственных фракталов, используя изученные способы;
Гипотеза:
Зная способы программирования
фракталов, разбираясь в сути рекурсивных
алгоритмов можно создать программы для построения собственных геометрических
фракталов, а затем и многомерных поверхностей.
Методы исследования:
Анализ, синтез, сравнение, эксперимент, моделирование, программирование.
Результаты:
- изучены понятия «гномон», «фрактал», «самоподобие», «язык программирования»,
«рекурсия», «рекурсивный алгоритм», «рекурсивная программа»;
- выявлены существующие приемы и способы программирования фракталов;
- проведено экспериментальное программирование цепочек «гномон» - «фрактал»,
- написаны программы для построения собственных фракталов, с использованием
рекурсивных и не рекурсивных алгоритмов;
- при
проведении эксперимента выяснилось, что недостаточное знание основ
программирования не дает возможности для полного подтверждения гипотезы о том, что
зная способы программирования фракталов, можно создать программы для построения
цепочек «гномон»
-
«фрактал», а также определить способ написания программ для
построения собственных геометрических фракталов. Поэтому работу по изучению
способов программирования фракталов следует продолжить, изучая при этом и
возможности других языков программирования.
ХОД РАБОТЫ:
1. «Гномон», «Фрактал», «Самоподобие», «Язык программирования Pascal
ABC»
Гномон - это самоповторяющаяся форма
и как «самоповторяющаяся форма»
гномоны имеют место в любой предметной области.
Фракталом называется структура, состоящая из частей, которые в каком-то смысле
подобны целому.
Самоподобие означает, что объект может быть построен на основе любой своей
части.
Паскаль (англ. Pascal) — язык программирования общего назначения. Один из
наиболее
известных
языков
программирования,
используется
для
обучения
программированию в старших классах и на первых курсах вузов, является базой для ряда
других языков.
Рекурсия – наличие в определении, описании, изображении какого-либо объекта
или процесса самого этого объекта или процесса, то есть ситуация, когда объект является
частью самого себя. В программировании рекурсия — вызов функции (процедуры) из неё
же самой. Рекурсивным называется объект, частично состоящий или определяемый с
помощью самого себя.
Если некоторая процедура P содержит явную ссылку на саму себя, то ее называют
прямо рекурсивной. Если некоторая процедура P ссылается на другую процедуру Q,
содержащую (прямую или косвенную) ссылку на P, то P называют косвенной рекурсивной
процедурой. Рекурсия – фундаментальное понятие в математике и компьютерных науках. В
языках программирования рекурсивной программой называется программа, которая
обращается сама к себе (подобно тому, как в математике рекурсивная функция
определяется через понятия самой этой функции).
Рекурсивная программа не может вызывать себя до бесконечности, следовательно,
вторая важная особенность рекурсивной программы – наличие условия завершения,
позволяющее программе прекратить вызывать себя.
Таким образом рекурсия в программировании может быть определена как сведение
задачи к такой же задаче, но манипулирующей более простыми данными.
Как следствие, рекурсивная программа должна иметь как минимум два пути
выполнения, один из которых предполагает рекурсивный вызов (случай «сложных»
данных), а второй – без рекурсивного вызова (случай «простых» данных).
Рекурсивную
программу
всегда
можно
преобразовать
в
нерекурсивную
(итеративную, использующую циклы), которая выполняет те же вычисления. И наоборот,
используя рекурсию, любое вычисление, предполагающее использование циклов, можно
реализовать, не прибегая к циклам.
Язык программирования - формальная знаковая система, используемая для связи
человека с цифровой вычислительной машиной; предназначена для описания данных
(информации) и алгоритмов (программ) их обработки на вычислительной машине.
2. Мной были определены 7 способов построения фракталов:
I способ. Пыль Кантора;
II способ. Кривая Коха;
III способ. Снежинка Коха
(звезда Коха)
IV способ. Салфетка Серпинского
(треугольник Серпинского);
Vспособ. Линия Пеано
VI способ. Ковёр Серпинского;
VII способ. Губки Менгера
Для каждого из этих способов я определил, что будет простейшей самоподобной
формой (гномоном), которая подвергнется преобразованию и что станет фракталом.
Выполнил программирование этих простейших форм на языке программирования
PascalABC.
Линия
uses crt, graphABC; begin
line(200,200,400,200); end.
Квадрат
Uses crt, graphABC; begin
rectangle(20,20,200,200); end.
Круг
Uses crt, graphABC; begin
circle(200,200,100); end.
Треугольник
uses crt, graphABC; begin
line(200,200,400,200); line(400,200,300,100);
line(200,200,300,100); end.
Ломаная
usescrt, graphABC; begin
line(40,100,80,100); line(80,100,80,50);
line(80,50,120,50); line(120,50,120,100);
line(120,100,160,100); end.
Трапеция
usescrt, graphABC;
begin line(100,100,200,100); line(200,100,250,150);
line(250,150,50,150); line(50,150,100,100);
end.
3. Выявил существующие приемы и способы программирования фракталов
I. Снежинка Коха
program Koch1; uses CRT, Graphabc;
var gd, gm: Integer; procedure Draw(x, y, l, u : Real; t : Integer);
procedure Draw2(Var x, y: Real; l, u : Real; t : Integer);
begin Draw(x, y, l, u, t); x := x + l*cos(u);
y := y - l*sin(u); end; begin if t > 0 then begin
l := l/3; Draw2(x, y, l, u, t-1); Draw2(x, y, l, u+pi/3, t-1);
Draw2(x, y, l, u-pi/3, t-1); Draw2(x, y, l, u, t-1);
End else Line(Round(x), Round(y), Round(x+cos(u)*l), Round(y-sin(u)*l))
end; begin setwindowsize(500,500); Draw(410, 10, 400, -pi, 4);
Draw(10, 410, 400, 0, 4); Draw(10, 10, 400, -pi/2, 4);
Draw(410, 410, 400, pi/2, 4); ReadKey; end.
II. Кривая Коха
program Koh; uses CRT, Graphabc;
var gd,gm : Integer; const iter = 50000;
procedure Draw; var t, x, y, p : Real;
k : LongInt; mx, my, rad : Integer;
begin mx := 10; my := 250;
rad :=600; Randomize;
x := 0.0; y := 0.0;
for k := 1 To iter do begin p := Random; t := x; if p <= 1/2 then
begin x := 1/2 * x + 1/(2*sqrt(3)) * y; y := 1/(2*sqrt(3)) * t - 1/2 * y;
end else begin x := 1/2 * x - 1/(2*sqrt(3)) * y +1/2;
y := -1/(2*sqrt(3)) * t - 1/2 * y + 1/(2*sqrt(3));
end; PutPixel(mx + Round(rad * x), my - Round(rad * y), 2);
end; end; begin Draw; ReadKey; end.
III. Ковёр Серпинского
uses crt,graphabc; var n:integer;
procedure kov(A,B,C,D,n:integer);
var A1, B1, C1, D1:integer;
begin if N=0 then EXIT; A1:= 2 * A div 3 + C div 3;
C1:= A div 3 + 2 * C div 3; B1:= 2 * B div 3 + D div 3;
D1:= B div 3 + 2 * D div 3; rectangle (A1, B1, C1, D1); delay(50);
floodfill(a1+1,b1+1,4); kov(A, B, A1, B1, n-1);
kov(A1, B, C1, B1, n-1); kov(C1, B, C, B1, n-1);
kov(A, B1, A1, D1, n-1); kov(C1, B1, C, D1, n-1);
kov(A, D1, A1, D, n-1); kov(A1, D1, C1, D, n-1);
kov(C1, D1, C, D, n-1); end; BEGIN
readln(n); //setbrushcolor(4); setpencolor(10);
rectangle(200, 40, 550, 390); kov(200, 40, 550, 390,n);
end.
IV. Треугольник Серпинского
uses crt,graphabc;
var x1,y1,x2,y2,x3,y3,a,b,n1:integer;
c:array[1..23] of integer;
procedure tri(x1,y1,x2,y2,x3,y3,N:integer);
var x12,y12,x23,y23,x31,y31:integer;
begin if N=0 then EXIT;
x12:=(x1+x2) div 2; y12:=(y1+y2) div 2;
x23:=(x2+x3) div 2; y23:=(y2+y3) div 2;
x31:=(x3+x1) div 2; y31:=(y3+y1) div 2;
setpencolor(c[15-n]);delay(250);
moveto(x31,y31); lineto(x12,y12);
lineto(x23,y23); lineto(x31,y31); tri(x1,y1,x12,y12,x31,y31,N-1);
tri(x2,y2,x12,y12,x23,y23,N-1); tri(x3,y3,x31,y31,x23,y23,N-1);
end; begin C[1]:=clWhite; C[2]:=clLightGray; C[3]:=clGray;
C[4]:=clDarkGray; C[5]:=clBlack; C[6]:=clRed;
C[7]:=clGreen; C[8]:=clBlue; C[9]:=clYellow;
C[10]:=clAqua; C[11]:=clFuchsia; C[12]:=clPurple;
C[13]:=clBrown; C[14]:=clMaroon; C[15]:=clMoneyGreen;
C[16]:=clSkyBlue; C[17]:=clCream; C[18]:=clOlive;
C[19]:=clTeal; C[20]:=clLime; C[21]:=clSilver; C[22]:=clNavy;
write('n= '); readln(n1); x1:=320; y1:=0; x2:=600; y2:=400;
x3:=0; y3:=400; moveto(x1,y1); lineto(x2,y2); lineto(x3,y3); lineto(x1,y1);
tri(x1,y1,x2,y2,x3,y3,n1); readkey; end.
V. Парад фракталов
const maxcol=400; maxrow=300;
max_colors=16; max_iteration=512;
max_size=4; Var x1,y1,x2,y2,k: Integer;
Var q:array[0..349] of real; re,im,re1,im1:real;
v,x9,y9: integer; c:array[0..22] of integer;
XMax,YMax,XMin,YMin:real;
P8,deltaP,deltaQ,x8,y8,xsquare,ysquare:real;
i8,color,row,col:integer;
x5,t5,y5:Real; sign:Integer; n5:Integer;
gd,gm:Integer; procedurekub; begin
re1:=re*(re*re-3*im*im);im1:=im*(3*re*re-im*im);
re:=re1; im:=im1; end;
//рекурсивная процедура построения закрученного квадрата
Procedure fract(x,y,a,l,k,a1:integer); //x,y: координаты начала каждой ветки, a: угол наклона, l: длина,
k: номер ветвей, a1: изменение наклона при каждой новой ветке
Var p:integer;
Begin p := a1;
// наклон в одну сторону
if k mod 2 = 0 then
// если номер ветки парное
число
p := -a1;
// наклон идет в другую сторону
while l > 3 do
// пока длина ветки больше 3
begin setpenWidth (6-k);
// толщина ветки
setpenColor ( rgb(random(255),random(255),random(255))); // её
цвет
moveto(x,y);
// координаты начала линии
lineto(x+round(cos(pi*a/180)*l),y+round(sin(pi*a/180)*l)); //
прорисовка линии
x := x+round(cos(pi*a/180)*l); // конец предыдущей делаем
началом новой линии
y := y+round(sin(pi*a/180)*l);
a := a + p;
// изменяем угол
l := round(l / 1.17);
// уменьшаем длину
fract(x,y,a-(p*2),round(l / 1.2),k+1,a1+1);// вызываем рекурсивно эту же процедуру для дальнейшей
прорисовки
end; end; //рекурсивная процедура построения дракона
procedure Paint(x1,y1,x2,y2,k:Longint);
vartx,ty:Longint; begin
setPenColor(clBlue); // задаем цве ткривой
if k=0 then begin MoveTo(x1,y1); LineTo(x2,y2); Exit; end;
// формулы вычисления координат точки, находящейся на середине отрезка и удаленной от прямой
на такое расстояние, чтобы при соединении этой точки с концами отрезка получился угол в 90
градусов
tx := (x1+x2) div 2 + (y2-y1) div 2;
ty := (y1+y2) div 2 - (x2-x1) div 2;
// рекурсивный вызов функций, соединяющих концы отрезка с данной точкой
Paint(x2,y2,tx,ty,k-1); Paint(x1,y1,tx,ty,k-1); end;
//рекусивная процедура построения дерева
procedure Tree(x, y: Integer; a: Real; l: Integer);
var x1, y1: Integer;
p, s : Integer; i : Integer; a1: Real;
begin if l < 8 then exit;
x1 := Round(x + l*cos(a)); y1 := Round(y + l*sin(a));
if l > 100 then p := 100 else p := l;
if p < 40 then begin //Генерация листьев
if Random(10) > 5 then
setPenColor(clgreen) else setPenColor(rgb(90,139,5));
for i := 0 to 3 do Line(x+i,y,x1,y1); end else begin
//Генерация веток
setPenColor(rgb(100,3,4)); for i := 0 to (p div 6) do
Line(x + i - (p div 12), y, x1, y1); end;
//Следующие ветки
for i := 0 to 9 - Random(9) do begin
s := Random(l - l div 6) + (l div 6);
a1 := a + 1.6 * (0.5 - Random); //Угол наклона веток
x1 := Round(x + s * cos(a)); y1 := Round(y + s * sin(a));
Tree(x1, y1, a1, p - 5 - Random(30)); //Чем меньше вычитаем,
тем пышнее дерево
end; end; begin
setwindowsize(800,600) ; Tree(320, 350, 3*pi/2, 100); //дерево
delay(1500); ClearWindow; //дракон
setBrushColor (clWhite); // задаем начальные значения для
прямой и ставим счетчик в 24
x1 := 200; y1 := 200; x2 := 400; y2 := 400; k := 20;
Paint(x1,y1,x2,y2,k); delay(1500); ClearWindow;
//закрученный квадрат
fract(400,500,270,70,0,20); delay(2000); ClearWindow; //хопалонг
x5:=0; y5:=0; n5:=0; While n5<50000 Do Begin
t5:=x5; //запоминаем значение x вычисленное на предыдущем шаге
if x5>0 then sign:=1 //запоминаем знак x
else sign :=-1; x5:=y5-sign*sqrt(abs(4*x5-60)); //вычисляем новое значение x
y5:=1-t5; //вычисляем новое значение y
inc(n5); PutPixel(round(x5*2)+320,round(y5*2)+240,clred) //рисуем очередную точку
End; delay(2000); ClearWindow;
XMax:=1.2; XMin:=-2.0; YMax:=1.2;YMin:=-1.2;
C[0]:=clWhite; C[1]:=clWhite; C[2]:=clLightGray;
C[3]:=clGray;
C[4]:=clDarkGray; C[5]:=clBlack; C[6]:=clRed; C[7]:=clGreen;
C[8]:=clBlue; C[9]:=clYellow; C[10]:=clAqua; C[11]:=clFuchsia;
C[12]:=clPurple; C[13]:=clBrown; C[14]:=clMaroon;
C[15]:=clMoneyGreen; C[16]:=clSkyBlue;
C[17]:=clCream; C[18]:=clOlive; C[19]:=clTeal;
C[20]:=clLime; C[21]:=clSilver; C[22]:=clNavy;
deltaP:=(XMax-XMin)/(maxcol);
deltaQ:=(YMax-YMin)/(maxrow);
q[0]:=YMax; for row:=1 to maxrow do
q[row]:=q[row-1]-deltaq; p8:=XMin;
for col:=0 to maxcol do begin //if keypressed then exit;
for row:=0 to maxrow do begin
x8:=0.0; Y8:=0.0;xsquare:=0.0; Ysquare:=0.0; color:=2;
repeat xsquare:=x8*x8; ysquare:=y8*y8;
y8:=2*x8*y8+q[row]; x8:=xsquare-ysquare+p8;
inc(color); until(color>=max_iteration) or
(xsquare+ysquare>=max_size);
putpixel(col+200,row+100,(c[color mod max_colors]));
end; p8:=p8+deltap; end; delay(1500); ClearWindow; x9:=320; repeat y9:=-240; repeat
v:=0; re:=-1+0.005*x9; im:=0+0.005*y9;
repeatkub; kub;re:=re-0.85; im:=im+0.2;
if re*re>5 then goto 1; ifim*im>6 then goto 1;
v:=v+1; until v>10;
1: if ((abs(re)<7) or (abs(im)<3)) and ((v<44) and (v>0)) then
putpixel((x9+120),(y9+240),c[v])
elseputpixel((x9+120),(y9+240),clWhite);
y9:=y9+1; until y9>241; x9:=x9+1; until x9>420; end.
4. Экспериментальное программирование собственных фракталов
В своих предыдущих исследованиях я пытался, используя приемы «Пыль Кантора»,
«Кривая Коха», «Ковер Серпинского», «Салфетка Серпинского», построить свои фракталы.
Представлял свои достижения трижды на краевой междисциплинарной выставке. В
предложенной работе мной выполнено программирование своих фракталов на языке
программирования Pascal.
Шахматная доска
Uses crt, graphABC;
var n,i,x,y:integer;
begin x:=20; y:=20; for n:=1 to 8 do
begin for i:=1 to 8 do begin
rectangle(x,y,x+20,y+20);
if (i mod 2 <>0) and (n mod 2 =0) then
floodfill(x+1,y+1,clblack);
if (i mod 2 =0) and (n mod 2 <>0) then
floodfill(x+1,y+1,clblack); x:=x+20;
end; x:=20; y:=y+20; end; end.
Мишень
Uses crt, graphABC;
Var n,i,x,y: integer;
Begin x:=180; for n:=1 to 8 do begin
circle(200,200,x); if (n mod 2 =0) then
floodfill(200,200,clblack) else floodfill(200,200,clwhite);
x:=x-20; end; end.
Прямоугольники
uses crt, graphABC;
var n,i,x,y: integer; begin
x:=260;y:=60;i:=320;for n:=1 to 8 do
begin rectangle(x,y,x+i,y+i); if (n mod 2 =0) then
floodfill(x+1,Y+1,clblack) else floodfill(x+1,y+1,clwhite);
x:=x+20;y:=y+20;i:=i-40; end; end.
ЗАКЛЮЧЕНИЕ
В процессе исследования проведена большая работа:
- изучены понятия «гномон», «фрактал», «самоподобие», «язык программирования»,
«рекурсия», «рекурсивный алгоритм», «рекурсивная программа»;
- выявлены существующие приемы и способы программирования фракталов;
- проведено экспериментальное программирование цепочек «гномон» - «фрактал»,
- написаны программы
для построения собственных фракталов, с использованием
изученных способов;
Следует отметить, что при проведении эксперимента выяснилось, что зная
способы программирования фракталов, разбираясь в сути рекурсивных алгоритмов
можно создать программы для построения собственных геометрических фракталов, а
затем и многомерных поверхностей. Именно поэтому работу по изучению способов
программирования следует продолжить, изучая при этом возможности других языков
программирования и попытаться составить программы для построения многомерных
поверхностей.
Практическое применение данного вопроса подразумевает возможность
создания средствами программирования живых моделей любых фрактальных
объектов на основе составления программ для самоподобных форм.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Шредер М. Фракталы, хаос, степенные законы / Шредер М.- М., «Просвещение», 2001 г.,
528с.
2. Античная наука. - ( http://antic.portal-1.ru/geog.html)
3. Газале М. Гномон: От фракталов до фараонов, - (.http://forexbaza.info/load/knigi/foreks/m_gazale_quot_gnomon_ot_faraonov_do_fraktalov_quot/4-1-0-19)
4. Википедия. – (http://wikipedia.org/wiki )
5. Cайт профессиональных трейдеров (http://www.virtuosclub.ru/main/library/f06/skachat-knigu-m-gazale-gnomon-ot-faraonov-dofraktalov).
7. Фракталы в геометрии. (http://lol54.ru/education/uvgsfeshshht_informative/28368-ogromnaja-podborka-fraktalovfractals-176-sht..html)
8. Понятие фрактала. – ( http://www.tyiya.ru/chto-takoe-fraktal/ )
9. Рост посредством гномического расширения - ( http://www.bb-celitel.ru/iscelit/69.html)
10. Способы построения фракталов. – ( http://sworm.narod.ru/ )
11.Ушаков Д.Н. Большой толковый словарь ( http://www.classes.ru/all-russian/russian-dictionary-Ushakov-term-10511.htm)
12. Фрактальная геометрия. – (http://fractbifur.narod.ru/html/index1.html)
13. Фрактальная геометрия и физика. – ( http://shabet.narod.ru/frakgeom.html)
14. Эрудиция. Электронная российская библиотека. (http://www.erudition.ru/referat/printref/id.33926_1.html )
15. Фракталы средствами языка С++ http://opita.net/task/fractal
16. Фракталы на языке PascalABC http://fraktalsworld.blogspot.ru/p/blog-page_25.htm
17. Фракталы в программировании http://ru.wikipedia.org/wiki/
18. Формулы построения фракталов http://pascal.proweb.kz/index.php?page=92
19. Интерактивные плакаты с фракталами http://elementy.ru/posters/fractals
Download