Il frattale di Mandelbrot.

Nella fine del secolo scorso il matematico polacco Beinot Mandelbrot lavorando con i calcolatori della IBM ideò e studiò una curiosa figura geometrica piana frattale che prese il suo nome.

Il concetto è abbastanza semplice: consideriamo il piano immaginario che rappresenta graficamente l’insieme dei numeri complessi ovvero un quadro di lato L composto dai pixel di una finestra del video. Può essere pensato come un piano cartesiano modificato, con la parte reale rappresentata sull'asse x e la parte immaginaria rappresentata sull'asse y.L'asse x è chiamato anche l'asse reale e l'asse y asse immaginario. Associamo ad ogni punto del piano immaginario (ovvero ad ogni pixel della finestra) un colore che ricaveremo applicando alle coordinate di ciascun punto una certa funzione ricorsiva (condizionata da alcune regole). Facendo questa operazione per tutti i punti (o pixel) del quadro coloreremo tutta la finestra.

Le coordinate di un punto A generico del piano siano x ed y ; associamo a questo punto il numero complesso Z = x+jy .

 

 

Ora consideriamo una successione di numeri complessi che si ottiene dalla relazione :

Perciò ad ogni elemento complesso della successione corrisponderà un punto nel piano immaginario A1 , A2 , A3 , ……. AN, AN+1,…

Vediamo con alcuni esempi numerici come evolvono le successioni relativamente a vari punti del piano immaginario. Partiamo da un punto B di coordinate x=1, y = 1

B1(1,1) → B2(1,3) → B3(-7,7) → B4(1,-97) → B5(-9407,-193) → …. ;

Difatti per ottenere la coordinate di B2 applichiamo la formula di Mandelbrot al punto B1, cioè:

(1 + j 1)2 + (1 + j 1) = 1 +2 j – 1 +1 + j = 1 + 3 j

Il punto successivo B3 si otterrà ancora con la stessa formula applicata al punto B2, ovvero:

(1 + 3 j)2 + ( 1 + j) = ( 1 + 6 j – 9) + (1 + j ) = -7 +7 j

E così via ….

Altri punti potrebbero essere:

C1(-1.4 , 0.3) → C2(0.470 ,-0.540) → C3(-1.470 , -0.207) → …C7(-27.437, 11.433)….→….;

D1(0.15 , 0.21) → D2(0.128 , 0.273) → …→D10(0.092 , 0.257) →…. →D100(0.092 ,0.257) →……;

E1(-0.12 , 0.13) → E2(-0.122 , 0.098) → E3(-0.115 , 0.106) →…. →E10(-0.117 , 0.105) →…→E100(-0.117 , 0.105) →…;

Si osserva che per alcune di queste successioni di punti(B e C), al crescere di n, i punti si allontanano sempre di più dall’ origine degli assi, per altre ( D ed E ) i punti finali non si spostano più.

Si può fare un semplice programma con VB2010 che permette si calcolare la successione di Mandelbrot indicando punto iniziale e numero di iterazioni da eseguire .

Si apra un nuovo progetto in VB2010 e in una form si inseriscano un Button quattro ListBox tre TextBox e sette Label disponendo il tutto come da figura sottostante.

 

 

Si scriva il codice seguente importando la classe System.Numerics che agevola l’esecuzione del calcolo di numeri complessi.

Questo mezzo per lavorare con i numeri complessi in VB2010 ci è fornito dal Net.Framework 4 che deve essere installato nel computer .

CODICE in VB.NET 2010 :

 

 

 

 

' per importare la classe System.Numerics nel progetto cliccare sul pulsante "Progetto"

'poi selezionare

'dal menu' a tendina "Aggiungi riferimento". All' apertura della finestra cliccare su

' ".NET" e scegliere nell'elenco System.Numerics dando l' OK.

 

Imports System.Numerics

 

Public Class Form1

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 

' definiamo le variabili :

' x,y sono le coordinate del punto di partenza che scriveremo nei rispettivi textbox

