Как сгенерировать каждую возможную конфигурацию маленькой квадратной решетки с записями +1 и -1? (Модель Изинга) - PullRequest
0 голосов
/ 29 января 2020

В настоящее время я выполняю симуляцию модели Маркова Цепи Монте-Карло с использованием алгоритма Метрополиса-Хастинга. Чтобы убедиться, что мое моделирование работает должным образом, я рассчитываю вычислить точное выражение функции разделения, чтобы получить истинное равновесное распределение, а затем сравнить частоты дискретизации моей решетки (построенные в виде гистограммы) из моделирования и сравните это с истинным распределением.

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

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.

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Решил сам в конце. Для решетки с размерами LxL.

def true_dist(L):
    perm = [list(seq) for seq in itertools.product("01", repeat=L*L)]
    perm = [[int(x) for x in value] for i, value in enumerate(perm)]
    perm = np.array(perm).reshape(2**(L*L), L, L)
    perm = np.where(perm==1, perm, -1)
    return perm

Эта функция предоставляет все возможные конфигурации +1 и -1. Становится медленнее для большей решетки, но выполняет работу за меня.

0 голосов
/ 29 января 2020

Я не уверен, что понимаю описание проблемы, но отвечаю на вопрос в топи c:

Просто go l oop от 0 до n, где n - число возможных конфигураций, и для каждого «i» в l oop принимают его двоичное представление, предполагая, что 1 равно 1, а 0 равно -1

...