-- Introduction au Pyhon --

Calcul de lieux

Les ensembles de Mandelbrot et Julia

-

simon.marie@lecnam.net
In [1]:
import numpy as np
from numba import jit # Module très utile pour accélérer les calculs
import matplotlib.pyplot as plt
%matplotlib inline

Introduction

Supposont la suite définie dans le plan complexe par:

$$ z^{n+1}=z^n+c $$

avec $z,c\in\mathbb{C}$

Si les valeurs initiales $z^0$ et le paramettre $c$ ne sont pas choisit attentivement, la suite diverge rapidement. Pour illustrer cela, on peut construire une fonction représetant chacun des points de la suite pour une couple particulier de valeur $(z_0,c)$:

In [2]:
def traj(z,c):
    nt=200
    x,y=np.empty(nt),np.empty(nt)
    for i in range(nt):
        z=z**2+c
        x[i]=z.real
        y[i]=z.imag
    return x,y

Exemple pour $z_0=1+0.5i$ et $c=2$

In [3]:
x,y=traj(1+0.5j,2)
plt.plot(x,y)
Out[3]:
[<matplotlib.lines.Line2D at 0x7f148cc31810>]

Exemple pour $z_0=0.2+0.1i$ et $c=0.1+0.2j$

In [4]:
x,y=traj(0.2+0.1j,0.1+0.2j)
plt.plot(x,y)
Out[4]:
[<matplotlib.lines.Line2D at 0x7f1482055150>]

On peut alors ce demander quelle est la forme de la région du plan complexe pour laquel cette suite de diverge pas. Pour $z_0=0$, l'ensemble des valeur de c pour la suite converge est l'ensemble de Mandelbrot.

1 - Mandelbrot set

Considérons $z_0=0$ et cherchons toutes les valeur de $c$ pour lesquel la suite converge:

In [5]:
@jit
def mandel_iter(x,y,n):
    c=complex(x,y)
    z=0.j
    
    for i in range(n):
        z=z**2+c
        if abs(z)>2:
            return i
    return n
In [6]:
def mandel_comp(center,size,n,nit=200):
    M=np.zeros((n,n))
    X=np.linspace(center[0]-size/2,center[0]+size/2,n)
    Y=np.linspace(center[1]-size/2,center[1]+size/2,n)
    for l,x in enumerate(X):
        for m,y in enumerate(Y):
            M[l,m]=mandel_iter(x,y,nit)
    return X,Y,M
In [7]:
X,Y,M=mandel_comp([-0.5,0],2,1000)
fig=plt.figure(figsize=(10,10),dpi=200)
plt.pcolormesh(X,Y,M.T,cmap='terrain')
#fig.savefig('Mandelbrot_tot.png',bbox_inches='tight',dpi=200)
Out[7]:
<matplotlib.collections.QuadMesh at 0x7f147547cd90>

On peut s'amuser à zoomer sur une région particulière et observer la nature fractale de cet ensemble:

In [8]:
X,Y,M=mandel_comp([-1.42,0.],0.04,1000)
fig=plt.figure(figsize=(10,10),dpi=100)
plt.pcolormesh(X,Y,M.T,cmap='terrain')
Out[8]:
<matplotlib.collections.QuadMesh at 0x7f1481f781d0>