В настоящее время я выполняю симуляцию модели Маркова Цепи Монте-Карло с использованием алгоритма Метрополиса-Хастинга. Чтобы убедиться, что мое моделирование работает должным образом, я рассчитываю вычислить точное выражение функции разделения, чтобы получить истинное равновесное распределение, а затем сравнить частоты дискретизации моей решетки (построенные в виде гистограммы) из моделирования и сравните это с истинным распределением.
Я знаю, что это довольно вычислительно тяжело для больших решеток , поэтому я хочу сделать это только для решеток с небольшими размерами. Для того чтобы вычислить функцию разделения, которая показывает истинное распределение
Z = np.exp(-beta*energy_i)/sum(np.exp(-beta*energy_n))
Для решетки 2x2
существует 2^4=16
конфигураций решетки, для каждой конфигурации i
ее энергия рассчитывается по этой функции. Здесь i = 1, 2,..., 16
, а знаменатель Z
является суммой всех экспоненциальных членов конфигураций. Beta
- это обратная температура, но если вы просто оставите ее, я сам разберусь.
def calcEnergy(config):
'''Energy of a given configuration'''
energy = 0
for i in range(len(config)):
for j in range(len(config)):
S = config[i, j]
nb = config[(i+1) % N, j] + config[i, (j+1) % N] + \
config[(i-1) % N, j] + config[i, (j-1) % N]
energy += -nb*S
return energy/4.