2014-10-20 3 views
1

2 방향 랜덤 워크를 시뮬레이션 중입니다. < θ < 2π 및 T = 1000 단계. 파이썬에서 2 차원 무작위 걸음의 평균 제곱 변위 계산

a=np.zeros((1000,2), dtype=np.float) 
print a         # Prints array with zeros as entries 

# Single random walk 
def randwalk(x,y):    # Defines the randwalk function 
    theta=2*math.pi*rd.rand() 
    x+=math.cos(theta); 
    y+=math.sin(theta); 
    return (x,y)    # Function returns new (x,y) coordinates 

x, y = 0., 0.     # Starting point is the origin 
for i in range(1000):   # Walk contains 1000 steps 
    x, y = randwalk(x,y) 
    a[i,:] = x, y    # Replaces entries of a with (x,y) coordinates 

# Repeating random walk 12 times 
fn_base = "random_walk_%i.txt"  # Saves each run to sequentially named .txt 
for j in range(12): 
    rd.seed()      # Uses different random seed for every run 
    x, y = 0., 0. 
    for i in range(1000): 
     x, y = randwalk(x,y) 
     a[i,:] = x, y 
    fn = fn_base % j    # Allocates fn to the numbered file 
    np.savetxt(fn, a)    # Saves run data to appropriate text file 

가 지금은 12 개의 볼넷을 통해 평균 제곱 변위를 계산하려면 : 이미 하나의 거리를 시뮬레이션 그것을 12 번 반복하고, 각 순차적라는 이름의 텍스트 파일로 실행 저장하는 코드가 있습니다. 이렇게하려면 내 초기 생각은 다시 NumPy와 배열 등으로 각 텍스트 파일에서 데이터를 가져올 수 있었다 :

infile="random_walk_0.txt" 
rw0dat=np.genfromtxt(infile) 
print rw0dat 

그리고 어떻게 든 평균 제곱 변위를 찾기 위해 배열을 조작 할 수 있습니다.

내가 갖고있는 것으로 MSD를 찾는 더 효율적인 방법이 있습니까?

+0

왜 텍스트 파일로 저장하고 다시 가져와야합니까? 스크립트에서이 작업을 수행 할 수 있습니까? – heidi

+0

@heidi 그것이 작업을 위해 수행해야하는 작업입니다. 모든 실행을 위해 별도의 텍스트 파일이 있어야합니다. –

답변

0

첫 번째로, 실제로는 최종 위치 인 1000 걸음 전체를 저장할 필요가 없습니다.

또한 텍스트 파일에 저장하고 다시로드 할 필요가 없습니다. 메모리에서 사용할 수 있습니다. 배열 목록이나 1 차원 이상의 배열에 넣을 수 있습니다. 글을 써야 할 필요가 있더라도 과 대신 대신 최종 값을 유지할 수 있습니다. 또한 실제로 2D 배열을 구현하는 데 성능이나 단순성을 위해 numpy을 사용하지 않는 경우 반복적으로 (예 : csv 모듈을 사용하여) 구축하는 것을 고려할 수 있지만 그 중 하나는 판단 전화입니다.

여하튼, 12 개의 최종 포지션이 주어지면 각각의 거리를 (0, 0)에서 계산 한 다음, 모두 합계하고 12로 나눕니다. (또는 (0, 0)에서 거리를 계산하는 분명한 방법은 다음과 같습니다. 당신이을 원하는 경우 바로 xy 위치의 사각형을 추가 한 다음 결과하는 squareRoot, 단지 마지막에하는 squareRoot과 광장을 건너 뜁니다.)

을하지만,을 사용하여 각각의 전체 워크를 파일로 저장 한 다음 다시로드 한 후 walk[-1]은 최종 위치를 2 값의 1D 배열로 제공합니다. 따라서 12 개의 최종 위치를 12x2 배열로 읽고 평균 제곱 거리를 벡터화하거나 목록에 누적하여 수동으로 수행 할 수 있습니다.

우리가 여기있는 동안 rd.seed()은 필요하지 않습니다. PRNG의 핵심은 seed를 원래 값으로 다시 설정하지 않으면 명시 적으로 다른 숫자를 얻는 것입니다. 여기

destinations = np.zeros((12, 2), dtype=np.float) 
for j in range(12): 
    x, y = 0., 0. 
    for i in range(1000): 
     x, y = randwalk(x, y) 
    destinations[j] = x, y 

square_distances = destinations[:,0] ** 2 + destinations[:,1] ** 2 
mean_square_distance = np.mean(square_distances) 
+0

답변 해 주셔서 감사합니다.명확히하기 위해, walk_page에 의해 커버되는 평균 총 거리를 계산하는 square_distances인가, 아니면 단지 최종 위치를 사용하고 평균 변위를 계산하는 것입니까? –

+0

@lntrinsic : 최종 거리를 계산하는 것입니다. 이것은 총 거리와 동일한 것입니다. "총 거리"가 아니라면 총 걸음 수를 의미합니까?이 경우 매번 상수가 '1000.0'입니까? – abarnert

+0

물론. 나는 혼란스러워했다. 다시 한번 감사드립니다. –

2

을 평균 제곱 변위 (MSD)를 계산하는 빠른 snipet입니다 :

다음은 두 개의 여분의 복잡성을 삭제하고 직접 모든 일의 예입니다. 경로는 시간상 균등 한 간격의 포인트로 이루어지며 랜덤 워크의 경우는 입니다. 당신은 그냥 12-walk for 루프에 넣고 각각에 대해 계산할 수 있습니다. [i ,:]

#input path =[ [x1,y1], ... ,[xn,yn] ]. 

def compute_MSD(path): 
    totalsize=len(path) 
    msd=[] 
    for i in range(totalsize-1): 
     j=i+1 
     msd.append(np.sum((path[0:-j]-path[j::])**2)/float(totalsize-j)) 

    msd=np.array(msd) 
    return msd 
+0

내 오류의 원인은 무엇입니까? msd.append (np.sum (path [0 : -j] -path [j ::]) ** 2)/float (totalsize-j) TypeError : 지원되지 않음 - : 'list'및 'list'에 대한 피연산자 유형 – mrz