Олександр Рудик

Основи фрактальної геометрії


1. Розмірність Мінковського

Означення 1. Розмірністю Мінковського обмеженої множини у метричному просторі називають таку границю:


lim
ε → 0
ln Nε
– ln ε
.

Тут Nε — найменше число множин діаметра ε, якими можна покрити множину. Якщо така границя не існує, то нижню й верхню границю відношення ln Nε/(– ln ε) називають відповідно верхньою та нижньою розмірностями Мінковського.

Безпосередньо з означення розмірності Мінковського маємо таке.

Зауваження 2. Розмірність Мінковського скінченного об’єднання множин дорівнює максимуму з їхніх розмірностей. Для зліченного об’єднання множин аналогічне висловлювання не справджується — див. приклад {0, 1, 1/2, 1/3, 1/4, …}.

2. Розмірність Хаусдорфа

Означення 2. Запровадимо такі поняття:

  1. Скінченну або зліченну множину{Aj}jJ підмножин метричного простору (X, ρ) називають ε-покриттям множини B, якщо справджуються такі дві умови:

    •    BAj ;
    jJ

    •    ∀ jJ      λ (Aj) < ε.
    Тут і далі λ (Aj) — діаметр множини Aj у метричному просторі (X, ρ).

  2. Для довільних додатного дійсного α і A = {Aj}jJпокриття множини B — запровадимо такі позначення:

    •    Fα(A) = λα(Aj);
    jJ
    •     Mαε(B) = inf {Fα(A)| A — ε-покриття B};

    •    Mα(B) = limMαε(B).
    ε↓0

Зауваження 2. Остання границя існує як дійсне число або + ∞, бо під знаком границі стоїть вираз, що не спадає при спаданні ε і відповідному звуженні множини, для якої шукають точну нижню межу. Ця границю називають α-мірою Хаусдорфа множини В. З точністю до множника:

Величина Mα(B) не зростає при зростанні α. Більше того,

(1)         ∃ α0α    (α < α0Mα(B) = + ∞) ∧ (α > α0Mα(B) = 0).

При α = α0 функція Mα(B) може дорівнювати 0, додатному числу або + ∞ залежно від множини B.

Означення 3. Розмірністю Хаусдорфа множини В називають число α0, задане вислов­люванням (1).

Зауваження 3. Розмірність Хаусдорфа має такі властивості:

(2)         j kd = 1 ⇔ kd = j – 1d = – logk j = log1/k j = ln j / ln k – 1.

3. Розмірність Лебега або топологічна розмірність

Означення 4. Запровадимо такі поняття.

  1. ε-покриттям метричного прострору називають покриття, всі елементи якого мають діаметр, що не перевищує ε.

  2. Кратністю скінченного покриття простору називають найбільше ціле k, при якому існує точка цього простору, що міститься у k елементах даного покриття.

  3. Для компактного метричного простору размірність Лебега чи топологічну розмірність означають як найменше ціле число n, при якому для довільного додатного ε існує скінчене відкрите ε-покриття простору, що має кратність n + 1.

Нульову топологічну розмірність має простір зі скінченною кількістю точок. Для відрізка топологічна розмірність дорівнює 1.

Вперше топологічну розмірність запрвадив Лебег (Henri Leon Lebesgue). Він висловив гіпотезу, що топологічна розмірність n-вимiрного куба дорівнює n. Брауер (Luitzen Egbertus Jan Brouwer) вперше це довів. Точне означення інваріанту для класу метричних компактів дав Урисон (Павло Самуїлович).

4. Множина Кантора

Означення 5. Множину Кантора — підмножину відрізку дійсних чисел [0,1], будують за допомогою послідовних наближень таким чином:

Множина Кантора містить усі ті точки відрізку [0, 1], які неможливо вилучити таким чином.



Рис. 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 році шведським математиком Хельге фон Кохом, будують за допомогою послідовних наближень-ламаних:



Рис. 2. Перші три наближення кривої Коха.

Згідно з означенням 6, криву Коха можна розбити на 4 частини, що подібні початковій кривій з коефіцієнтом подібності 1/3. Розмірність Хаусдорфа кривої Коха дорівнює ln 4 / ln 3 ≈ 1,2618595 — див. рівняння (2) при j = 4, k = 1/3.

Три копії кривої Коха, побудовані вістрями назовні на сторонах правильного трикутника, утворюють замкнену криву, так звану сніжинку Коха.















Рис. 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 та зміни кольорів тла і кривої.

Узагальнення кривої Коха можна отримати:

