In [ ]:
In [3]:
from pylab import *
from scipy.ndimage import measurements
%matplotlib inline
L = 100
r = rand(L,L)
p = 0.4
z = r < p
imshow(z, origin='lower', interpolation='nearest')
colorbar()
title("Matrix")
show()
On a construit une amtrice de nombres aléatoires $r$. Cette matrice est assimilable à notrem odèle de lattice en 2 dimensions. La variable $p$ correspond à la densité dans la lattice. De plus, on souhaite numéroter les clusters pour pouvoir les étudier plus simplement.
In [4]:
lw, num = measurements.label(z)
imshow(lw, origin='lower', interpolation='nearest')
colorbar()
title("Labeled clusters")
show()
L'idée est de les rendre aléatoire pour mieux visualiser, d'où le code suivant :
In [5]:
b = arange(lw.max() + 1)
shuffle(b)
shuffledLw = b[lw]
imshow(shuffledLw, origin='lower', interpolation='nearest')
colorbar()
title("Labeled clusters")
show()
La function measurements de python permet de tirer certaines propriétés des clusters. On peut par exemple mesurer facilement leur taille, avec le type de connexions voulues.
In [6]:
area = measurements.sum(z, lw, index=arange(lw.max() + 1))
areaImg = area[lw]
im3 = imshow(areaImg, origin='lower', interpolation='nearest')
colorbar()
title("Clusters by area")
show()
On souhaite à présent observer le cluster de plus grande taille. Il sera donc encadrer par une boite dans l'image suivante.
In [8]:
area = measurements.sum(z, lw, index=arange(lw.max() + 1))
areaImg = area[lw]
im3 = imshow(areaImg, origin='lower', interpolation='nearest')
colorbar()
title("Clusters by area")
sliced = measurements.find_objects(areaImg == areaImg.max())
if(len(sliced) > 0):
sliceX = sliced[0][1]
sliceY = sliced[0][0]
plotxlim=im3.axes.get_xlim()
plotylim=im3.axes.get_ylim()
plot([sliceX.start, sliceX.start, sliceX.stop, sliceX.stop, sliceX.start], \
[sliceY.start, sliceY.stop, sliceY.stop, sliceY.start, sliceY.start], \
color="red")
xlim(plotxlim)
ylim(plotylim)
show()
Pour finir, Voici ce qui se passe pour différentes valeurs de $p$. Ainsi nous mettrons en évidence le phénomène de percolation.
In [76]:
for i,p in enumerate([0.2,0.4,0.5,0.6,0.8]) :
fig = plt.figure()
r = rand(L,L)
z = r < p
lw, num = measurements.label(z)
area = measurements.sum(z, lw, index=arange(lw.max() + 1))
areaImg = area[lw]
im = imshow(areaImg, origin='lower', interpolation='nearest')
fig.colorbar(im)
title("Clusters by area p = "+str(p))
sliced = measurements.find_objects(areaImg == areaImg.max())
if(len(sliced) > 0):
sliceX = sliced[0][1]
sliceY = sliced[0][0]
plotxlim=im.axes.get_xlim()
plotylim=im.axes.get_ylim()
plot([sliceX.start, sliceX.start, sliceX.stop, sliceX.stop, sliceX.start], \
[sliceY.start, sliceY.stop, sliceY.stop, sliceY.start, sliceY.start], \
color="red")
xlim(plotxlim)
ylim(plotylim)
show()
In [131]:
from pylab import *
from scipy.ndimage import measurements
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# Set up the figures
fig1,ax1=plt.subplots(5,3,figsize=(10, 6))
ax1 = ax1.ravel()
fig2,ax2=plt.subplots(5,3,figsize=(10, 6))
ax2 = ax2.ravel()
#Set up variables
p=np.arange(0., 1., 0.05)
areamax=np.zeros(len(p))
lwmax=np.zeros(len(p))
for ind,L in enumerate([50, 100, 200, 500, 1000]):
for ind2,marker in enumerate(['ko', 'bo', 'ro']):
# Randomise the percolation network
r = rand(L,L)
for i,p2 in enumerate(p):
# Determine the connectivity for probability p
z = r<p2
lw, num = measurements.label(z)
# Plot the clusters for given p
area = measurements.sum(z, lw, index=arange(lw.max() + 1))
areaImg = area[lw]
lwmax[i] = lw.max()
areamax[i] = area.max()
# Plot the number of clusters
ax2[3*ind + ind2 ].plot(p, areamax, marker)
ax1[3*ind + ind2 ].plot(p, lwmax, marker)
# Plot the size of the largest cluster
#plt.figure(2)
#plt.plot(p, area.max(), marker)
#plt.draw()
fig1.tight_layout()
st = fig1.suptitle('Number of cluster', fontsize="x-large")
st.set_y(0.95)
fig1.subplots_adjust(top=0.85)
fig2.tight_layout()
st = fig2.suptitle('Largest cluster', fontsize="x-large")
st.set_y(0.95)
fig2.subplots_adjust(top=0.85)
show()
This several pictures show the behavior of the system near the percolation threshold. Before they are only small cluster and just after, infinite one.
In [ ]:
In [ ]: