IFS, fractales & jeu du chaos
Algorithme IFS
Vitesse de convergence vers l'attracteur
Si est un point de l'attracteur alors , et on calcule et trace donc directement des points de .
Maintenant, si n'est pas un point de , en notant la suite des points obtenus avec la suite récurrente et et l'ensemble limite, on a, comme :
ce qui montre que la distance entre et décroît exponentiellement (il s'agit en fait ici d'une distance entre ensembles de points, voir les paragraphes sur les distances et la distance de Hausdorff).
Ainsi, au bout de itérations, la distance entre l'ensemble de points calculé par et l'attracteur est la distance initiale entre et l'attracteur multipliée par .
Pour un rapport de contraction par exemple , et itérations, on a : la distance a été divisée par mille.
Pour une figure de 1000 pixels sur 1000 pixels, soit une résolution d'un million de pixels (1 méga-pixel), la distance initiale est au pire d'environ 1000 pixels, et donc au bout de 10 itérations et sont à une distance inférieure à 1 pixel: numériquement, la suite récurrente a convergé.
Cela signifie en d'autres termes que l'algorithme converge rapidement, en quelques itérations, donc efficacement vers l'image fractale limite.
D'autres considérations sont par contre moins opimistes quant à cette efficacité, en pratique.
Approche de la complexité et temps de calcul
Si la convergence vers l'attracteur à partir d'un point quelconque est rapide, il ne faut pas négliger pour autant le calcul des itérations de l'opérateur de Hutchinson: pour un point du plan, contient points,
puis contient points
et ainsi de suite.
À la n-ième itération, contient points.
Pour un IFS défini par exemple par 3 fonctions , et , après itérations, contient points, après itérations, de points, et pour itérations points.
Comme ces nombres ne sont pas forcément parlants: cela fait beaucoup, certes, mais pour un ordinateur moderne... il est intéressant de préciser quelques détails techniques.
Suposons que le calcul de l'image d'un point par une fonctions de l'IFS, soit se fasse en seconde (soit 1 milliard de ces calculs par seconde), alors les itérations nécessiteraient secondes, et les itérations environ secondes, soit environ 55 heures...
Encore plus remarquable est de ces données la taille pour un ordinateur. Un point est représenté par 2 coordonnées, soit deux nombres réels. En python par exemple un tel nombre nécessite basiquement 24 octets.
Ainsi, pour itérations, le stockage en mémoire de ces points nécessite quelques 3,5 milliards d'octets, ou 3,5 gigaoctets (Go) !
Plus vertigineux: pour itérations, il faut octets ou 200 000 Go soit aussi 200 teraoctets (To) !!!
Il vaut mieux réflechir un peu avant de lancer ce type de calcul, et augmenter timidement le nombre d'itérations…
Algorithme IFS
On calcule récursivement à partir d'un point pris au hasard, par exemple:
Algorithme
Entrer n
M est un point au hasard
Pour i de 1 à n
T={}
Pour j de 1 à N
T={ T ; fj(M) }
Fin
M=T
Fin
Par exemple, en python:
Programme Python
def f(i,x,y):
# definition de i-ème fonction
# de l'IFS
return M
def F(M):
Mr=[];
for i in range(len(M)):
x=M[i][0]
y=M[i][1]
for j in range(N):
[xr,yr]=f(j,x,y)
Mr=Mr+[(xr,yr)];
return Mr
M=[(0,0)]
for i in range(n):
M=F(M)
for i in range(len(M)):
Point(M[i]) # Trace les points avec libxy
On peut utiliser une bibliothèque graphique python telle que libxy
ou matplotlib.
Voir un exemple de programme en javascript: triangle ou fractale de Sierpiński ou en python et plus généralement dans un polygone régulier