2017-10-07 1 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() 

이 코드는 당신이 볼 수 있듯이, 내가 찾고 있어요 (100) 좋아하는, 2 개 개의 다른 입자의 변위를 만드는,하지만 난 입자의 큰 숫자를해야 제대로 의미 변위를 계산하기 위해 동일한 코드를 100 번 반복 할 수 없기 때문에 코드를 응축하는 방법을 찾아야합니다.

이 코드를 모두 1 변수 (즉, 입자 수)의 함수로 만드는 루프를 만드는 방법이 있습니까?

감사합니다.

+0

'import's 다음에는 첫 번째 줄'N = 100'을'def function_name (N) :'으로 바꾸고 나머지 코드는 들여 쓰기합니다. 그런 다음 새로운 함수를 호출하고 인수 값으로 입자 수를 전달할 수 있습니다 (즉, function_name (42)). – martineau

답변

0

지금까지 파이썬 코드 한 줄을 작성하지 않았기 때문에 나는 실용적인 파이썬 코드를 제공 할 수 없습니다. 그러나 문제 해결 방법을 알려줄 수 있습니다.


가정 :

N : Number of Moves 
P : Number of Particles 

단계 1 :
이 방법 어레이 /리스트를 생성하고 리턴 만들기. 따라서 코드를 다시 사용하고 코드를 복사하지 않아도됩니다. 2 단계

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 

:
이 목록의 목록을 만들고, 그것을 particleMotions를 호출 할 수 있습니다. 자필 목록은 N 목록의 목록입니다. 첫 번째 단계에서 메서드를 호출하고 반환 된 목록/배열로 paticleMotions 목록을 추가하여 입자 번호 P의 for 루프 내에서 목록을 채 웁니다.

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) 

이제 for 루프를 사용하여 결과를 그릴 수 있습니다.

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

그래서 다시 구문 오류를 저를 비난하지 않는다. 나는 phyton 개발자가 아니다. 나는 당신에게 당신의 문제를 해결할 수있는 방법을주고 싶습니다.

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() 
관련 문제