2017-10-07 10 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'sの後に、' N = 100'の最初の行を 'def function_name(N):'に置き換え、その下の残りのコードをインデントします。その後、新しい関数を呼び出して引数の値としてパーティクル数を渡すことができます: '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使用を埋め、このリストをループのための二重の内、平均を計算し、手段のリストに保存した後。

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

    mean.append(sum/P) 

これで、next forループを使用して結果をプロットすることができます。

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

だから、再び構文エラーのために私を責めないでください。私はフィトンの開発者ではありません。私はちょうどあなたの問題を解決する方法を提供したい。

0

これは?

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()