#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. Да, здорово 🙂 Я немного отредактировал проблему, так как нашел два полурешения с ограничениями, поскольку анимация не запускается, когда она начинается с пустой решетки.