При побудові замкненої кривої (початок збігається з кінцем) за перше наближення можна брати не лише правильний трикутник, а, наприклад, квадрат, і проводити побудову як «назовні», так і «всередину» фігури.

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): Маємо:

Таким чином, неперервна крива {(x(t), y(t))}t∈[0, 1] повністю покриває квадрат [0, 1]2.

На рисунках 5–8 подано перші чотири наближення запровадженої вище кривої Пеано. Тут під n-им наближенням розуміємо ламану, що послідовно сполучає образи тих значень t, які у трійковій системі можна подати скінченним трійковим дробом з не більше ніж 2n знаками після коми.



Рис. 5. Перше наближення кривої Пеано.



Рис. 6. Друге наближення кривої Пеано.



Рис. 7. Третє наближення кривої Пеано.



Рис. 8. Четверте наближення кривої Пеано.

Рисунки 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. Килим Серпінського — один из двовимірних аналогів множини Кантора, запропонований польским математиком Вацлавом Серпінським, і відомий також як квадрат Серпінського — отримують таким чином.

  1. Квадрат C0 поділяють прямими, паралельними до його сторін, на 9 однакових квадратів.

  2. З квадрата C0 вилучаємо внутрішні точки центрального квадрата і отримуємо C1 — об’єднання 8 квадратів першого рівня.

  3. Діючи так само з кожним з квадратів першого порядку, отримаємо множину C2 — об’єднання 64 квадратів другого рівня. Продовжуючи цей процес нескінченно, отримаємо нескінченну послідованість:

    C0C1C3C4 ... .

    Інакше кажучи, розглянемо послідовно у порядку зростання всі натуральні числа n. З Cn — об’єднання 8n квадратів n-го рівня — отримуємо Cn + 1 — об’єднання 8n + 1 квадратів (n + 1)-го рівня — таким чином:

    • кожний квадрат n-го рівня поділяємо прямими, паралельними до його сторін, на 9 однакових квадратів;

    • вилучаємо внутрішні точки центрального з вказаних 9 квадратів і отримуємо квадрати (n + 1)-го рівня;

    • знаходимо Cn + 1 як об’єднання всіх квадратів (n + 1)-го рівня.

  4. Килим Серпінського знаходимо як перетин усіх членів послідовності {Cn}.



Рис. 9. Наближення килима Серпінського С5.

Рис. 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. Килим Серпінського — замкнена множина як перетин замкнених множин.

  2. Килим Серпінського має топологічну розмірність 1.

  3. Килим Серпінського є об’єднанням 8 подібних йому частини з коефіцієнтом подібності 1/3. Ці частини — квадрати першого рівня — перетинаються по сторонам, що мають розмірність 1. Розмірність Хаусдорфа килиму Серпінського дорівнює ln 8 / ln 3 ≈ 1,892789 — див. рівняння (2) при j = 8, k = 1/3.

  4. Скористаємося традиційним позначенням mes для міри Лебега, що є узагальненням:

    • на прямій — суми довжин проміжків без спільних точок;
    • на площині — площі плоскої фігури;
    • у (тривимірному) просторі — об’єму тіла.

    Маємо: mes(Cn) = mes(C0) ∙ (8/9)n, що збігається до 0 при прямуванні n до +∞. Тому міра Лебега килиму Серпінського дорівнює 0.

Означення 9. Серветка Серпінського — один из двовимірних аналогів множини Кантора, запропонований польским математиком Вацлавом Серпінським, і відомий також як трикутник чи ґратка Серпінського — отримують таким чином.

  1. Правильний трикутник S0 середніми лініями на 4 однакових трикутники.

  2. З трикутника S0 вилучаємо внутрішні точки трикутника, утвореного середніми лініями S0, і отримуємо S1 — об’єднання 3 трикутників першого рівня.

  3. Діючи так само з кожним з трикутників першого порядку, отримаємо множину S2 — об’єднання 9 трикутників другого рівня. Продовжуючи цей процес нескінченно, отримаємо нескінченну послідованість:

    S0S1S3S4 ... .

    Інакше кажучи, розглянемо послідовно у порядку зростання всі натуральні числа n. З Sn — об’єднання 3n трикутників n-го рівня — отримуємо Sn + 1 — об’єднання 3n + 1 трикутників (n + 1)-го рівня — таким чином:

    • кожний трикутник n-го рівня поділяємо середніми лініями на 4 однакових трикутники;

    • вилучаємо внутрішні точки трикутника, утвореного проведеними середніми лініями й отримуємо трикутники (n + 1)-го рівня;

    • знаходимо Sn + 1 як об’єднання всіх трикутників (n + 1)-го рівня.

  4. Серветку Серпінського знаходимо як перетин усіх членів послідовності {S n}.



