1. Розмірність Мінковського
Означення 1. Розмірністю Мінковського обмеженої множини у метричному просторі називають таку границю:
|
Тут Nε — найменше число множин діаметра ε, якими можна покрити множину. Якщо така границя не існує, то нижню й верхню границю відношення ln Nε/(– ln ε) називають відповідно верхньою та нижньою розмірностями Мінковського.
Безпосередньо з означення розмірності Мінковського маємо таке.
Зауваження 2. Розмірність Мінковського скінченного об’єднання множин дорівнює максимуму з їхніх розмірностей. Для зліченного об’єднання множин аналогічне висловлювання не справджується — див. приклад {0, 1, 1/2, 1/3, 1/4, …}.
2. Розмірність Хаусдорфа
Означення 2. Запровадимо такі поняття:
Скінченну або зліченну множину{Aj}j∈J підмножин метричного простору (X, ρ) називають ε-покриттям множини B, якщо справджуються такі дві умови:
• B ⊂ | ∪ | Aj ; |
j∈J |
• ∀ j∈J λ (Aj) < ε.
Тут і далі λ (Aj) — діаметр множини Aj у метричному просторі (X, ρ).
Для довільних додатного дійсного α і A = {Aj}j∈J — покриття множини B — запровадимо такі позначення:
• Fα(A) = | ∑ | λα(Aj); |
j∈J |
• Mα(B) = | lim | Mαε(B). |
ε↓0 |
Зауваження 2. Остання границя існує як дійсне число або + ∞, бо під знаком границі стоїть вираз, що не спадає при спаданні ε і відповідному звуженні множини, для якої шукають точну нижню межу. Ця границю називають α-мірою Хаусдорфа множини В. З точністю до множника:
Величина Mα(B) не зростає при зростанні α. Більше того,
(1)
∃ α0 ∀ α
(α < α0 ⇒ Mα(B) = + ∞) ∧
(α > α0 ⇒ Mα(B) = 0).
При α = α0 функція Mα(B) може дорівнювати 0, додатному числу або + ∞ залежно від множини B.
Означення 3. Розмірністю Хаусдорфа множини В називають число α0, задане висловлюванням (1).
Зауваження 3. Розмірність Хаусдорфа має такі властивості:
розмірність Хаусдорфа не перевищує верхньої та нижньої розмірностей Мінковського;
розмірність Хаусдорфа зліченного об’єднання множин дорівнює максимуму їхніх розмірностей. Внаслідок цього долучення зліченної множини не змінює розмірність;
для самоподібних множин розмірність Хаусдорфа можна обчислити явно: якщо множину можна розбити на подібні їй j множин з коефіцієнтами подібності k1, k2, …, kj, то її розмірність d є розв’язком такого рівняння:
Якщо усі коефіцієнти подібності збігаються: k1 = k2 = … = kj = k, то розмірність d є розв’язком такого рівняння:
(2) j kd = 1 ⇔ kd = j – 1 ⇔ d = – logk j = log1/k j = ln j / ln k – 1.
3. Розмірність Лебега або топологічна розмірність
Означення 4. Запровадимо такі поняття.
ε-покриттям метричного прострору називають покриття, всі елементи якого мають діаметр, що не перевищує ε.
Кратністю скінченного покриття простору називають найбільше ціле k, при якому існує точка цього простору, що міститься у k елементах даного покриття.
Для компактного метричного простору размірність Лебега чи топологічну розмірність означають як найменше ціле число n, при якому для довільного додатного ε існує скінчене відкрите ε-покриття простору, що має кратність n + 1.
Нульову топологічну розмірність має простір зі скінченною кількістю точок. Для відрізка топологічна розмірність дорівнює 1.
Вперше топологічну розмірність запрвадив Лебег (Henri Leon Lebesgue). Він висловив гіпотезу, що топологічна розмірність n-вимiрного куба дорівнює n. Брауер (Luitzen Egbertus Jan Brouwer) вперше це довів. Точне означення інваріанту для класу метричних компактів дав Урисон (Павло Самуїлович).
4. Множина Кантора
Означення 5. Множину Кантора — підмножину відрізку дійсних чисел [0,1], будують за допомогою послідовних наближень таким чином:
на першому кроці вилучають середню третину-інтервал відрізку [0, 1], залишаючи [0, 1/3] ∪ [2/3, 1];
на кожному наступному кроці вилучають середню третину-інтервал кожного з відрізків, отриманих на попередньому кроці.
Множина Кантора містить усі ті точки відрізку [0, 1], які неможливо вилучити таким чином.
Цю множину вперше розглянув німецький математик Георг Кантор у своїй роботі: G. Cantor, On the Power of Perfect Sets of Points (De la puissance des ensembles parfait de points), Acta Mathematica 4 (1884) 381–392.
Множина Кантора розбивається на 2 подібні їй самій частини з коефіцієнтом подібності 1/3. Розмірність Хаусдорфа множини Кантора дорівнює ln 2 / ln 3 ≈ 0,6309298 — див. рівняння (2) при j = 2, k = 1/3.
Топологічна розмірність множини Кантора дорівнює 0.
Можна дати альтернативне означення множини Кантора.
Означення 5'. Множина Кантора — це множина всіх тих дійсних чисел з [0,1], у записі яких у системі числення з основою 3 не використано цифру 1 при можливому запису (2) — двійки у періоді.
Зауваження 4. Множина Кантора незлічена.
Останнє висловлювання доводять від супротивного, припустивши існування переліку точок множини Кантора та використовуючи означення 4' і діагональний метод Кантора, тобто вибираючи n-у цифру числа, що не потрапило у перелік, відмінною від 1 і від n-ої цифри n-го числа з переліку.
Наближенням множини Кантора є об’єднанням 2n відрізків довжини 1/3n при n = 0, 1, 2, ... . Сума довжин цих відрізків 2n/3n збігається до 0 при необмеженому зростанні n. Інакше кажучи, множину Кантора отримують вилученням з відрізку довжини 1 інтервалів, загальна довжина яких дорівнює 1. Кінці цих інтервалів належать до множини Кантора. Множина таких кінців зліченна. Незліченна множина Кантора, рівнопотужна [0,1], містить не лише їх.
Множину Кантора (чи їй подібну множину) можна утворити перетином килима Серпінського (див. далі) будь-якою прямою, яка проходить через його центр симметрії.
Множину Кантора можна використати при побудові прикладу неперервної неспадної функції f : [0, 1] → [0, 1], яка стала майже всюди щодо міри Лебега на [0, 1]. Інакше кажучи, вона стала на інтервалах, сума довжин яких дорівнює 1. При цьому область значень — [0, 1]. За цією функцією розподілу у подальшому будують приклад неперервної міри, що не є неперервною за мірою Лебега.
5. Крива Коха
Означення 6. Криву Коха, описану в 1904 році шведським математиком Хельге фон Кохом, будують за допомогою послідовних наближень-ламаних:
за нульове наближення беруть довільний відрізок;
для отримання кожного наступного наближення:
кожну ланку поточного наближення поділяють на три однакові частини;
середню частину замінюють ламаною з двох ланок тієї самої довжини таким чином, щоб для кожного наближення кутовий аргумент напрямку руху вздовж наближення зазнавав сталої послідовності змін при проході через нові три послідовні внутрішні вершини ламаної наближення:
+60°, –120°, +60° або –60°, +120°, –60°.
Згідно з означенням 6, криву Коха можна розбити на 4 частини, що подібні початковій кривій з коефіцієнтом подібності 1/3. Розмірність Хаусдорфа кривої Коха дорівнює ln 4 / ln 3 ≈ 1,2618595 — див. рівняння (2) при j = 4, k = 1/3.
Три копії кривої Коха, побудовані вістрями назовні на сторонах правильного трикутника, утворюють замкнену криву, так звану сніжинку Коха.
Рис. 3 отримано як фрагменти копій екранних зображень у процесі роботи такої програми.
uses graph; const nstep=6; npoint=3*4*4*4*4*4*4; var x0,x1,y0,y1,dx,dy,d:real; i,j,j1,j2,j3,l,ll,nx,ny:word; ix,iy:array[0..npoint] of word; detect,graphmode: integer; x, y:array[0..npoint] of real; co,si: array[0..5] of real; k:array[0..npoint] of byte; n4:array[0..nstep] of word; begin {Напрями} for j:=0 to 5 do begin co[j]:=cos(j*pi/3); si[j]:=sin(j*pi/3) end; {Степені 4} n4[0]:=1; for j:=1 to nstep do n4[j]:=n4[j-1]*4; {Координати вершин початкового трикутника } x[0]:=-1; x[n4[nstep]]:=1; x[n4[nstep]*2]:=0; y[0]:= 0; y[n4[nstep]]:=0; y[n4[nstep]*2]:=sqrt(3); k[0]:= 0; k[n4[nstep]]:=2; k[n4[nstep]*2]:=4; x[npoint]:=-1; y[npoint]:=0; x0:=-1; y0:=-1/sqrt(3); dx:=2; {Границі рисунка} x1:= 1; y1:=sqrt(3); dy:=4/sqrt(3); d:=2; for i:=0 to nstep-1 do begin {Координати точок, що виникають після i-го перетворення} d:=d/3; l:=n4[nstep-i]; j:=0; ll:=n4[nstep-i-1]; while j < npoint-1 do begin j1:=j+ll; x[j1]:=(2*x[j]+x[j+l])/3; y[j1]:=(2*y[j]+y[j+l])/3; if k[j]=0 then k[j1]:=5 else k[j1]:=k[j]-1; j2:=j+ll*2; x[j2]:=x[j1]+d*co[k[j1]]; y[j2]:=y[j1]+d*si[k[j1]]; if k[j]=5 then k[j2]:=0 else k[j2]:=k[j]+1; j3:=j+ll*3; x[j3] :=(x[j]+2*x[j+l])/3; k[j3]:=k[j]; y[j3] :=(y[j]+2*y[j+l])/3; j:=j+l end end; {Приготування екрану} detectgraph(detect,graphmode); initgraph(detect,graphmode,'c:\pascal\bgi'); nx:=getmaxx; ny:=getmaxy; setbkcolor(15); setcolor(16); if dx*ny<dy*nx then dx:=(dy*nx)/ny else if dx*ny>dy*nx then dy:=(dx*ny)/nx; x1:=x0+dx; y1:=y0+dy; for j:=0 to npoint do begin {Екранні координати j-ої точки} ix[j]:=trunc(((x[j]-x0)/dx)*nx); iy[j]:=trunc(((y1-y[j])/dy)*ny); end; for i:=0 to nstep do begin j:=0; cleardevice; while j < npoint do begin l:=j+n4[nstep-i]; line(ix[j],iy[j],ix[l],iy[l]); j:=l end; readln end; closegraph end.
Побудову зображень наближень сніжинки Коха було сформульовано як задачу 5 «Багатокутник» ІІІ (міського) етапу Всеукраїнської учнівської олімпіади з інформатики у 2001 році у місті Києві. Цю задачу тоді повністю розв'язали: 1 учень 9-го класу, 11 учнів 10-го класу і 13 учнів 11-го класу. Подана програма є розв'язанням автора цієї задачі після збільшення кількості наближень на 1 та зміни кольорів тла і кривої.
Узагальнення кривої Коха можна отримати:
поділом ланки наближення у пропорції 1: r :1 при r, відмінному від 1;
заміною ланки не парою, а трійкою ланок, що є сторонами одного й того самого квадрата.
При побудові замкненої кривої (початок збігається з кінцем) за перше наближення можна брати не лише правильний трикутник, а, наприклад, квадрат, і проводити побудову як «назовні», так і «всередину» фігури.
6. Крива Пеано
Означення 7. Крива Пеано — спільна назва для параметрично заданих плоских кривих, множина всіх точок яких містить квадрат.
Перший приклад такої кривої подав Джузеппе Пеано в 1890 році у своїй роботі: Peano G., «Math. Ann.», 1890, Bd 36, S. 157.
Означимо функції x: [0,1] → [0,1] та y: [0,1] → [0,1].
Позначимо через:
функції x(t) й y(t) коректно означені, тобто для чисел t, що мають 2 різні подання, величини функцій не залежать від вибору подання аргумента;
функції x(t) й y(t) неперервні на [0, 1];
система рівнянь x(t) = a й y(t) = b має не менше одного й не більше 4 розв’язків при довільних a та b з відрізку [0, 1].
Таким чином, неперервна крива {(x(t), y(t))}t∈[0, 1] повністю покриває квадрат [0, 1]2.
На рисунках 5–8 подано перші чотири наближення запровадженої вище кривої Пеано. Тут під n-им наближенням розуміємо ламану, що послідовно сполучає образи тих значень t, які у трійковій системі можна подати скінченним трійковим дробом з не більше ніж 2n знаками після коми.
Рисунки 5–8 було отримано з використанням видавничої системи LaTeX і такої програми створення протоколів побудови примітивної монохромної графіки у цій системі.
const n=4; n2=n*2; var x3,y3: array[0..n] of byte; t: array[0..n2] of byte; x,y,x0,y0: word; o: text; st: string; j,k,l,m,s: byte; BEGIN for m:=1 to n do BEGIN str(m,st); assign (o,'peano'+st+'.pic'); rewrite(o); writeln(o,'\unitlength 1 mm\begin{picture}(81,81)'+ '\special{em:linewidth 0.6pt}\linethickness{0.6pt}'); for j:=0 to n2 do t[j]:=0; for j:=0 to n do begin x3[j]:=0; y3[j]:=0 end; REPEAT inc(t[m*2]); j:=m*2; while t[j]=3 do begin t[j]:=0; dec(j); inc(t[j]) end; for j:=1 to m do begin k:=2*j-1; s:=0; for l:=1 to j-1 do s:=(s+t[2*l]) mod 2; case s of 0: x3[j]:=t[k]; 1: x3[j]:=2-t[k] end; k:=2*j; s:=0; for l:=1 to j do s:=(s+t[2*l-1]) mod 2; case s of 0: y3[j]:=t[k]; 1: y3[j]:=2-t[k] end end; x:=x3[0]; for l:=1 to n do x:=x*3+x3[l]; y:=y3[0]; for l:=1 to n do y:=y*3+y3[l]; if t[0]<>1 then writeln(o,'\emline{',x0,'}{',y0,'}{1}{', x,'}{', y,'}{2}'); x0:=x; y0:=y; UNTIL t[0]=1; writeln(o,'\end{picture}'); close(o) END END.
7. Килим і серветка Серпінского
Означення 8. Килим Серпінського — один из двовимірних аналогів множини Кантора, запропонований польским математиком Вацлавом Серпінським, і відомий також як квадрат Серпінського — отримують таким чином.
Квадрат C0 поділяють прямими, паралельними до його сторін, на 9 однакових квадратів.
З квадрата C0 вилучаємо внутрішні точки центрального квадрата і отримуємо C1 — об’єднання 8 квадратів першого рівня.
Діючи так само з кожним з квадратів першого порядку, отримаємо множину C2 — об’єднання 64 квадратів другого рівня. Продовжуючи цей процес нескінченно, отримаємо нескінченну послідованість:
Інакше кажучи, розглянемо послідовно у порядку зростання всі натуральні числа n. З Cn — об’єднання 8n квадратів n-го рівня — отримуємо Cn + 1 — об’єднання 8n + 1 квадратів (n + 1)-го рівня — таким чином:
кожний квадрат n-го рівня поділяємо прямими, паралельними до його сторін, на 9 однакових квадратів;
вилучаємо внутрішні точки центрального з вказаних 9 квадратів і отримуємо квадрати (n + 1)-го рівня;
знаходимо Cn + 1 як об’єднання всіх квадратів (n + 1)-го рівня.
Килим Серпінського знаходимо як перетин усіх членів послідовності {Cn}.
Рис. 9 отримано як фрагмент копії екранного зображення у процесі роботи такої програми.
uses graph; const n=5; {номер наближення} ix=99; {відступ від лівого краю} var graphdriver,graphmode: integer; ny: word; procedure step(x0,y0,x3,y3: real; i: byte); var x1,y1,x2,y2: real; j: byte; BEGIN x1:=(x0*2+x3)/3; y1:=(y0*2+y3)/3; x2:=(x3*2+x0)/3; y2:=(y3*2+y0)/3; bar(ix+round(ny*x1),round(ny*(1-y1)), ix+round(ny*x2),round(ny*(1-y2))); if i < n then begin; j:=i+1; step(x0,y0,x1,y1,j); step(x0,y2,x1,y1,j); step(x0,y2,x1,y3,j); step(x2,y0,x3,y1,j); step(x2,y2,x3,y1,j); step(x2,y2,x3,y3,j); step(x1,y0,x2,y1,j); step(x1,y2,x2,y3,j) end END; BEGIN detectgraph(graphdriver,graphmode); initgraph(graphdriver,graphmode,''); ny:=getmaxy; setfillstyle(1,15); bar(0,0,getmaxx,ny); setfillstyle(1,16); bar(ix,0,ix+ny,ny); setfillstyle(1,15); step(0.,0.,1.,1.,1); readln; {затримка зображення} closegraph END.
Зауваження 5. Справджуються такі висловлювання.
Килим Серпінського — замкнена множина як перетин замкнених множин.
Килим Серпінського має топологічну розмірність 1.
Килим Серпінського є об’єднанням 8 подібних йому частини з коефіцієнтом подібності 1/3. Ці частини — квадрати першого рівня — перетинаються по сторонам, що мають розмірність 1. Розмірність Хаусдорфа килиму Серпінського дорівнює ln 8 / ln 3 ≈ 1,892789 — див. рівняння (2) при j = 8, k = 1/3.
Скористаємося традиційним позначенням mes для міри Лебега, що є узагальненням:
Маємо: mes(Cn) = mes(C0) ∙ (8/9)n, що збігається до 0 при прямуванні n до +∞. Тому міра Лебега килиму Серпінського дорівнює 0.
Означення 9. Серветка Серпінського — один из двовимірних аналогів множини Кантора, запропонований польским математиком Вацлавом Серпінським, і відомий також як трикутник чи ґратка Серпінського — отримують таким чином.
Правильний трикутник S0 середніми лініями на 4 однакових трикутники.
З трикутника S0 вилучаємо внутрішні точки трикутника, утвореного середніми лініями S0, і отримуємо S1 — об’єднання 3 трикутників першого рівня.
Діючи так само з кожним з трикутників першого порядку, отримаємо множину S2 — об’єднання 9 трикутників другого рівня. Продовжуючи цей процес нескінченно, отримаємо нескінченну послідованість:
Інакше кажучи, розглянемо послідовно у порядку зростання всі натуральні числа n. З Sn — об’єднання 3n трикутників n-го рівня — отримуємо Sn + 1 — об’єднання 3n + 1 трикутників (n + 1)-го рівня — таким чином:
кожний трикутник n-го рівня поділяємо середніми лініями на 4 однакових трикутники;
вилучаємо внутрішні точки трикутника, утвореного проведеними середніми лініями й отримуємо трикутники (n + 1)-го рівня;
знаходимо Sn + 1 як об’єднання всіх трикутників (n + 1)-го рівня.
Серветку Серпінського знаходимо як перетин усіх членів послідовності {S n}.
Рис. 10 отримано як фрагмент копії екранного зображення у процесі роботи такої програми.
uses graph; const n=7; {номер наближення} ix=99; {відступ від лівого краю} var graphdriver,graphmode: integer; ny: word; s3: real; {Зображення трикутника} procedure draw(x1,y1,x2,y2,x3,y3: real); var xy: array[1..6] of word; BEGIN xy[1]:=round(x1*ny/s3)+ix; xy[2]:=round((s3-y1)*ny/s3); xy[3]:=round(x2*ny/s3)+ix; xy[4]:=round((s3-y2)*ny/s3); xy[5]:=round(x3*ny/s3)+ix; xy[6]:=round((s3-y3)*ny/s3); fillpoly(3,xy) END; {Зафарбування трикутника, утвореного середніми лініями} procedure step(x1,y1,x2,y2,x3,y3: real; i: byte); var u1,v1,u2,v2,u3,v3: real; BEGIN u1:=(x2+x3)/2; u2:=(x3+x1)/2; u3:=(x1+x2)/2; v1:=(y2+y3)/2; v2:=(y3+y1)/2; v3:=(y1+y2)/2; draw(u1,v1,u2,v2,u3,v3); if i=n then exit; step(x1,y1,u2,v2,u3,v3,i+1); step(x2,y2,u3,v3,u1,v1,i+1); step(x3,y3,u1,v1,u2,v2,i+1) END; BEGIN detectgraph(graphdriver,graphmode); initgraph(graphdriver,graphmode,''); ny:=getmaxy; setfillstyle(1,15); bar(0,0,getmaxx,ny); setfillstyle(1,16); setcolor(16); s3:=sqrt(3); draw(0,0,2,0,1,s3); setfillstyle(1,15); setcolor(15); step(0,0,2,0,1,s3,1); readln; {затримка зображення} closegraph END.
Зауваження 6. Справджуються такі висловлювання.
Серветка Серпінського — замкнена множина як перетин замкнених множин.
Серветка Серпінського має топологічну розмірність 1.
Серветка Серпінського є об’єднанням 3 подібних їй частини з коефіцієнтом подібності 1/2. Ці частини — трикутники першого рівня — перетинаються по трьом одноелементним множинам, що мають розмірність 0. Розмірність Хаусдорфа серветки Серпінського дорівнює ln 3 / ln 2 ≈ 1,5849625 — див. рівняння (2) при j = 3, k = 1/2.
mes(Sn) = mes(S0) ∙ (3/4)n, що збігається до 0 при прямуванні n до +∞. Тому міра Лебега серветки Серпінського дорівнює 0.
8. Множина Мандельброта
Означення 10. Множиною Мандельброта називають множину усіх тих комплексних чисел с, при яких послідовність, задана таким рекурентним співвідношенням:
обмежена.
Якщо комплексні числа подати у нормальній алгебричній формі:
zn | = xn + i ∙ yn; |
c | = a + i ∙ b |
при дійсних xn, yn, a, b, то отримаємо такі рекурентні співвідношення:
xn + 1 | = xn2 – yn2 + a; |
yn + 1 | = 2 xn yn + b. |
Вперше таку множину, описав у 1905 році французький математик П’єр Фату (Pierre Fatou), який вивчав послідовні образи (орбіту) перетворення:
Він довів, що орбіта точки, розташованої на відстані більшій ніж 2 від початку координат, завжди прямує до нескінченності.
Фату не міг бачити зображень, які відомі зараз як зображення множини Мандельброта, бо відповідні обчислення неможливо виконати без комп’ютера. Професор Бенуа Мандельброт бул першим, хто використав комп’ютера для дослідження таких перетворень. Спочатку такі зображення були чорно-білими:
Згодом множину точок, що не належать до множини Мандельброта, почали розфарбовувати, використовуючи один і той самий колір для точок, траекторії яких залишають круг | z | ≤ 2 за одну й ту саму кількість кроків.
Результати своїх досліджень Мандельброт опублікував у 1975 році у монографії «Les Objets Fractals: Forme, Hasard et Dimension» («Фрактальні об’єкти: форма, випадковість і розмірность»). У цій книзі Мандельброт вперше використав термін «фрактал» для позначення феномену з непередбачуваною і дивовижною поведінкою. Ці феномени породжувалися при використанні рекурсивного алгоритма для отримання певної множини. Множина Мандельброта — один з таких феноменів, названий на честь свого дослідника.
Було зауважено, що точки, що лежать всередині певної кривої, належать до множини Мандельброта. Детальніше:
для довільної точки (x; y) обчислимо:
ρ = ((x – 1/4)2 + y)2)1/2 — відстань до точки (1/4; 0);
φ — кутовий аргумент вектора з координатами (x – 1/4; y);
ρс = (1 – cos φ)/2 — довжина вектора з кутовим аргументом φ, що солучає точку (1/4; 0) з точкою кривої, яку називають кардоїдою;
при справдженні рівності: ρ < ρс точка (x; y) належить до множини Мандельброта.
Цим можна скористатися для зменшення кількості обчислень при побудові зображення множини Мандельброта.
Подана далі прокоментована щодо змісту сталих і змінних програма записує у файл picture.txt для кожної екранної точки кількість кроків, необхідних для виходу траекторії за межі круга | z | ≤ 2.
{$N+}
const x0=-2; x1=-1; {межі зміни абсциси - дійсної частини}
y0=-0.5; y1=0.5; {межі зміни ординати - уявної частини}
nx=1027; ny=1027;{максимальні величини екранних координат}
max=998; {верхня межа кількості кроків вздовж траекторії}
type number=real; {тип, що задає точність подання дійсних чисел}
var o: text; {вихідний файл}
ix,iy, {екранні координати}
step: word; {кількість кроків до вихїоду за межі круга}
{дійсна та уявна частини:}
cx,cy, {початкової точки траекторії}
z1x,z1y, {попередньої точки траекторії}
z2x,z2y, {наступної точки траекторії}
phi: number; {кутовий аргумент}
pic: array[0..nx,0..ny] of word; {}
function out(x,y: number): boolean; BEGIN
out:=sqr(x)+sqr(y) > 4 END;
function angle(x,y: number): number; BEGIN
if (x=0) and (y=0) then begin
writeln('Zero vector!'); halt end;
if x > 0 then angle:= arctan(y/x)
else if (x = 0) and (y > 0) then angle:= pi/2
else if (x < 0) then angle:= pi+arctan(y/x)
else if (x = 0) and (y < 0) then angle:=3*pi/2
else angle:=2*pi+arctan(y/x)
END;
function card(x,y: number): boolean; BEGIN
if (x=0.25) and (y=0) then card:=true else begin
phi:=angle(x-0.25,y);
card:=4*(sqr(x-0.25)+sqr(y)) < sqr(1-cos(phi)) end END;
BEGIN
for iy:=0 to ny do begin
cy:=y1-iy*(y1-y0)/ny; for ix:=0 to nx do begin
cx:=x0+ix*(x1-x0)/nx;
if out(cx,cy) then pic[ix,iy]:=0 else
if card(cx,cy) then pic[ix,iy]:=max else begin
z1x:=cx;
z1y:=cy;
step:=0;
repeat
z2x:=sqr(z1x)-sqr(z1y)+cx;
z2y:=2*z1x*z1y+cy;
z1x:=z2x;
z1y:=z2y;
inc(step);
until (step=max) or out(z2x,z2y);
pic[ix,iy]:=step end end end;
assign(o,'picture.txt');
rewrite(o);
for iy:=0 to ny do begin
for ix:=0 to nx do write(o,pic[ix,iy],' ');
writeln(o) end;
close(o) END.
Наступна програма за даними файлу picture.txt будує зображення множини Мандельброта чи її частини.
uses graph; const color:array[0..13] of byte =(14,1,2,3,4,5,6,7,8,9,10,11,12,13); const nx=1027; ny=1027; {максимальні величини екранних координат} max=998; {верхня межа кількості кроків вздовж траекторії} var o: text; {вхідний файл} d,g: integer; {параметри detectgraph і initgraph} ix,iy: word; {екранні координати} pic: array[0..nx,0..ny] of word; BEGIN assign(o,'picture.txt'); reset(o); for iy:=0 to ny-1 do for ix:=0 to nx do read(o,pic[ix,iy]); detectgraph(d,g); initgraph(d,g,''); for iy:=0 to ny-1 do for ix:=0 to nx do begin if pic[ix,iy]=max then pic[ix,iy]:=0 else if pic[ix,iy]=0 then pic[ix,iy]:=15 else pic[ix,iy]:=color[pic[ix,iy] mod 14]; putpixel(ix,iy,pic[ix,iy]) end; readln end.
Подані далі рисунки 11–13 отримано зредагуванням копії екрану після запуску останньої програми побудови зображення.
Розглянувши перетворення комплексної площини: zn + 1 = znk + c, можна отримати узагальнення множини Мандельброта (див. рис. 14–16).
Узагальнювати можна не лише у напрмку збільшення степеня, але й у напрямку збільшення розмірності простору, у якому будують це узагальнення. Наприклад, так звану лампочку Мандельброта будують у R3, використовуючи сферичні координати r, θ, φ, запровадивши таку операцію піднесення до натурального степеня k елементів R3: