Множеството на Манделброт (Mandelbrot set)

Фиг. 1

Тази графика (фиг. 1) е графично изображение на комплексни числа. На всяка точка от графиката съответства по едно комплексно число. Цветът на точките не е случаен -- черните точки съответстват на комплексни числа, които са елементи на едно безкрайно множество от комплексни числа, известно под името множество на Манделброт (Mandelbrot set), а точките оцветени в бяло съответстват на комплексни числа, които не принадлежат на това множество.

Фиг. 1 е приблизително изображение на множеството на Манделброт -- тя е изображение на едно крайно множество, повечето от елементите на което са елементи и на множеството на Манделброт. Това се отнася и за дадените по-долу други изображения, които могат да се разглеждат като увеличения на области от фиг. 1:

Увеличение на област от фиг.  1

Фиг. 2

 

Увеличение (два пъти) на левия участък от фиг. 2

Фиг. 3

 

Увеличена област от фиг.  1

Фиг. 4

 

Увеличена област от фиг.  1

Фиг. 5

 

Въпреки голямата си сложност, множеството на Манделброт се определя от едно забележително просто правило. В следващите редове ще се опитам да обясня какво е това комплексно число и какво е правилото по което се определя дали дадено комплексно число е елемент на множеството на Манделброт.

От тази страница можете да си изтеглите програма, която изобразява множеството на Манделброт.

 

 

 

Числови множества

Понятието множество е първично понятие в математиката и поради тази причина определение за него не се дава. Обектите, от които се състои дадено множество, се наричат още негови елементи.

Ако дадено множество се състои от краен брой елементи, то това множество се нарича крайно. Множество, което се състои от безкраен брой елементи се нарича безкрайно. Множеството, което не съдържа нито един елемент се нарича празно множество. Множество, което се състои от числа се нарича числово множество, а множество състоящо се от точки -- точково множество.

Пример за числово множество е множеството на естествените числа. Във повечето от книгите по математика (включително и в небезизвестните Четиризначни математически таблици и формули) естествените числа се дефинират така:

N = { 1, 2, 3, 4, ..., n, ... }

Друго определение за естествено число:

N = { 0, 1, 2, 3, 4, ..., n, ... }

