Komplekse tal og Kaos Jon Sporring Datalogisk Institut ved Københavns Universitet Universitetsparken 1, 2100 København Ø August, 2006 1 Forord Denne opgave er tiltænkt gymnasiestuderende med matematik på højt niveau. Opgaven omhandler komplekse tal og Mandelbrots mængde. Yderligere litteratur kan findes bla. i [1]. Opgaven indeholder først en introducerende beskrivelse, en algoritme og derefter en implementation i programmeringssproget C. Den afsluttende opgave kan løses på 2 niveauer. Ifald der er en computer med en C-oversætter (C-compiler) tilgængelig vil man kunne eksperimentere med programmet, og den samlede opgave forventes at kunne løses på 3 timer. I den forbindelse kan gratis pakken Cygwin anbefales (http://cygwin.com), men man vil skulle erstatte kaldet til cc med gcc. Hvis programmeringsopgaven vælges fra forventes det, at opgaven kan løses på 1 time. 1
2 Andengradsligninger og kvadratroden af negative tal En andengradsfunktion kan skrives som, f(x) = ax 2 + bx + c, hvor x er variablen og a, b og c er koefficienter. Ofte ønsker støder man på problemer, hvor man kender koefficienterne og skal finde de eller de værdier af x, som løser ligningen, 0 = f(x) = ax 2 + bx + c. En lukket forms løsning (efter Eng. Closed Form http://en.wikipedia.org/wiki/closed_form) er givet ved, x ± = b ± d, hvor d = b 2 4ac. Løsningerne kan klassificeres efter fortegnet på d: > 0 2 reelle løsninger d = 0 1 reel løsning < 0 0 reelle løsninger At dette er en løsning kan afprøves ved at indsætte en løsning i ligningen, her plus løsningen, ( b + ) d f(x + ) = f ( b + ) 2 ( d b + ) d = a + b + c = a(b2 + d 2b d) 4a 2 + b2 + b d + c = b2 + d 2b d 2b 2 + 2b d + 4ac 4a = b2 + d + 4ac 4a = b2 + b 2 4ac + 4ac 4a = 0 Bemærk, at det ikke her er nødvendigt at antage, at d 0, hvilket inspirerer til en indførelsen af en ny slags tal, komplekse tal, der består af en reel og en imaginær del. Komplekse tal kan skrives på flere måder, men den hyppigste er, z = x + iy, hvor x og y er reelle tal og i kaldes den komplekse konstant og er defineret som, i 2 = 1, eller skrevet på en anden måde, i = 1. 2
Imaginære akse y x+iy x Reele akse Operation Regneregel Figur 1: Et komplekst tal tegnet som en vektor. Addition z 1 + z 2 = (x 1 + iy 1 ) + (x 2 + iy 2 ) = (x 1 + x 2 ) + i(y 1 + y 2 ) Multiplikation z 1 z 2 = (x 1 + iy 1 )(x 2 + iy 2 ) = (x 1 x 2 y 1 y 2 ) + i(x 1 y 2 + y 1 x 2 ) Division z 1 z 2 = x 1 + iy 1 x 2 + iy 2 = (x 1x 2 + y 1 y 2 ) + i(y 1 x 2 x 1 y 2 ) x 2 2 + y2 2 Længde z = x + iy = x 2 + y 2 Vinkel z = (x + iy) = tan 1 y x Tabel 1: Almindelige regneregler for komplekse tal. Med de komplekse tal vil man derfor kunne regne med negative kvadratrødder, således at 2 = i 2 1.41421i, og klassifikation af løsningerne for andengradsligninger kan udvides til, > 0 2 reelle løsninger d = 0 1 reel løsning < 0 2 komplekse løsninger Komplekse tal håndterer problemet med kvadratroden af negative tal på en elegant måde håndterer alle frihedsgrader i et andengradspolynomium. Komplekse tal kan med fordel visualiseres som en vektor, hvis komponenter er den reelle og den imaginære del. Dette ses i Figur 1. Denne analogi er til tider misvisinde, da nogle regneregler er forskellige for komplekse tal. De mest almindelige regneregler er givet i Tabel 1. 3 Iterative funktioner og Mandelbrots mængde At løse ligninger er helt fundamentalt for vores dagligdag; f.eks. hvis vi vil købe vingummier for 10 Kr. og stykprisen er 25 øre per vingummi, er det let at beregne det maksimale antal vingummier vi kan købe. Men mange funktioner lader sig ikke løse på lukket form. En rig klasse af funktioner er de iterative funktioner, og renteberegning er et eksempel på en funktion som både har iterativ foreskrift og en lukket forms løsning: Hvis man f.eks. har 10 Kr stående på en konto i banken, og der hvert år bliver tilskrevet 1% i renter af indestående beløb vil man er den iterative foreskrift givet ved, b i+1 = 1,01b i 3
under antagelse at b i er indestående beløb efter i år. Efter 5 år vil man så have, b 5 = 1,01b 4 = 1,01 2 b 3 = = 1,01 5 b 0, hvor sidstnævnte er en løsning på lukket form, og hvis b 0 = 10Kr vil b 5 = 10,51Kr. Mandelbrots mængde tager udgangspunkt i en meget simpel iterativ foreskrift: z j+1 = z 2 j + c, z 0 = 0 (1a) (1b) hvor z og c er komplekse tal. Mandelbrots mængde er afbildet på forsiden med hvid, og udover at Mandelbrots mængde har en smuk form, så er den fraktal, dvs. at det sjove billede på stor skala gentager sig i det uendelige som små versioner flere steder i mængden, og endelig ved man, at mængden er sammenhængende, dvs. at man kan bevæge sig rundt fra et vilkårligt punkt i mængden til et vilkårligt andet uden at forlade den. Mandelbrots mængde er defineret som de komplekse værdier af konstanten c, hvor z j+1 ikke divergerer, dvs. hvor z j+1 < når j. Altså, man vælger et c, udregner z 1 = 0 2 +c, z 2 = z 2 1 +c = c 2 +c, osv. indtil man kan afgøre, om z divergerer. Dette gentager man så for en anden værdi af c indtil man har fundet alle medlemmer, eller som i tilfældet af billedet på forsiden, indtil man har udfyldt alle pixels i billedet. Det lyder som meget arbejde, men heldigvis ved man, at ligesåsnart z k > 2 så er den tilhørende kompleks konstant c er ikke medlem af Mandelbrots mængde. For visuel nydelse afbilleder man derfor oftest det k, hvor z k bliver for lang, og hvis man har itereret tilpas mange gange uden divergens, antager man at c er medlem. Som program ser denne proces ud som vist i Figur 2. Programmet er et C-program, som oversættes med, cc -o mandelbrot mandelbrot.c -lm under antagelse af at programmet er gemt i en tekstfil ved navn mandelbrot.c. 4 Opgave 1. Eftervis, at x = b d er en løsning for en andengradsligning. 2. Kvadratlængen af et komplekst tal, z 2, kan skrives som produktet af z med dens konjugerede, z 2 = z z. Hvordan må den konjugerede så se ud? 3. Den konjugerede benyttes til at definere division af 2 komplekse tal, z 1 z 2 = z 1 z 2 z 2 z 2. Eftervis, at ovennævnte måde at beregne divisionen resulterer i Divisions operationen som givet i Tabel 1. 4. Udregn z 1... z 3 vha. ligningerne i (1) og for to forskellige komplekse konstanter, c = 1 + i1 og c = 0.1 + i0.1. 5. Indtast programmet i Figur 2 og betragt det producerede billede men en billedfremviser som kan læse pgm-billeder. Hvis det ikke ligner billedet på forsiden, har du lavet en indtastningsfejl. 6. Prøv at zoome ind på dele af mængden ved at ændre cmin og cmax erne og se, om du kan finde en lille kopi af den store mængde. 4
/* Program: mandelbrot.c, beregner Mandelbrots mængde */ /* Banekurver for z = z^2 + c undersøges for konvergens for den */ /* komplekse variabel z og konstant c, startende i z = 0. */ /* Jon Sporring, DIKU, 2006 */ #include <stdio.h> #include <math.h> int main() { /* Interval af c-konstanten, som der undersøges: */ double CxMin = -1.9, CxMax = 0.6; /* Alt: CxMin = -1.5, CxMax = -1.3; */ double CyMin = -1.25, CyMax = 1.25; /* CyMin = -0.1, CyMax = 0.1; */ int N = 1024; /* Resultatbilledets størrelse (NxN) */ char *filename = "mandelbrot.pgm"; /* Filnavn til resultatbilledet */ /* Hjælpe variable */ int m, n, I, iter, itermax = 512; /* itermax < 65536 */ double Cx, Cy, Zx, Zy, Tx, Ty; FILE *fp; if ((fp = fopen(filename, "w")) == NULL) { fprintf(stderr, "Filen %s kan ikke skrives til\n",filename); return 1; fprintf(fp, "P2 %d %d %d\n", N, N, 255); /* Billed header for pgm */ for(m = 0; m < N; m++) { Cx = CxMin + (CxMax-CxMin)*m/(N-1); /* Fra 0..N-1 til CxMin..CxMax */ for(n = 0; n < N; n++) { Cy = CyMin + (CyMax-CyMin)*n/(N-1); /* Fra 0..N-1 til CyMin..CyMax */ I = itermax; Zx = 0; Zy = 0; for(iter = 0; iter < itermax; iter++) { /* Z^2 = (Zx+i*Zy)*(Zx+i*Zy) = (Zx^2-Zy^2)+i*(2*Zx*Zy) */ Tx = Zx*Zx-Zy*Zy + Cx; Ty = 2*Zx*Zy + Cy; Zx = Tx; Zy = Ty; if(zx*zx+zy*zy >= 4.0) { /* Når længden > 2 er divergensen sikker. */ I = iter; break; fprintf(fp," %d", (int)(255*log(i+1)/log(itermax+1))); /* Logaritmisk skala */ fprintf(fp,"\n"); fclose(fp); return 0; Figur 2: Et C-program, der udregner Mandelbrots mængde. 5
Litteratur [1] Robert L. Devaney. A First Course in Chaotic Dynamical Systems, Theory and Experiment. Addison- Wesley Publishing Company, 1992. 6