2017-02-03 149 views
3

Я научил себя алгоритму метрополии и решил попробовать его код на Python. Я решил имитировать модель Изинга. У меня есть любительское понимание Python и с этим вот что я придумал -Моделирование модели Изинга в Python

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

Помимо «KeyError» от исключения Tkinter и белых полос, когда я пытаюсь 16x16 или что-нибудь выше, что это выглядит и отлично работает. Теперь я хочу знать, если это правильно, потому что -

Мне неудобно, как я использовал FuncAnimation для моделирования в Монте-Карло и анимировать мой сетчатый сюжет - это даже имеет смысл?

А как насчет этого холодного старта? Все, что я получаю, это красный экран.

Также, пожалуйста, расскажите мне об KeyError и о белой полосе.

«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: не может быть воспроизведен. Странно, что это должно происходить только для некоторых размеров массива, а не для других. Возможно, что-то не так с внутренним интерфейсом, вы можете попробовать использовать другой, помещая эти строки в верхней части сценария
    import matplotlib
    matplotlib.use("Qt4Agg")
  • белых полосы: не могут быть воспроизведены либо, но, возможно, они приходят из автоматическое масштабирование осей. Чтобы избежать этого, вы можете установить пределы осей вручную plt.xlim(0,l-1) plt.ylim(0,l-1)
  • Использование FuncAnimation сделать моделирование методом Монте-Карло это прекрасно. Конечно, это не самый быстрый метод, но если вы хотите следить за симуляцией на экране, в этом нет ничего плохого. Тем не менее, можно задать вопрос о том, почему будет только один оборот спина за единицу времени. Но это вопрос скорее о физике, чем о программировании.

  • Красный экран для холодного старта: В случае холодного запуска, вы инициализации сетки только 1 с. Это означает, что минимальное значение и максимальное значение в сетке равно 1. Поэтому цветовая палитра pcolormesh нормализуется до диапазона [1,1] и все красные. В общем случае вы хотите, чтобы цветовая палитра охватывала [-1,1], что можно сделать, используя аргументы vmin и vmax.

    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

 Смежные вопросы

  • Нет связанных вопросов^_^