Рис. 10. Наближення серветки Серпінського S7.

Рис. 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. Серветка Серпінського — замкнена множина як перетин замкнених множин.

  2. Серветка Серпінського має топологічну розмірність 1.

  3. Серветка Серпінського є об’єднанням 3 подібних їй частини з коефіцієнтом подібності 1/2. Ці частини — трикутники першого рівня — перетинаються по трьом одноелементним множинам, що мають розмірність 0. Розмірність Хаусдорфа серветки Серпінського дорівнює ln 3 / ln 2 ≈ 1,5849625 — див. рівняння (2) при j = 3, k = 1/2.

  4. mes(Sn) = mes(S0) ∙ (3/4)n, що збігається до 0 при прямуванні n до +∞. Тому міра Лебега серветки Серпінського дорівнює 0.

8. Множина Мандельброта

Означення 10. Множиною Мандельброта називають множину усіх тих комплексних чисел с, при яких послідовність, задана таким рекурентним співвідношенням:

zn + 1 = zn2 + c,     z0 = 0,

обмежена.

Якщо комплексні числа подати у нормальній алгебричній формі:

zn= xn + iyn;
c = a + ib

при дійсних xn, yn, a, b, то отримаємо такі рекурентні співвідношення:

xn + 1= xn2yn2 + a;
yn + 1= 2 xn yn + b.

Вперше таку множину, описав у 1905 році французький математик П’єр Фату (Pierre Fatou), який вивчав послідовні образи (орбіту) перетворення:

zz2 + c.

Він довів, що орбіта точки, розташованої на відстані більшій ніж 2 від початку координат, завжди прямує до нескінченності.

Фату не міг бачити зображень, які відомі зараз як зображення множини Мандельброта, бо відповідні обчислення неможливо виконати без комп’ютера. Професор Бенуа Мандельброт бул першим, хто використав комп’ютера для дослідження таких перетворень. Спочатку такі зображення були чорно-білими:

Згодом множину точок, що не належать до множини Мандельброта, почали розфарбовувати, використовуючи один і той самий колір для точок, траекторії яких залишають круг | z | ≤ 2 за одну й ту саму кількість кроків.

Результати своїх досліджень Мандельброт опублікував у 1975 році у монографії «Les Objets Fractals: Forme, Hasard et Dimension» («Фрактальні об’єкти: форма, випадковість і розмірность»). У цій книзі Мандельброт вперше використав термін «фрактал» для позначення феномену з непередбачуваною і дивовижною поведінкою. Ці феномени породжувалися при використанні рекурсивного алгоритма для отримання певної множини. Множина Мандельброта — один з таких феноменів, названий на честь свого дослідника.

Було зауважено, що точки, що лежать всередині певної кривої, належать до множини Мандельброта. Детальніше:

Цим можна скористатися для зменшення кількості обчислень при побудові зображення множини Мандельброта.

Подана далі прокоментована щодо змісту сталих і змінних програма записує у файл 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 отримано зредагуванням копії екрану після запуску останньої програми побудови зображення.



Рис. 11. Множина Мандельброта у межах квадрата [–2; 2]2




Рис. 12. Множина Мандельброта у межах [–2; 0] × [–1; 1].




Рис. 13. Множина Мандельброта у межах [–2; –1] × [–0,5; 0,5].


Розглянувши перетворення комплексної площини: zn + 1 = znk + c, можна отримати узагаль­нення множини Мандельброта (див. рис. 14–16).



Рис. 14. Узагальнення множини Мандельброта при k = 3 у межах квадрата [–1,5; 1,5]2




Рис. 15. Узагальнення множини Мандельброта при k = 3 у межах [–0,75; 0,75] × [0; 1,5]




Рис. 16. Узагальнення множини Мандельброта при k = 3 у межах [–0,375; 0,375] × [0,75; 1,5]

Узагальнювати можна не лише у напрмку збільшення степеня, але й у напрямку збільшення розмірності простору, у якому будують це узагальнення. Наприклад, так звану лампочку Мандельброта будують у R3, використовуючи сферичні координати r, θ, φ, запровадивши таку операцію піднесення до натурального степеня k елементів R3:

(r cos θ cos φ, r cos θ sin φ, r sin θ)k = (rk cos cos , rk cos sin , rk sin ).