' n corrisponde al numero di iterazioni ovvero di punti che desideriamo trovare

' C è il punto di partenza della successione e Z i punti successivi per vari n crescenti

' di una unità.

' Z = Complex.Pow(Z, 2) + C è la formula ricorsiva di Mandelbrot che verrà aggiornata

'per ogni ciclo.

 

Dim x, y As Double

Dim n, v As Integer

x = TextBox1.Text

y = TextBox2.Text

n = TextBox3.Text

Dim Z0 As New Numerics.Complex(x, y)

Dim Z As New Numerics.Complex(0, 0)

For v = 1 To n Step 1

Z = Complex.Pow(Z, 2) +Z0

 

' usando la classe Numerics in VB.NET è facile risalire alla parte reale o immaginaria di un

' numero complesso con la notazione Z.Real o Z. Imaginary rispettivamente. Esse vengono

' visualizzate per ogni ciclo for nelle rispettive ListBox.

 

ListBox1.Items.Add(Z.Real)

 

ListBox2.Items.Add(Z.Imaginary)

 

' per il teorema di Pitagora il modulo o la distanza dall'origine di un numero complesso

' si ottiene eseguendo la radice quadrata della somma dei quadrati di parte reale e parte

'immaginaria.

' Tale valore finisce scritto nella ListBox3

 

ListBox3.Items.Add(Math.Sqrt(Z.Real ^ 2 + Z.Imaginary ^ 2))

ListBox4.Items.Add(v)

 

 

Next

End Sub

End Class

 

 

 

FINE DEL CODICE in VB:NET2010

 

 

 

 

Con il programmino di sopra si possono verificare i punti già calcolati e trovarne altri.

 

 

Si osserva che per alcuni punti iniziali c’è un rapido allontanamento della successione di punti dall’origine, mentre per altri, per quanti termini avanzi la successione i corrispondenti punti restano sempre nei dintorni dell’origine degli assi O.

C’è una dimostrazione che afferma che se i punti iniziali della successione sono al di fuori del cerchio di centro O (origine assi) e raggio 2, nominato cerchio critico, col procedere dei passi della successione relativa, i punti corrispondenti si allontaneranno sempre di più dall’ origine.

Se invece i punti di partenza sono interni al cerchio critico non è possibile prevedere se le relative successioni procederanno portando i punti associati fuori dal cerchio critico dopo 1,2,..n passi oppure non ne usciranno mai anche dopo infiniti passi.

Da questi presupposti andiamo a colorare i punti iniziali del piano immaginario per ottenere la figura di Mandelbrot

Stabiliamo innanzitutto che sia N il numero massimo di passi (che per il computer dovrà essere un numero intero finito) per l’avanzamento delle successioni relative a tutti i punti del piano cartesiano (del quadro di lato L) e che si disponga di una tavolozza con lo stesso numero di colori diversi numerati ordinatamente da 0 a N

Per ogni punto iniziale potremmo trovare un numero di passi n della successione per cui si verifica che il punto corrispondente esce oppure no dal cerchio di raggio critico. Per quelli che non escono dal cerchio dopo N passi supporemo che non escano mai e ai relativi punti iniziali assoceremo il colore N. Se invece dopo n passi di avanzamento della successione (1,2, …10,…ecc.) troveremo un punto corrispondente che esce per primo dal cerchio critico assoceremo al punto iniziale il colore n.

Per punti esterni al cerchio critico associamo il colore 0,(perché già dal passo 0 siamo esterni al cerchio critico e perché sappiamo che la successione si allontanerà sempre più da esso) che è anche il colore di sfondo ( ad esempio il marrone)

Ovviamente la figura di Mandelbrot si svilupperà maggiormente intorno al cerchio critico di raggio 2 per cui prenderemo un quadro di lato L in modo che -2,5<= x<=+2,5 ed -2,5<=y<=+2,5.  

   