Такова е определението за естествено число [на стр. 106] в книгата на Роджър Пенроуз Новият разум на царя, С., Унив. изд. Св. Климент Охридски, 1998 (оригинално публикувана на английски език под заглавие The Emperor's New Mind, Oxford University Press, 1989). Това е една от най-добрите книги, които съм чел! Ако още не сте я прочели, ви препоръчвам да го направите!

Разликата между двете дефиниции се състои единствено в това, че според втората, нулата е естествено число.

Такива противоречия могат да се избегнат, ако просто не се използва термина естествено число, като вместо него се използват понятията цяло положително число или цяло неотрицателно число.

Характерно за множеството на естествените числа (и не само за това числово множество, както ще видим по-нататък) е това, че при прилагането на някои операции над числа от него, резултатът не е елемент на същото множество. Пример за такава операция е изваждането на по-голямо естествено число от по-малко, при което резултатът е отрицателно число. За да се направи операцията изваждане винаги възможна се налага са се използва друго числово множество, което да включва и отрицателните числа.

Така, поради обективна необходимост, формираме множеството на целите числа:

Z = { ..., -n, ..., -4, -3, -2, -1, 0, 1, 2, 3, 4, ..., n, ... }

Съществуват ли операции над елементи на множеството на целите числа, резултатът от които да не е цяло число?

Да!

Пример за такава операция е делението. И отново ни се налага да разширим числовото множество което използваме. Формираме множеството на рационалните числа.

Това са числа от вида a/b, където a и b са цели числа и b е различно от нула.

Съществуват и други числа, които не са елементи на множеството на рационалните числа, и използването на които има смисъл. Тези числа се наричат ирационални. Ето някои примери за такива числа:

Тези числа са елементи на множеството на ирационалните числа

Нека да обединим множеството на рационалните и множеството на ирационалните числа. Така формираме множеството на реалните числа.

 

 

Геометрично представяне на реалните числа

Между множеството на реалните числа и точките от числовата ос има еднозначнообратимо изображение (съответствие). Това означава, че са верни следните твърдения:

  1. Всяко реално число съответства на точно определена точка от числовата ос;
  2. Всяка точка от числовата ос, съответства на точно това реално число, което съответства на нея.

Числовата ос, която е изображение на реалните числа, се нарича още реална ос.

 

 

Комплексни числа

Нека да се опитаме да решим следното квадратно уравнение:

x2 + 2.x + 17 = 0

Дискриминантата му е отрицателното число -64. В такъв случай квадратното уравнение няма реален корен. Но това не означава че то изобщо няма корен!

Нека да дефинираме една константа:

i2 = -1

Константата i не е елемент на множеството на реалните числа. Тя е имагинерно число.

Характерно за имагинерните числа е това, че след като се повдигнат на квадрат, резултатът е отрицателно реално число

Примери за имагинерни числа:

Имагинерни числа

Всяко имагинерно число може да се представи като произведение на реално число с константата i. Например:

Ако умножим реално число с константата i, ще получим имагинерно число

Тъй като

0.i = 0

можем ли да твърдим, че нулата е едновременно реално и имагинерно число?

Този въпрос малко ми напомня на въпроса "Естествено число ли е нулата?"(вж. по-горе). И все пак ще кажа, че имагинерните числа, по идея, са нереални. Не в смисъл, че не отговарят на реалността (каквото и да значи това), а в смисъл, че нито едно от тях не е елемент на множеството на реалните числа. Именно в това се състои смисъла на тяхното използване -- [да въведем друго числово множество, чрез използването на което,] да можем да опишем резултата при коренуване на отрицателните числа, който не е реално число. И тъй като нулата не може да се получи като коренуваме отрицателно число, отговорът на въпроса е негативен.

Нека сега да продължим с решението на квадратното уравнение. Прилагаме съответните формули и получаваме:

Единият корен на уравнението е -1 + i.4

Аналогично намираме и другия корен на уравнението:

Другият корен на уравнението е -1 + i.(-4)

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

Числата от вида

z = a + i.b,

където a и b са реални числа, се наричат комплексни числа.

Числото a се нарича реална част на комплексното число, а числото b -- имагинерна част.

Правилата за събиране, изваждане, умножение и деление на комплексните числа са същите, каквито са и съответните правила, за реалните числа. Добавено е само едно допълнително правило:

i2 = -1

 

 

Геометрично представяне на комплексните числа

Между комплексните числа и точките от двумерната равнина съществува съответствие, за което са изпълнени следните свойства:

  1. Всяко комплексно число съответства на точно определена точка от равнината;
  2. Всяка точка от равнината, съответства на точно това комплексно число, което съответства на нея.

Геометричното представяне на комплексните числа като точки, се нарича равнина на Арган.

Комплексното число

z = x + i.y

се представя в равнината на Арган чрез точка с координати (x,y).

Равнина на Арган

Фиг. 6. Геометрично представяне на комплексното число z = x + i.y чрез точка.

Разстоянието r между изображението на комплексното число и началото на координатната система, се нарича модул на комплексното число и се определя по теоремата на Питагор:

r2 = x2 + y2

 

Съществува и друг начин за геометрично представяне на комплексните числа -- чрез вектор, началото на който съвпада с началото на координатната система, а краят му има координати (x,y), където x е реалната съставка на комплексното число, а y -- имагинерната му съставка.

Дължината на вектора е модул на комплексното число

Фиг. 7. Геометрично представяне на комплексното число z = x + i.y чрез вектор.

 

 

Множеството на Манделброт

Нека да дефинираме една безкрайна редица от комплексни числа:

z1 = 0

zn = zn-12 + c

Това означава, че първият член на редицата е нула, вторият е c, а всеки следващ е функция от предходния: f(x) = x2 + c

Ето например първите няколко члена на редицата:

z1 = 0

z2 = c

z3 = c2 + c

z4 = ( c2 + c )2 + c

z5 = ( ( c2 + c )2 + c )2 + c

. . . . .

Ако заместим c с комплексно число от множеството на Манделброт, получената редица ще бъде ограничена. Това означава, че геометричното представяне на всички членове на тази безкрайна редица ще се намират в някаква окръжност с краен радиус, и център в началото на координатната система.

При заместване на c с комплексно число, което не е елемент на множеството на Манделброт, редицата ще бъде неограничена.

Т. е. за да се определи дали дадено комплексно число c е елемент на множеството на Манделброт трябва да се определи дали безкрайната числова редица

0, c, c2 + c, ( c2 + c )2 + c,....

е ограничена. Това изисква да се изчислят всичките и членове (броят на които е безкраен!).

На пръв поглед изглежда, че това правило ни дава възможност да създадем алгоритъм, който да определя дали дадено комплексно число е елемент на множеството на Манделброт.

В действителност това може би не е така!

Засега няма известен алгоритъм, който да определи дали дадено число е елемент на множеството на Манделброт!

Тук читателят, осъзнал горните твърдения, вероятно ще попита "Как така не e известен такъв алгоритъм? Нали графиките показани на тази страница са получени посредством именно такъв алгоритъм (програма)?".

Отговорът на тези въпроси е следният:

Първо. Тези графики не са точни изображения на множеството на Манделброт. Самият факт, че множеството на Манделброт е безкрайно, а броят на пикселите на тези изображения е краен, е достатъчен аргумент за това.

Второ. Тези графики не са получени посредством алгоритъм, който определя дали дадено комплексно число принадлежи на множеството на Манделброт. Те са получени чрез използването на алгоритъм, който определя приблизително дали дадено число, което е елемент на едно крайно подмножество на множеството на комплексните числа, е елемент на множеството на Манделброт.

Трето. Дефинираното по-горе правило не е алгоритъм, тъй като всеки алгоритъм трябва да бъде определен по такъв начин, че независимо от конкретните начални данни, крайните резултати да могат да се получават след краен брой стъпки, съставляващи алгоритъма.

За да не бъда голословен ще дам една проста програма, написана на езика за програмиране Паскал, която [приблизително] определя дали дадено число е елемент на множеството на Манделброт:



 Program Simple_Demo_Program;

 type ComplexNumber=record
                     R:extended; {Реална     част на комплексното число}
                     I:extended  {Имагинерна част на комплексното число}
                    end;

 var Data:ComplexNumber;


 Function Mandelbrot(A:ComplexNumber):boolean;

 const Max:extended=5.0; { Радиуса на окръжността                   }
       N:LongInt=5000;   { Максимален брой на членовете на редицата }

 var V,Rez:ComplexNumber;
     K:LongInt;

 begin { Mandelbrot }
  Mandelbrot:=TRUE;

  V.R:=0.0; { Първият член на редицата     }
  V.I:=0.0; { е нула                       }

  for K:=2 to N do
    begin  { Изчисляване на членовете на редицата с номера от 2 до N }

       Rez.R:=( V.R*V.R - V.I*V.I + A.R ); { Изчисляване на поредния }
       Rez.I:=(  2 * V.R * V.I    + A.I ); { член на редицата        }
       {         Rez =  V^2 + A          }

       V:=Rez;

      { Ако някой от членовете на редицата се окаже извън окръжността, }
      { това означава, че редицата не е ограничена. В такъв случай     }
      { функцията връща стойност FALSE - комплексното число A не е     }
      { елемент на множеството на Манделброт.                          }
      if sqrt( sqr(Rez.R) + sqr(Rez.I) ) > Max then begin
                                                     Mandelbrot:=FALSE;
                                                     break
                                                    end;

    end;

 end;  { Mandelbrot }


 BEGIN

  Write('Въведете реалната     част на комплексното число: ');
  ReadLn(Data.R);

  Write('Въведете имагинерната част на комплексното число: ');
  ReadLn(Data.I);

  if Mandelbrot(Data) then Writeln('Комплексното число Е елемент на множеството на Манделброт!')
                      else Writeln('Комплексното число НЕ Е елемент на множеството на Манделброт!');


 END.


За да определи дали дадено комплексно число c е елемент на множеството на Манделброт, програмата изчислява краен брой членове на редицата

0, c, c2 + c, ( c2 + c )2 + c,....,

максималният брой на които, се определя от константата N, и за всеки от тях, проверява дали графичното му изображение, се намира извън окръжност с център в началото на координатната система, и краен радиус, големината на който е определена от константата Max. Ако някой член от редицата премине извън този радиус, това означава, че редицата не е ограничена, а от това следва, че комплексното число c не е елемент на множеството на Манделброт.

Ако всички, изчислени от програмата, членове на редицата се намират вътре в окръжността, то програмата решава, че редицата е ограничена, от което следва, че комплексното число c е елемент на множеството на Манделброт.

Ако стартираме програмата и въведем комплексното число

0,102144 + i.0,60202

програмата ще ни съобщи, че то е елемент на множеството на Манделброт.

Нека да увеличим стойността на константата N десет пъти, т.е. да я променим от 5000 на 50000. Това означава, че сега програмата ще проверява не 5000, а 50000 комплексни числа. Отново стартираме програмата и въвеждаме същото комплексно число, което въведохме при първото стартиране. Но този път програмата твърди, че то не е елемент на множеството на Манделброт! Оказва се, че комплексното число, с пореден номер 22237 от редицата се намира извън окръжността. Програмата ни излъга първия път, защото е проверявала само първите 5000 комплексни числа от редицата.

Колкото и да увеличаваме константата N, е възможно членът на редицата с пореден номер N + 1 да попадне извън окръжността и програмата да даде грешен отговор.

* * *

 

 

Множеството на Джулиа

Нека изследваме редицата от комплексни числа:

z1 = d

zn = zn-12 + c

При какви условия редицата е ограничена?

Нека c = 0,75. Оказва се че за някои стойности на d редицата ще бъде ограничена, а за други -- неограничена. Ако изобразим тези числа, при които редицата е ограничена с черен цвят, а останалите с бял, ще получим една графика, която много напомня на множеството на Манделброт:

Множество на Джулиа (Julia set) е границата на черното и бялото множество

Фиг. 8. Множеството на Джулиа J0,75

Границата на черното и бялото множество се нарича множество на Джулиа (Julia set) и се означава Jc (в конкретния случай J0,75, тъй като c=0,75).

Множеството на Джулиа се променя при промяна на c -- например при c=-0,1 + i.0,75 множеството на Джулиа J-0,1 + i.0,75 изглежда така:

Множеството на Джулиа при c=-0,1 + i.0,75

Фиг. 9. Множеството на Джулиа J-0,1 + i.0,75

* * *

 

 

programs.zip

 

Съдържание на архива programs.zip (125KB)
Файл Описание
mcalc017.exe

Изобразява множеството на Манделброт. При натискане на F2 записва на диска *.bmp файл с изображението на екрана.

mcalc017.pas

Сорс кода на mcalc017.exe

xcalc013.exe

Тази програма може да изобразява, освен множеството на Манделброт, и други множества от комплексни числа приличащи на множеството на Манделброт. Разликата между множеството на Манделброт и другите множества се състои в това, че вместо функцията f(x) = x2 + c се използва функцията f(x) = x2 + L.c, където L е реално число. Очевидно при L = 1 двете функции са еквивалентни. L може да се изменя, при натискане на клавиша L.

xcalc013.pas

Сорс кода на xcalc013.exe

cmclc000.exe

Изобразява множеството на Манделброт с повече цветове.

cmclc000.pas

Сорс кода на cmclc000.exe

driv.obj

Този файл е необходим при компилирането на всички програми описани по-горе. Съдържа VGA драйвер.

 

Предназначение на някои от клавишите
PageUp, PageDown,  + ,  - 

Промяна на увеличението. Може да се използва и Z.

[up], [down], [left], [right]

Служат за придвижване в съответните посоки. За по-голяма точност могат да се използват и клавишите X и Y.

Ctrl+PageUp, Ctrl+PageDown

Промяна на максималния брой комплексни числа от редицата, които се изчисляват. На практика води до промяна на точността на изчисленията. Този брой не трябва да е нито много голям, нито много малък! Със същото предназначение е клавишът N.

F1

Промяна на размерите на изчисляваната графика на 640x480 пиксела.

F3

Промяна на размерите на изчисляваната графика на 140x80 пиксела.

F4

Промяна на размерите на изчисляваната графика на 610x320 пиксела.

F2

Записва *.BMP файл (съдържащ изображението на екрана) в текущата директория. Името му се избира автоматично (не се налага да го въвеждате).

 

Това е графика, получена посредством програмата mcalc017.exe

Фиг. 10. Файл получен посредством програмата mcalc017.exe

 

* * *

 

 

 

Всякакви мнения, забележки, коментари и др. можете да ми пращате на адрес irealitylib(at)yahoo dot com.

Можете да напишете и изпратите писмото направо от тук:

Вашето име:
Вашият e-mail адрес:
Текст на писмото:
   

 

 

Последна промяна: 31 Декември 2003 година

 

Брой посещения на страницата след 31 Май 2001 година: Triada Free Counter

 

 

Книги от Books.bg

 

 

Научна фантастика

 

books.bg       

 

 


© Валентин Стойков, 2003

 

Сайт создан в системе uCoz