Fraktálok és káosz Szirmay-Kalos László
A természet geometriája Euklideszi geometria metrikus Sima egyenesre/síkra épít (analízis: differenciálás) Kicsiben mindenki lineáris: Skálafüggőség Méret lényeges (milyen méret: dimenzió kapcsolat) Méret: szakasz, négyzet, kocka lefedés Dimenzió: algebra = független változók, topológia=kettévágás Hossz (1D); terület (2D); térfogat (3D) Ember alkotta objektumokra jó Természet Méret nem releváns (zérus vagy végtelen): dimenzió? Nem sima (nem differenciálható) Kicsiben is ugyanolyan: Skálafüggetlenség
(Helge von) Koch görbe: hossz végtelen l n = l 0 4 3 n Véges tartományban végtelen hosszú: Dimenzió > 1 Területe zérus Dimenzió < 2 Folytonos Sehol sem differenciálható (tüskés) Önhasonló
(Felix) Hausdorff dimenzió önhasonló objektumokra r = 1/ 2 N = 4 N = 8 N = 2 N = 1/r D D = log (N) log (1/r)
Koch görbe Hausdorff dimenziója r = 1/3 N = 4 D = log (4) log (3) 1.26
Lindenmayer (Arisztid) rendszerek F F+60F-120F+60F r = 1/3, N = 4, D=log(4)/log(3)=1.26 F F+90F-90F-90FF+90F+90F-90F r = 1/4, N = 8, D=log(8)/log(4)=1.5 F F+90F-90F-90F-90F+90F+90F+90F-90F r = 1/3, N = 9, D=log(9)/log(3)=2 Peano/Hilbert térkitöltő görbe
Nem önhasonló objektumok: vonalzó dimenzió N = 1/r D Vonalzó (l) db l 1 r =1/3 N = 4 r 2 N 2 r m N m Hossz(l) = l db = l N m = l (1/r D ) m = = l (1/r m ) D = 1/ l D-1 D = - log(hossz(l))/log(l) + 1
Dimenziómérés = hosszmérés EEG görbe log Hossz( l ) D-1 log l Alkalmazás: Természetes objektumok elkülönítése és kategorizálása
Fraktálok előállítása Matematikai gépek: L-rendszerek Fraktális (1/f ) zaj: Brown mozgás, Perlin zaj Kaotikus dinamikus rendszerek (véletlenszám generátor)
F F+60F-120F+60F Lindenmayer rendszerek
Vágás, Homogén osztás Vágás, homdiv Viewport tr. Raszterizáció transzform Viewport transzform Raszterizáció rasztertár Geometry shader csúcspontok vertex shader primitívek geometry shader gl_position reg1 reg2 reg3 reg4 pixelek gl_fragcoord reg1 reg2 reg3 reg4 Pixel cím Pixel szín Fragment shader VAO/VBO Textúrák GPU memória CPU
Fraktális zaj /9 /3 = 1/(2 3) Skála Részlet N = 4 N 2 = 16 /3 N m = 4 m /3 m-1 szórás
(1) S (Ken) Perlin zaj n( p) (2) S (3) S p p
Iterált függvények, fix point, stabilitás x n+1 = F(x n ) x 1 = F(x 0 ) x 2 = F(x 1 ) = F(F(x 0 )) x * = F(x * ) Fix point x 3 = F(x 2 ) = F(F(F(x 0 ))) Stabilitás: F (x * ) < 1 x * + x n+1 = F(x * + x n ) F(x * ) + F (x * ) x n x n+1 F (x * ) x n Labilis Stabil
Kaotikus dinamikus rendszer: nyulak kis C értékre S n+1 S n+1 = C S n (S max -S n ) S n S n+1 = S n Iteráció: S n+1 = F(S n ) Fix pont: S * = F(S * ) Stabil: F (S * ) < 1 S n n
Kaotikus dinamikus rendszer: nyulak közepes C értékre S n+1 S n S n+1 = S n stabil labilis S n+1 = C S n (S max -S n ) S n n
Kaotikus dinamikus rendszer: nyulak nagy C értékre S n+1 S n labilis labilis S n+1 = C S n (S max -S n ) S n n
Káosz A rendszer determinisztikus, de Kezdeti állapot hatása eltűnik Kis perturbáció nagyon eltérő viselkedéshez vezet Auto-korrelációs függvény zérushoz tart Korábbi állapot gyengén befolyásolja a sokkal későbbit Megjósolhatatlanság Teljesítmény sűrűség spektrum nem tart zérushoz Nagy frekvencia
static int r = 3; void seed(int s) { r = s; } int rand( ) { r = F(r); return r; } Iterált függvény: Pszeudó véletlenszám r n+1 = F(r n ) generátor véletlenként hat r n F nagy derivált! n
r n+1 1 1 Rossz F(r) 1 r n 1 1 1 1 1 1 (r n, r n+1 ) = (r n, F(r n )) párok 1
Kongruens generátor F(r) = { g r + c } g r+c tört része g nagy F(r) r
Kaotikus rendszerek a síkon F z = x + iy F(z)=z 2 + c F(z)=e z +c F(z)=cos(z+c) F(z)=sinh(z)+c
F: z z 2 divergens z = r e i r r 2 2 konvergens 1 Attraktor: H = F(H) F H
Attraktor felrajzolása Attraktor a labilis és a stabil tartomány határa: kitöltött attraktor = nem divergens pontok z n+1 = z n 2 : ha z < akkor fekete Attraktorhoz konvergálunk, ha az stabil z n+1 = z n 2 attraktora labilis
F -1 Inverz iterációs módszer H = F(H) H = F -1 (H) z n+1 = z n 2 z n+1 = z n H z 0 r n+1 = r n n+1 = n /2 + {0 1} Ha n nagy: 1 r n = (r 0 ) 1/2n 1 n = 0 /2 n +{0 1}.{0 1}{0 1}... {0 1}.{0 1}{0 1}... n n-1 n-2
Többértékű leképzés: Véletlen bolyongás z 0 + - n+1 = n /2 + {0 1} r n 1 n {0 1}.{0 1}{0 1}... n n-1 n-2 Nem lehet csak egy értékkel dolgozni??? Mélységi feltárás szélességi helyett??? Csak a +: n 0.000... = 0 Felváltva +/-: 2n 1.0101... = 4 /3; 2n+1 0.1010... = 2 /3 Véletlenszerűen!
(Gaston) Julia halmaz F: z z 2 + c
Kitöltött Julia halmaz: algoritmus Im z (X,Y) FilledJuliaDraw ( ) FOR Y = 0 TO Ymax DO Re z FOR X = 0 TO Xmax DO ViewportWindow(X,Y x, y) z = x + i y FOR n = 0 TO infinity DO z = z 2 + c IF z >= infinity THEN WRITE(X,Y, white) ELSE WRITE(X,Y, black) ENDFOR ENDFOR END
GPU implementáció float cvtx[] = { -1, -1, 1, -1, 1, 1, -1, 1 }; CPU program glbufferdata(gl_array_buffer, sizeof(cvtx), cvtx, GL_STATIC_DRAW); gldrawarrays(gl_triangle_fan, 0, 4); uniform vec2 cameracenter, camerasize; layout(location = 0) in vec2 cvertex; out vec2 z0; void main() { gl_position = vec4(cvertex, 0, 1); z0 = cvertex * camerasize/2 + cameracenter; } Im z Vertex shader Re z uniform vec2 c; in vec2 z0; out vec4 fragcol; z = z 2 + c Fragment shader void main() { vec2 z = z0; for(int i=0; i<1000; i++) z = vec2(z.x*z.x-z.y*z.y,2*z.x*z.y) + c; fragcol = (dot(z,z) < 100)? vec4(0, 0, 0, 1) : vec4(1, 1, 1, 1); }
Kitöltött Julia halmaz: kép
Julia halmaz inverz iterációval JuliaDrawInverseIterate ( ) Kezdeti z érték választás FOR n = 0 TO infinity DO x = Re z, y = Im z IF InWindow(x, y) WindowViewport(x, y X, Y) WRITE(X,Y, black) ENDIF z = z - c if (random( ) > 0.5) z = -z ENDFOR END Im z (X,Y) Re z Kezdeti z érték: z 2 = z - c gyöke
Vágás, homdiv Viewport tr. Raszterizáció rasztertár GPU implementáció z 0 + - Vertex shader layout(location = 0) in vec2 zroot; void main() { gl_position = vec4(zroot, 0, 1); } Fragment shader void main() { fragcolor = vec4(0, 0, 0, 1); } Pixel cím CPU vertex shader geometry shader Fragment shader
z 0 + - CPU program Kezdeti z érték: z 2 = z - c gyöke vec2 z = vec2(0.5, 0) + sqrtcomplex(vec2(0.25 - c.x, -c.y)); for (int p = 0; p < npackets; p++) { vec2 vtx[nseeds]; for (int i = 0; i < nseeds; i++) { z = sqrtcomplex(z - c) * (rand() & 1? 1 : -1); vtx[i] = -z; } glbufferdata(gl_array_buffer, sizeof(vtx), vtx, GL_DYNAMIC_DRAW); gldrawarrays(gl_points, 0, nseeds); }
Geometry shader uniform vec2 cameracenter, camerasize, c; layout(points) in; layout(points, max_vertices = 63) out; vec2 sqrtcomplex(vec2 z) { float r = length(z), phi = atan(z.y, z.x); return vec2(cos(phi/2), sin(phi/2)) * sqrt(r); } void main() { vec2 zs[63]; zs[0] = gl_in[0].gl_position.xy; gl_position = vec4((zs[0]-cameracenter)/(camerasize/2),0,1); EmitVertex(); } for(int i = 0; i < 63/2; i++) { vec2 z = sqrtcomplex(zs[i] - c); for(int j = 1; j <= 2; j++) { zs[2 * i + j] = z; gl_position = vec4((z-cameracenter)/(camerasize/2),0,1); EmitVertex(); z = -z; } } EndPrimitive(); 0 1 2 3 4 5 6
Julia halmaz összefüggése összefüggő nem összefüggő, Cantor féle halmaz
H = F(H) F H Julia halmaz H 1 = F(H 0 ) H 0 összefüggősége H 0 H H-c H 1 c H-c H c z n+1 = z n -c
(Benoit) Mandelbrot halmaz Azon c komplex számok, amelyekre a z z 2 + c Julia halmaza összefüggő.
Mandelbrot halmaz, algoritmus Im z (X,Y) MandelbrotDraw ( ) FOR Y = 0 TO Ymax DO FOR X = 0 TO Xmax DO Re z ViewportWindow(X,Y x, y) c = x + i y z = 0 FOR n = 0 TO infinity DO z = z 2 + c IF z >= infinity THEN WRITE(X,Y, white) ELSE WRITE(X,Y, black) ENDFOR ENDFOR END z > 2
GPU implementáció float cvtx[] = { -1, -1, 1, -1, 1, 1, -1, 1 }; glbufferdata(gl_array_buffer, sizeof(cvtx), cvtx, GL_STATIC_DRAW); gldrawarrays(gl_triangle_fan, 0, 4); uniform vec2 cameracenter, camerasize; layout(location = 0) in vec2 cvertex; out vec2 c; void main() { gl_position = vec4(cvertex, 0, 1); c = cvertex * camerasize/2 + cameracenter; } in vec2 c; out vec4 fragcol; z = z 2 + c CPU program Vertex shader Fragment shader void main() { vec2 z = c; for(int i = 0; i < niteration; i++) { z = vec2(z.x * z.x - z.y * z.y, 2 * z.x * z.y) + c; if (dot(z, z) > 4) break; } fragcol = (i == niteration)? vec4(0, 0, 0, 1) : vec4(1, 1, 1, 1); }
Matematikát kijátszó Mandelbrot halmazok
Inverz feladat: IFS modellezés F x, y H F F: szabadon vezérelhető, legyen stabil attraktora Attraktor: H = F(H)
Melyik függvény attraktora a Koch görbe? Attraktor: H = F(H) = W 1 (H) W 2 (H) W 3 (H) W 4 (H) W 2 (H) W 3 (H) W 1 (H) W 4 (H) W k (x,y) = [x,y] A k + q k
F: többértékű lineáris leképzés Nem feltétlenül hasonlósági transzformáció! Nem csak önhasonló objektumok. F = W 1 W 2 W m W k (x,y) = [x,y] A k + q k W 2 W 1 H H Stabilitás = kontrakció A sajátértékei < 1 H = W 1 (H) W 2 (H) W m (H) H = F(H) Kollázs: lefedés a kicsinyített változatokkal Nem feltétlenül diszkjunkt
IFS rajzolás: iterációs algoritmus IFSDraw ( ) Legyen [x,y] = [x,y] A 1 + q 1 megoldása a kezdő [x,y] FOR i = 0 TO infinity DO IF InWindow(x, y) WindowViewport(x, y X, Y) Write(X, Y, color); ENDIF y Válassz k-t p k valószínűséggel [x,y] = [x,y] A k + q k ENDFOR END W k (X,Y) x
Egyszerű IFS-ek
IFS modellezés
IFS képek