Lavorando con un video e con VB.net si ha a che fare con i pixel di una Picture Box che potremmo scegliere di 600x600 pixel su cui disegnare la figura di Mandelbrot.Nell’esempio riportato sotto, considerando che le coordinate della pictureBox partono dallo spigolo in alto a sinistra della medesima, occorre fare corrispondere i punti del dominio e codominio della funzione di Mandelbrot ( che sono quegli insiemi indicati prima) con quelli della picturebox.

Questo si ottiene per le coodinate dell’ asse x (ovvero la parte reale del punto) con la funzione in Vb.net “ calcolaparterealeX “ che prende un qualunque valore intero X pixel (compreso tra 0 e 599) ne calcola il rapporto f con il lato L in pixel della picturebox ( f = x /600) lo moltiplica per la larghezza del domino della funzione di Mandelbrot (5) ed infine sottrae il risultato alla metà del dominio (che è 2,5 ) . E’così che si trova il criterio per la corrispondenza tra i punti (in decimale) del piano cartesiano dove si implementa la successione complessa di Mandelbrot con i pixel (x variabile Integer) della Picturebox da colorare..

Ad esempio il punto X della picture box di ascissa 300 pixel (che divide la picturebox a metà) verrà riportato sul piano cartesiano della funzione di Mandelbrot alla coordinata x = (300/600)*5-2,5 = 0 verificando così la similitudine tra punti dei due piani.

Analogamente la funzione VB.Net “calcolaparteimgY “ permette di associare le ordinate della picture box con i punti dell’ asse immaginario (o asse y) del piano .

 

 

In pratica, si fa eseguire al programma un cambio di coordinate in modo da disporre la figura al centro del quadro.

 

 

La classe System. Numerics in VB.NET permette di lavorare abbastanza agevolmente con i numeri complessi eseguendo calcoli su questi tramite alcune istruzioni.

Istruzioni che si utilizzano nel programma per trovare i valori della successione di Mandelbrot e per determinare il modulo di un numero complesso ovvero nel nostro caso la distanza del punto corrispondente dall’origine. Il programma verificherà poi il numero di passi che necessitano affichè si abbia o meno l’uscita dei punti associati alla successione dal cerchio di raggio 2 e colorerà il punto di partenza di conseguenza.


Per realizzare il programma si crea un nuovo progetto form in vb2010 e si trascina nell form (800x788 pixel) un button e una picture box di 600x 600 pixel per poi copiare e incollare il listatoimmagini1 nello spazio della form1


Occorre inoltre creare una cartella di nome MANDELBROT in C/MANDELBROT che serve per salvare l'immagine in formato .bmp che potremo elaborare o stampare in seguito.
INIZIO CODICE MANDELBROT:

' NB:occorre importare la classe System.Numerics dal menu' principale cliccando su Project--->Add Reference, e quindi

'selezionare .NET per cliccare la scelta 'System.Numerics' e confermare con OK. SOLO così si importa tale classe nel progetto

'che si desidera realizzare.

 

Imports System.Numerics

 

Public Class Form1

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Me.Size = New Size(800, 788)

 

 

End Sub

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Button1.Hide()

 

Dim Raggio As Integer = 2

 

Dim BmpLarg As Integer = 600

 

Dim BmpAlt As Integer = 600

 

Dim MaxCicli As Integer = 27

 

Dim RealAsseLungh As Decimal = 5D

 

Dim RealAsseValMin As Decimal = -2.5D

 

Dim ImgAsseLungh As Decimal = 5D

 

Dim ImgAsseValMin As Decimal = -2.5D

 

 

 

Dim BMP As New Bitmap(BmpLarg, BmpAlt)

For x As Integer = 0 To BmpLarg - 1

For y As Integer = 0 To BmpAlt - 1

 

Dim zReal As Decimal = CalcolaParteRealeX(x, BmpLarg, RealAsseValMin, RealAsseLungh)

 

Dim zImg As Decimal = CalcolaParteImgY(y, BmpAlt, ImgAsseValMin, ImgAsseLungh)

Dim Z0 As New Numerics.Complex(zReal, zImg)

Dim Z As New Numerics.Complex(0, 0)

Dim conta As Integer = 0

