2017-10-07 49 views
0

我在做一個代碼來模擬布朗運動。如何在有很多列表時如何最小化代碼?

from random import random 
import matplotlib.pyplot as plt 
import numpy as np 

N=100 
p=0.5 
l=1 
x1=[] 
x2=[] 

x1.append(0) 
x2.append(0) 

for i in range(1, N): 
    step = -l if random() < p else l 
    X1 = x1[i-l] + step 
    x1.append(X1) 

for i in range(1, N): 
    step = -l if random() < p else l 
    X2 = x2[i-l] + step 
    x2.append(X2) 

x1mean=np.array(x1) 
x2mean=np.array(x2) 

mean=[] 
for j in range (0,N): 
    mean.append((x1mean[j]+x2mean[j])/2.0) 

plt.plot(mean) 
plt.plot(x1) 
plt.plot(x2) 
plt.show() 

這段代碼的位移2個diferent顆粒,但爲了正確地計算平均位移,我需要有顆粒的數量很大,喜歡100。如你所見,我在尋找用於凝聚代碼的方法,因爲我無法重複使用相同的代碼100次。

有沒有辦法創建一個循環,使所有這些代碼在1變量的函數,即粒子的數量?

謝謝。

+0

執行'import'後,用'def function_name(N):'替換第一行'N = 100',然後縮進其下的其餘代碼。之後,您可以調用新函數並將粒子數作爲參數值傳遞給它:即'function_name(42)'。 – martineau

回答

0

我無法爲您提供工作的Python代碼,因爲直到現在我沒有寫出一行python代碼。但我可以給你一個想法如何解決你的問題。


假設:

N : Number of Moves 
P : Number of Particles 

步驟1:
創建方法產生的陣列/列表並將其返回。所以你可以重新使用它並避免複製你的代碼。

def createParticleMotion(N, p, l): 
    x1=[] 
    x1.append(0) 

    for i in range(1, N): 
     step = -l if random() < p else l 
     X1 = x1[i-l] + step 
     x1.append(X1) 

    return x1 

第2步:
創建一個列表的列表,讓我們把它叫做particleMotions。它自己的名單有P您的名單N移動。通過從第一步調用該方法並在返回的列表/數組後添加列表paticleMotions,在for循環中爲您添加粒子數P

可能是Python: list of lists的答案會幫助你創建這個。

第3步:
您創建和填寫particleMotions使用這個列表中的雙for循環,並計算平均值,並將其存儲在手段列表之後。

mean=[] 
for n in range (0,N): 
    sum=0 
    for p in range (0,P): 
     sum = sum + particleMotions[p][n] 

    mean.append(sum/P) 

現在您可以使用下一個循環來繪製您的結果。

for particle in range (0,P): 
    plt.plot(particleMotions[particle]) 

再次這樣做不怪我的語法錯誤。我不是植物開發者。我只是想給你一個解決你的問題的方法。

0

This?

from random import random 
import matplotlib.pyplot as plt 
import numpy as np 

N=100 
p=0.5 
l=1 

mydict = {} 

for n in range(100): 
    mydict[n] = [] 
    mydict[n].append(0) 

    for i in range(1, N): 
     step = -l if random() < p else l 
     X1 = mydict[n][i-l] + step 
     mydict[n].append(X1) 

for k,v in mydict.iteritems(): 
    plt.plot(v) 

# mean 
plt.plot([np.mean(i) for i in mydict.values()]) 

plt.show()