TI/Skrypty z zajęć/9
Z Brain-wiki
# -*- coding: utf-8 -*-
"""
Created on Wed Apr 29 11:31:12 2020
@author: Tomek
"""
'''
W tym zadaniu napiszemy automat komórkowy, który będzie bardzo uproszczonym modelem sterty piachu.
Automat działa na prostokątnej tablicy (przyjmijmy 100 na 100). Początkowo, każda z komórek przyjmuje
losową wartość ze zbioru [0,1,2,3]. Dynamika modelu jest następująca:
1. Losowo wybieramy jedną komórkę w tablicy i zwiększamy przechowywaną tam liczbę o jeden.
2. Mówimy że układ jest niestabilny, gdy gdziekolwiek w tablicy znajduje się wartość 4.
3. Jeżeli układ jest niestabilny, losowo wybieramy jedną z komórek z wartością 4.
Zmieniamy jej wartość na 0, natomiast wartości sąsiadujących komórek (czterech, lub mniej jeżeli jesteśmy przy brzegu)
zwiększamy o jeden.
4. Powtarzamy punkt 3 aż do momentu gdy układ jest stabilny (nie jest niestabilny).
Liczymy ile razy trzeba było powtórzyć punkt 3 aby dojść do punktu 4 i zapisujemy tę liczbę (N) w oddzielnej liście.
Powtarzamy punkty 1-4 tysiąc razy. Zadanie polega na wykreśleniu histogramu z tysiąca liczb N odpowiadających kolejnym powtórzeniom.
Wykonaj animację ostatnich stu powtórzeń punktów 1-4.
'''
import numpy as np
import pylab as py
import matplotlib.pyplot as plt
import matplotlib.animation as animation
Nx = 50+2
Ny = 50+2
tab = np.random.randint(4, size = (Nx,Ny))
def zerujBrzegi():
global tab
tab[0,:] = 0
tab[-1,:] = 0
tab[:,0] = 0
tab[:,-1] = 0
zerujBrzegi()
Nki = []
klatki = []
for i in range(1000):
#punkt 1
x = np.random.randint(1,Nx-1)
y = np.random.randint(1,Ny-1)
tab[x,y] +=1
#punkt 3
N = 0 #licznik powt
while np.sum(tab>3):
N += 1
ktory = np.random.randint(np.sum(tab>3))
punkty = np.nonzero(tab>3)
x = punkty[0][ktory]
y = punkty[1][ktory]
tab[x,y] -= 4
tab[x+1,y] += 1
tab[x-1,y] += 1
tab[x,y+1] += 1
tab[x,y-1] += 1
zerujBrzegi()
if (i>900):
klatki.append(np.copy(tab))
Nki.append(N)
print(len(klatki))
#print(Nki)
#py.hist(Nki)
fig = plt.figure( figsize=(8,8) )
im = plt.imshow(tab, cmap="Greys")
def animuj(i):
im.set_array(klatki[i])
return [im] #magia tutaj!!!!
ani = animation.FuncAnimation(fig, animuj, frames = len(klatki), interval = 100)
plt.show()