|
Фиг. 1 |
Тази графика (фиг. 1) е графично изображение на комплексни числа. На всяка точка от графиката съответства по едно комплексно число. Цветът на точките не е случаен -- черните точки съответстват на комплексни числа, които са елементи на едно безкрайно множество от комплексни числа, известно под името множество на Манделброт (Mandelbrot set), а точките оцветени в бяло съответстват на комплексни числа, които не принадлежат на това множество.
Фиг. 1 е приблизително изображение на множеството на Манделброт -- тя е изображение на едно крайно множество, повечето от елементите на което са елементи и на множеството на Манделброт. Това се отнася и за дадените по-долу други изображения, които могат да се разглеждат като увеличения на области от фиг. 1:
|
Фиг. 2 |
|
Фиг. 3 |
|
Фиг. 4 |
|
Фиг. 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 е различно от нула.
Съществуват и други числа, които не са елементи на множеството на рационалните числа, и използването на които има смисъл. Тези числа се наричат ирационални. Ето някои примери за такива числа:
Нека да обединим множеството на рационалните и множеството на ирационалните числа. Така формираме множеството на реалните числа.
Между множеството на реалните числа и точките от числовата ос има еднозначнообратимо изображение (съответствие). Това означава, че са верни следните твърдения:
Числовата ос, която е изображение на реалните числа, се нарича още реална ос.
Нека да се опитаме да решим следното квадратно уравнение:
x2 + 2.x + 17 = 0
Дискриминантата му е отрицателното число -64. В такъв случай квадратното уравнение няма реален корен. Но това не означава че то изобщо няма корен!
Нека да дефинираме една константа:
i2 = -1
Константата i не е елемент на множеството на реалните числа. Тя е имагинерно число.
Характерно за имагинерните числа е това, че след като се повдигнат на квадрат, резултатът е отрицателно реално число
Примери за имагинерни числа:
Всяко имагинерно число може да се представи като произведение на реално число с константата i. Например:
Тъй като
0.i = 0
можем ли да твърдим, че нулата е едновременно реално и имагинерно число?
Този въпрос малко ми напомня на въпроса "Естествено число ли е нулата?"(вж. по-горе). И все пак ще кажа, че имагинерните числа, по идея, са нереални. Не в смисъл, че не отговарят на реалността (каквото и да значи това), а в смисъл, че нито едно от тях не е елемент на множеството на реалните числа. Именно в това се състои смисъла на тяхното използване -- [да въведем друго числово множество, чрез използването на което,] да можем да опишем резултата при коренуване на отрицателните числа, който не е реално число. И тъй като нулата не може да се получи като коренуваме отрицателно число, отговорът на въпроса е негативен.
Нека сега да продължим с решението на квадратното уравнение. Прилагаме съответните формули и получаваме:
Аналогично намираме и другия корен на уравнението:
Получените корени на уравнението са комплексни числа.
Числата от вида
z = a + i.b,
където a и b са реални числа, се наричат комплексни числа.
Числото a се нарича реална част на комплексното число, а числото b -- имагинерна част.
Правилата за събиране, изваждане, умножение и деление на комплексните числа са същите, каквито са и съответните правила, за реалните числа. Добавено е само едно допълнително правило:
i2 = -1
Между комплексните числа и точките от двумерната равнина съществува съответствие, за което са изпълнени следните свойства:
Геометричното представяне на комплексните числа като точки, се нарича равнина на Арган.
Комплексното число
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 редицата ще бъде ограничена, а за други -- неограничена. Ако изобразим тези числа, при които редицата е ограничена с черен цвят, а останалите с бял, ще получим една графика, която много напомня на множеството на Манделброт:
|
Фиг. 8. Множеството на Джулиа J0,75 |
Границата на черното и бялото множество се нарича множество на Джулиа (Julia set) и се означава Jc (в конкретния случай J0,75, тъй като c=0,75).
Множеството на Джулиа се променя при промяна на c -- например при c=-0,1 + i.0,75 множеството на Джулиа J-0,1 + i.0,75 изглежда така:
|
Фиг. 9. Множеството на Джулиа J-0,1 + i.0,75 |
* * *
| Съдържание на архива 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 файл (съдържащ изображението на екрана) в текущата директория. Името му се избира автоматично (не се налага да го въвеждате). |
|
Фиг. 10. Файл получен посредством програмата mcalc017.exe |
* * *
Всякакви мнения, забележки, коментари и др. можете да ми пращате на адрес irealitylib(at)yahoo dot com.
Последна промяна: 31 Декември 2003 година
Брой посещения на страницата след 31 Май 2001 година:
© Валентин Стойков, 2003