Tra le tante cose che si possono fare con R non potevano mancare i frattali. Limitandosi all’insieme di Mandelbrot, gli esempi che si trovano in rete sono tanto semplici quanto efficaci.

Il primo, che permette di ottenere sia immagini statiche che gif animate, l’ho trovato grazie alla mailing list R-help.

# written by Jarek Tuszynski, PhD.
# http://tolstoy.newcastle.edu.au/R/help/05/10/13198.html
library(fields)  # for tim.colors
library(caTools) # for write.gif
m = 400          # grid size
C = complex( real=rep(seq(-1.8,0.6, length.out=m), each=m ), imag=rep(seq(-1.2,1.2, length.out=m), m))
C = matrix(C,m,m)
Z = 0
X = array(0, c(m,m,20))
for (k in 1:20) {
  Z = Z^2+C
  X[,,k] = exp(-abs(Z))
} 
image(X[,,k], col=tim.colors(256)) # show final image in R
write.gif(X, "Mandelbrot.gif", col=tim.colors(256), delay=100) # drop "Mandelbrot.gif" file from current directory on any web browser to see the animation
Frattale
Frattale

Il secondo esempio, ben più spettacolare (soprattutto se la dimensione delle immagini è grande), è quello di una funzione creata da Mario dos Reis. Tutti i file necessari sono raccolti nell’archivio “mandelbrot.zip”, scaricabile dalla sua pagina dedicata ai frattali.

Una volta scompattato il file zip, al suo interno troverete il file “mandelc.R”, contenente il codice della funzione mandelbrot(). In essa viene richiamata una routine in C (contenuta nel file “mandelbrot.c”) per rendere più veloce la computazione.

In un terminale, compilare il file “mandelbrot.c” con il comando:

R CMD SHLIB mandelbrot.c

che creerà il file “mandelbrot.so”. Aprire una sessione di R e dare:

source("mandelc.R")

Caricare l’oggetto “mandelbrot.so”:

dyn.load("mandelbrot.so")

Per una prima prova:

# graph A
image(mandelbrot())

Nel file “examples.R” ci sono due funzioni, “surf.colors” e “zoom”.

Dopo averle copiate ed incollate nel terminale dove avete aperto R (o nella console di R), le istruzioni per ottenere esempi di grafici più complessi sono:

frac <- mandelbrot(iter = 50)
# graph B
image(frac, col = c(heat.colors(49), "black"))
Frattale
Frattale

Il grafico successivo è in 3D:

# graph C
fcol <- surf.colors(frac, col = c(gray(seq(.5, 1, len = 49)), "black"))
frac$z <- -1/frac$z # nicer for plotting and coloring
persp(frac, col = fcol, border = NA, theta = 225, phi = 45, shade = .5)
Frattale
Frattale

Modificando la funzione evidenziata in rosso (con logaritmi o potenze, ad esempio), è possibile ottenere forme sempre diverse:

# graph D
frac <- mandelbrot(x = c(-0.8438146, -0.8226294),
                   y = c(0.1963144, 0.2174996), iter = 500)
image(frac, col = fcol.gr)
image(-1/<span style="color: #ff0000;">frac$z</span>, col = fcol.gr)
Frattale
Frattale

Per provare la funzione zoom, usate il codice seguente ed all’interno dell’immagine cliccare agli estremi opposti dell’area da ingrandire:

par(mfrow = c(2, 2))
gr <- gray(seq(1, 0, len = 255))
fcol.gr <- c(rep(c(gr, rev(gr)), 2), "black")
image(frac, col = fcol.gr)
zoom(col = fcol.gr) # Now click with your mouse two opposite corners of the area you wish to enlarge
zoom(col = fcol.gr) # do it again!
zoom(col = fcol.gr) # and again . 

Per chi volesse cimentarsi anche con un’insieme di Julia o un attrattore di Rössler, in questo blog (purtroppo non più aggiornato) si può trovare molto altro codice con cui divertirsi.

Nota: tutto questo funziona in Linux, in Windows e Mac non so. Oltre ad R e ai packages aggiuntivi richiesti, è necessario un compilatore C.