Анимируйте эволюцию цепи Маркова в двумерном массиве с помощью python matplotlib imshow

#python #arrays #matplotlib

#python #массивы #matplotlib

Вопрос:

Я пытаюсь написать алгоритм Metropolis для хардкорной модели на 2-мерной решетке. Алгоритм, который я написал до сих пор, похоже, работает и выглядит следующим образом:

-Выберите вершину двумерной решетки -Бросьте честную монету -Если монета выпадает орлом, и все соседи вершины принимают значение 0, затем установите для вершины значение 1, в противном случае 0.

Я пытаюсь анимировать эволюцию решетки. Вот что я написал до сих пор: алгоритм для имитации работает. Анимация не такая, как я хочу. Вот алгоритм:

     import random 
    from matplotlib import animation
    import matplotlib.pyplot as plt
    from matplotlib.animation import FuncAnimation


    def Nachbarn(x0,x1,B): #test neighbours
        if x1  1 < len(B) and B[x0][x1 1] == 1 : #top
            return True
        elif x0   1 < len(B) and B[x0 1][x1] == 1 : #right
            return True
        elif x1 -1 >= 0 and B[x0][x1 -1] == 1 : #down
            return True
        elif x0 -1 >= 0 and B[x0-1][x1] == 1 : #left
            return True
        else: 
            return False

    def Eckenwahl(B): 
        Länge = len(B)
        x = random.choices(range(Länge),k=2) #choose a vertex
        x0 = x[0]
        x1 = x[1] 
        return x0,x1

    def Münzwurf():
        value = random.randint(0,1) #Toss a coin
        return value

    def MCMC(Array): #MCMC i-te Iteration
        Ecke = Eckenwahl(Array)
        if Münzwurf() == 1 and Nachbarn(Ecke[0],Ecke[1],Array) == False:
            Array[Ecke[0]][Ecke[1]] = 1
        else: 
            Array[Ecke[0]][Ecke[1]] = 0
        return Array
  

Теперь инициализируйте решетку:

     N = 10        #Initialisierung of empty lattice
    A = [[0] * N for i in range(N)]
  

Если я применю функцию MCMC к массиву «A» несколько раз и начну анимацию с непустой решетки:

     for i in range(5):
        A = MCMC(A)
  

анимация, похоже, выполняется, в противном случае она застревает в пустой решетке и не движется вперед. Но я хочу начать его с пустой решетки. Вот два решения, которые пока имеют эти ограничения:

Решение 1:

     fig = plt.figure()
    im = plt.imshow(A, animated = True)

    def update_fig(*args):
        global A
        B = MCMC(A)
        im.set_data(B)
        return im

    ani = animation.FuncAnimation(fig, update_fig, interval = 1)
    plt.show()
  

Решение 2:

     fps = 300
    nSeconds = 10
    fig = plt.figure( figsize=(8,8) )

    a = A
    im = plt.imshow(A)

    def animate_func(i):
        im.set_array(MCMC(A))
        return [im]

    anim = animation.FuncAnimation(fig, animate_func, frames = nSeconds * 
    fps,interval = 1000 / fps,)
  

Проблема в том, что все готово. Я хочу начать с двумерного массива / решетки, который заполнен 0, называемыми пустой конфигурацией, затем в момент времени t = 1 примените функцию MCMC к массиву, затем отобразите ее в анимации и так далее для t = 2,3,…

Спасибо за помощь!

Комментарии:

1. Привет, где ты определил FuncAnimation ? не могли бы вы, пожалуйста, предоставить и это тоже?

2. Привет всем, спасибо за ответ, я соответствующим образом обновил код. Функция FuncAnimation импортируется из Matplotlib. Я попытался сформулировать свой вопрос в одном предложении в конце, чтобы сделать его более понятным 🙂

3. Ах, не знал, что это была функция matplotlib. Придется попробовать это в выходные 🙂 сегодня уже слишком поздно

4. Да, здорово 🙂 Я немного отредактировал проблему, так как нашел два полурешения с ограничениями, поскольку анимация не запускается, когда она начинается с пустой решетки.