For conta = 0 To 26

 

 

Z = (Complex.Pow(Z, 2) + Z0)

 

 

 

If (Z.Real ^ 2 + Z.Imaginary ^ 2 >= Raggio ^ 2) Then

 

 

Exit For

Else

End If

Next

 

 

Dim PixelColor As Color

 

If conta = MaxCicli Then

 

PixelColor = Color.Transparent

Else

PixelColor = MappaColori(conta)

conta = conta + 1

End If

BMP.SetPixel(x, y, PixelColor)

Next

Next

PictureBox1.Image = BMP

 

 

'con la riga seguente si salva l'immagine dal nome cip in una cartella MANDELBROT (da creare prima dell'esecuzine dell'app.) nel percorso specificato.Occorre creare questa cartella altrimenti il programma si blocca

 

PictureBox1.Image.Save("C:\MANDELBROT\cip.bmp")

 

End Sub

Function MappaColori(ByVal conta As Integer) As Color

 

 

Select Case conta

Case 0 : Return Color.Beige

Case 1 : Return Color.Violet

Case 2 : Return Color.Indigo

Case 3 : Return Color.Blue

 

Case 4 : Return Color.RoyalBlue

Case 5 : Return Color.Cyan

Case 6 : Return Color.DarkBlue

Case 7 : Return Color.LightSkyBlue

Case 8 : Return Color.Turquoise

Case 10 : Return Color.DarkCyan

Case 11 : Return Color.Aquamarine

 

Case 9 : Return Color.Azure

 

Case 12 : Return Color.DarkGreen

Case 13 : Return Color.Olive

Case 14 : Return Color.Green

Case 15 : Return Color.LightGreen

Case 16 : Return Color.GreenYellow

Case 17 : Return Color.PapayaWhip

Case 18 : Return Color.LightYellow

Case 19 : Return Color.Yellow

Case 20 : Return Color.Salmon

Case 21 : Return Color.Orange

Case 22 : Return Color.LightPink

Case 23 : Return Color.Purple

Case 24 : Return Color.IndianRed

Case 25 : Return Color.Tomato

Case 26 : Return Color.Red

 

 

 

End Select

End Function

 

 

Function CalcolaParteRealeX(ByVal x As Integer, ByVal bitmapLargh As Integer, ByVal LarghSemiPianoComplesso As Decimal, ByVal LarghPianoComplesso As Decimal) As Decimal

Dim f As Decimal = CDec(x / bitmapLargh)

Dim ParteReale As Decimal = f * LarghPianoComplesso

Return ParteReale + LarghSemiPianoComplesso

End Function

 

 

Function CalcolaParteImgY(ByVal y As Integer, ByVal bitmapAlt As Integer, ByVal AltSemiPianoComplesso As Decimal, ByVal AltPianoComplesso As Decimal) As Decimal

Dim f As Decimal = CDec(y / bitmapAlt)

Dim ParteImg As Decimal = f * AltPianoComplesso

Return ParteImg + AltSemiPianoComplesso

End Function

 

 

 

 

 

Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click

 

End Sub

 

 

 

 

'con questa sub si disegna sulla picturebox1 un cerchio rosso di raggio 2 che si posiziona utilizzando il quadrato escritto

'di lato 480 pixel e nella posizione x=60,y= 60 pixel per averlo al centro della picturebox1 di 600x600pixel

 

 

Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint

e.Graphics.DrawEllipse(Pens.Red, 60, 60, 480, 480)

 

 

End Sub

End Class

FINE CODICE FIGURA MANDELBROT.

Si otterrà una figura di questo tipo dopo avere avviato il programma e cliccato sul pulsante button :


 


Utilizzando analogo programmino si possono ottenere altre figure piane colorate, non Necessariamente riferibili ad un frattale, sotituendo alle righe corrispondenti alla formula Di mandelbrot altre formule matematiche. Ad esempio:






In queste formule C è un numero complesso scelto a caso che deforma la figura di Mandelbrot. Per scaricare il programma zip clicca qui