2D model plazov

reference: [1] http://guava.physics.uiuc.edu/~nigel/courses/563/Essays_2012/PDF/banerjee.pdf [2] http://blairgemmer.com/docs/BakTang/SandpileWriteup.pdf [3] https://www.youtube.com/watch?v=1MtEUErz7Gg

Izdelali bomo model peščenig plazov v dveh dimenzijah. V ta namen ustvarimo NxN naklonsko matriko naravnih števil (S). Glede na vrednost, ki jo ij-ti element te matrike zavzema, opredelimo S[i,j] kot: -> stabilen S[i,j]<4 -> nestabilen S[i,j]>=4

Na začetku lahko elementi matrike zauzemajo vrednost 0 ali pa njihovo vrednost določimo naključno. Nato pričnemo dodajati zrna peska. Če določena celica postane nestabilna uporabimo naslednjo pravilo: 1) s[i,j]=s[i,j]-4 (celici odvzamemo 4 zrna peska in jih porazdelimo med sosednjimi štirimi celicami) s[i+1,j]=s[i+1,j]+1 s[i-1,j]=s[i-,j]+1 s[i,j+1]=s[i,j+1]+1 s[i,j-1]=s[i,j-1]+1 Ko en element matrike postane nestabilen, uporabimo pravilo (1) in usklajeno z drugimi celicami spremljamo kako velik plaz se sproži (število elementov, ki zaradi pravila (1) posatane nestabilno).

In [1]:
from pylab import*           #risanje grafov
from numpy import*           #array
from time import sleep       #funkcije povezane s casom
import sys                   #funkcionalnost programa
sys.setrecursionlimit(200000)#stevilo rekurzivnih korakov
import scipy.optimize

def TBW_model(ii,jj,SP):
    global event
    ip=ii+1
    im=ii-1
    jp=jj+1
    jm=jj-1
    if SP[ii,jj]>3:
        event+=1
        SP[ii,jj]-=4
        if ii>0:
            SP[im,jj]+=1
            TBW_model(im,jj,SP)
        if ii<N-1:
            SP[ip,jj]+=1
            TBW_model(ip,jj,SP)
        if jj>0:
            SP[ii,jm]+=1
            TBW_model(ii,jm,SP)
        if jj<N-1:
            SP[ii,jp]+=1
            TBW_model(ii,jp,SP)

N=21
SP=zeros([N,N],int)
st_korakov=100

plaz=[]
porazdelitev={}
for i in range(st_korakov):
    event=0
    ii=(N-1)/2
    jj=(N-1)/2
    SP[ii,jj]+=1
    TBW_model(ii,jj,SP)

    if event>0:
        plaz.append(event)
        if event in porazdelitev:
            porazdelitev[event]+=1
        else:
            porazdelitev[event]=1

x=[]
y=[]
for i in porazdelitev:
    x.append(i)
    y.append(porazdelitev[i])
    
fig=figure(figsize=(10,10))
ax=fig.add_subplot(111)
ax.scatter(x,y)
ax.set_xscale('log')
ax.set_yscale('log')

def f(x,A,B):
    return A*np.power(x,B)

popt, pcov = scipy.optimize.curve_fit(f,x,y)
A, B = popt
perr = np.sqrt(np.diag(pcov))

yy=f(sorted(x),A,B)
p1,=ax.plot(sorted(x),yy,color='r')
ax.legend([p1], [r'${D_f} = %1.3f$'%(B)], loc=1)

show()
C:\Users\Rene\Anaconda3\lib\site-packages\ipykernel\__main__.py:40: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
C:\Users\Rene\Anaconda3\lib\site-packages\ipykernel\__main__.py:14: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
C:\Users\Rene\Anaconda3\lib\site-packages\ipykernel\__main__.py:16: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
C:\Users\Rene\Anaconda3\lib\site-packages\ipykernel\__main__.py:18: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
C:\Users\Rene\Anaconda3\lib\site-packages\ipykernel\__main__.py:21: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
C:\Users\Rene\Anaconda3\lib\site-packages\ipykernel\__main__.py:24: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
C:\Users\Rene\Anaconda3\lib\site-packages\ipykernel\__main__.py:27: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
In [ ]: