2017-02-03 1 views
3

나는 메트로폴리스 알고리즘을 가르쳐 파이썬으로 코드화 해보기로 결정했다. 나는 이싱 모델을 시뮬레이션하기로 결정했다. 내가 파이썬의 아마추어 이해하고 여기에 내가 생각 해낸 것입니다 - 내가 그 위의 16 × 16 또는 새로운 것을 시도 할 때 Tkinter의 예외와 흰색 밴드에서 'KeyError를'그렇다하고파이썬에서 이싱 모델 시뮬레이션하기

import numpy as np, matplotlib.pyplot as plt, matplotlib.animation as animation 

def Ising_H(x,y): 

    s = L[x,y] * (L[(x+1) % l,y] + L[x, (y+1) % l] + L[(x-1) % l, y] + L[x,(y-1) % l]) 
    H = -J * s 
    return H 

def mcstep(*args): #One Monte-Carlo Step - Metropolis Algorithm 

    x = np.random.randint(l) 
    y = np.random.randint(l) 
    i = Ising_H(x,y) 
    L[x,y] *= -1 
    f = Ising_H(x,y) 
    deltaH = f - i 
    if(np.random.uniform(0,1) > np.exp(-deltaH/T)): 
     L[x,y] *= -1 

    mesh.set_array(L.ravel()) 
    return mesh, 

def init_spin_config(opt): 

    if opt == 'h': 
     #Hot Start 
     L = np.random.randint(2, size=(l, l)) #lxl Lattice with random spin configuration 
     L[L==0] = -1 
     return L 

    elif opt =='c': 
     #Cold Start 
     L = np.full((l, l), 1, dtype=int) #lxl Lattice with all +1 
     return L 

if __name__=="__main__": 

    l = 15 #Lattice dimension 
    J = 0.3 #Interaction strength 
    T = 2.0 #Temperature 
    N = 1000 #Number of iterations of MC step 
    opt = 'h' 

    L = init_spin_config(opt) #Initial spin configuration 

    #Simulation Vizualization 
    fig = plt.figure(figsize=(10, 10), dpi=80) 
    fig.suptitle("T = %0.1f" % T, fontsize=50) 
    X, Y = np.meshgrid(range(l), range(l)) 
    mesh = plt.pcolormesh(X, Y, L, cmap = plt.cm.RdBu) 
    a = animation.FuncAnimation(fig, mcstep, frames = N, interval = 5, blit = True) 
    plt.show() 

, 그것은 본다 잘 작동합니다. 이제 내가 알고 싶은 건 -

FuncAnimation을 사용하여 몬테카를로 시뮬레이션을하고 내 메시 플롯에 애니메이션을 적용하는 방법에 대해 불편한 점이 있습니까?

그런 저온 시작은 어떨까요? 나가 얻고있는 모두는 빨간 스크린이다.

또한 KeyError 및 흰색 밴딩에 대해 알려주십시오.

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1540, in __call__ 
     return self.func(*args) 
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 590, in callit 
    func(*args) 
    File "/usr/local/lib/python2.7/dist-packages/matplotlib/backends/backend_tkagg.py", line 147, in _on_timer 
     TimerBase._on_timer(self) 
    File "/usr/local/lib/python2.7/dist-packages/matplotlib/backend_bases.py", line 1305, in _on_timer 
     ret = func(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 1049, in _step 
     still_going = Animation._step(self, *args) 
    File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 855, in _step 
     self._draw_next_frame(framedata, self._blit) 
    File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 873, in _draw_next_frame 
     self._pre_draw(framedata, blit) 
    File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 886, in _pre_draw 
     self._blit_clear(self._drawn_artists, self._blit_cache) 
    File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 926, in _blit_clear 
     a.figure.canvas.restore_region(bg_cache[a]) 
KeyError: <matplotlib.axes._subplots.AxesSubplot object at 0x7fd468b2f2d0> 
+0

특히 KeyError가 발생합니까? 스택 추적을 제공 할 수 있습니까? – lordingtar

답변

3

당신은 한 번에 많은 질문을 요구하고있다 -

'KeyError를'

는 다음과 같이 내놓았다.

  • KeyError은 : 복제 할 수 없습니다. 일부 어레이 크기에서만 발생해야하며 다른 배열에서는 발생하지 않는 것이 이상합니다. 아마도 뭔가 백엔드 문제, 당신은
    import matplotlib
    matplotlib.use("Qt4Agg")
  • 흰색 띠 스크립트의 상단에 그 라인을 배치하여 다른 하나를 사용하려고 할 수 있습니다 : 중 하나를 재현 할 수는 없지만, 아마도 그들은에서 온 자동화 된 축 스케일링. 이를 방지하려면 완벽하게 괜찮 몬테카를로 시뮬레이션을 할 FuncAnimation를 사용하여 축 한계를 수동으로 plt.xlim(0,l-1) plt.ylim(0,l-1)
  • 을 설정할 수 있습니다. f 코스가 가장 빠른 방법은 아니지만 화면에서 시뮬레이션을 따르고 싶다면 아무 문제가 없습니다. 그러나 왜 시간 단위당 하나의 스핀 플립 핑이 있을지에 대한 질문을 할 수 있습니다. 그러나 그것은 프로그래밍에 관한 것보다 물리학에 관한 더 많은 질문입니다.

  • 콜드 스타트 ​​용 빨간색 화면 : 콜드 스타트의 경우 1과 함께 그리드를 초기화합니다. 그리드의 최소값은 이고입니다. 이는 1입니다. 따라서 pcolormesh의 색상 맵은 [1,1] 범위로 정규화되며 모두 빨간색입니다. 일반적으로 vminvmax 인수를 사용하여 수행 할 수있는 색상 표가 [-1,1]이되도록합니다.

    mesh = plt.pcolormesh(X, Y, L, cmap = plt.cm.RdBu, vmin=-1, vmax=1)
    이렇게하면 "콜드 스타트"에 대한 예상되는 동작을 제공해야합니다.

+0

KeyError에 대해 잘 모르겠지만 가능한 해결책으로 답변을 업데이트했습니다. – ImportanceOfBeingErnest

+0

귀하의 답변은 저온 시작 문제를 해결하고 흰색 밴드를 제거하는 데 도움이되었습니다. 감사합니다. 당신이 말했듯이 두 경우 모두 문제가되었던 것은 잘못된 범위였습니다.당신이보고 싶다면, 또한 KeyError 문제에 대한 스택 추적 내 질문을 편집했습니다! 나는 FuncAnimation이 가장 빠르지 않을 것이라는 데 동의하며, 나는 놀고 시스템이 평형에 도달하는 것을 실제로보고있다. 차라리 자화 및 자기 상관 함수를 살펴볼 것입니다. 그러나 matplotlib 플롯을 동적으로 업데이트하고 시뮬레이션을 시각화하는 다른 방법이 있습니까? –

+0

'FuncAnimation'을 사용하는 대신'mcstep'을 수동으로 또는 루프 내에서 호출 할 수 있습니다.이 경우'fig.canvas.draw()'와'plt.pause (1e-5)'를 추가하여 루프를 업데이트해야합니다. 플롯하고 창문이 반응하지 않도록하십시오. FuncAnimation을 사용하지 않는 이유는 무엇입니까? – ImportanceOfBeingErnest

관련 문제