其他分享
首页 > 其他分享> > 自组织临界现象:沙堆模型

自组织临界现象:沙堆模型

作者:互联网

1. 二维沙堆模型

算法规则:

2. 意义

3. 代码

以下是一段 python 代码,可以实现小规模的沙堆模型。


import numpy as np
import matplotlib.pyplot as plt

size = 10
nsand = np.zeros([size, size], dtype='uint8')
for i in range(size):
    for j in range(size):
        nsand[i,j] = np.random.randint(0,4)

def avalanch( nsand, size ):
    for i in range( size ):
        for j in range( size ):
            if nsand[i,j] >=4 :
                nsand[i,j] -= 4;
                if i-1 >= 0: nsand[i-1,j] += 1
                if i+1 < size: nsand[i+1,j] += 1
                if j-1 >= 0: nsand[i,j-1] += 1
                if j+1 < size: nsand[i,j+1] += 1
                return 1
    return 0

nstep = 10000
magnitudes = []
for i in range(nstep):
    print("i=",i)
    nsand[(int)(size/2),(int)(size/2)] += 1; magnitude=0
    while avalanch( nsand, size ) > 0 :
        magnitude +=1
        #print("--------------------------------- \n", nsand)
    if magnitude > 0:
        #print("magnitude = ", magnitude)
        magnitudes.append( magnitude )
#print("magnitudes = ", magnitudes)
x = np.bincount(magnitudes)
data = []
for i in range( x.size ): # 去除次数为0的点
    if x[i] > 0: data.append( [ i, x[i] ] )
xdata = []; ydata= [] #
for t in data:
    xdata.append( np.log10(t[0]) ); ydata.append( np.log10(t[1]) )
plt.plot(xdata, ydata, "o")
plt.xlabel(r"$log_{10}$ magnitude")
plt.ylabel(r"$log_{10}$ (number of avalanches)")
plt.savefig("PowerLaw.png")
plt.show()

4. 结果

把沙崩的震级定义为一次大沙崩中包括多少次小沙崩,然后把震级、发声的次数取了 log 以后画在图上,得到下面的图片。

标签:沙崩,plt,临界现象,模型,沙堆,nsand,magnitude,沙子,size
来源: https://www.cnblogs.com/luyi07/p/15642556.html