要更新的数据列表

问题描述 投票:0回答:1

我在更新“反转尺寸”列表时遇到问题。每次更新都应带有“逆转”。我需要制作一个图形来检查幂律行为。这是一个模拟通道沿雪崩行为的简单细胞自动机。我总是在列表中得到相同的值,而应该是一个递增的数字

reversal=0           
reversalsize=[]      
def avalanche(M,KH,pmt):          
p_scale_factor = 5      
global reversal
M_av = M.copy()
M_av_app = M.copy()
for i in range(nx-1):
    if i<nx/3:       
        for j in range(ny-1):
            ix = i+1
            iy = j+1
            p_drop = np.tanh((M[ix,iy]-pmt)/p_scale_factor)   
            rand_drop = np.random.random()
            if rand_drop > 1-p_drop:
                if j==0:    
                    if KH[ix,iy] > pmt:
                        av_mass = (M[ix,iy]-pmt)*ppe                  
                        M_av[ix+1,iy] = M_av_app[ix+1,iy]+3*av_mass/4
                        M_av[ix+1,iy+1] = M_av_app[ix+1,iy+1]+av_mass/4
                        M_av[ix,iy] = M_av_app[ix,iy]-av_mass


                elif 0<j<ny-3:
                    if KH[ix,iy] > pmt:
                        av_mass = (M[ix,iy]-pmt)*ppe
                        M_av[ix+1,iy-1] = M_av_app[ix+1,iy-1]+av_mass/4
                        M_av[ix+1,iy] = M_av_app[ix+1,iy]+av_mass/2
                        M_av[ix+1,iy+1] = M_av_app[ix+1,iy+1]+av_mass/4
                        M_av[ix,iy] = M_av_app[ix,iy]-av_mass

                elif j==ny-3:
                    if KH[ix,iy] > pmt:
                        av_mass = (M[ix,iy]-pmt)*ppe
                        M_av[ix+1,iy] = M_av_app[ix+1,iy]+3*av_mass/4
                        M_av[ix+1,iy-1] = M_av_app[ix+1,iy-1]+av_mass/4
                        M_av[ix,iy] = M_av_app[ix,iy]-av_mass 

                M_av_app = M_av
                reversal +=1
                #print(reversal)
    else:
        ilim1 = i-nx/3        
        ilim2 = nx-(i-nx/3)   
        for j in range(ny-1):
            ix = i+1
            iy = j+1
            p_drop = np.tanh((M[ix,iy]-pmt)/p_scale_factor)
            rand_drop = np.random.random()
            if rand_drop > 1-p_drop:
                if j<ilim1:
                    pass
                if j==ilim1:
                    if KH[ix,iy] > pmt:
                        av_mass = (M[ix,iy]-pmt)*ppe
                        M_av[ix+1,iy+1] = M_av_app[ix+1,iy+1]+av_mass
                        M_av[ix,iy] = M_av_app[ix,iy]-av_mass 

                elif ilim1<j<ilim2:
                    if KH[ix,iy] > pmt:
                        av_mass = (M[ix,iy]-pmt)*ppe
                        M_av[ix+1,iy-1] = M_av_app[ix+1,iy-1]+av_mass/4
                        M_av[ix+1,iy] = M_av_app[ix+1,iy]+av_mass/2
                        M_av[ix+1,iy+1] = M_av_app[ix+1,iy+1]+av_mass/4
                        M_av[ix,iy] = M_av_app[ix,iy]-av_mass
                elif j==ilim2:
                    if KH[ix,iy] > pmt:
                        av_mass = (M[ix,iy]-pmt)*ppe
                        M_av[ix+1,iy-1] = M_av_app[ix+1,iy-1]+av_mass
                        M_av[ix,iy] = M_av_app[ix,iy]-av_mass 
                M_av_app = M_av 
                reversal +=1
                #print(reversal)

return M_av

for i in range(n_iter):        
reversal=0
avalanche(M,KH,pmt)
reversalsize.append(reversal)
print(reversalsize)


x, y = np.histogram(reversalsize, 1000)
plt.figure(figsize=(10,7))
plt.clf()
plt.loglog(y[0:-1],x, 'r.')
plt.title("Avalanche Size Distribution", fontsize=14)
plt.xlabel(r"$\log$" + "(Avalanche Size)", fontsize=12)
plt.ylabel(r"$\log$" + "(Frequency)", fontsize=12)
plt.show()
python list matrix histogram power-law
1个回答
1
投票

每次迭代时,您都将反向设置为0。这就是为什么它没有增加的原因:

for i in range(n_iter):
    reversal=0  # Delete this line
© www.soinside.com 2019 - 2024. All rights reserved.