Здравствуйте, у меня стоит задача численного моделирования 2D Изинга при помощи
алгоритма Вольффа. Вроде как написал правильный код, теперь нужно анализировать данные. И тут у меня возникает проблема. Вот пример двух значений среднего спина для температур выше (
) и ниже (
) критической для небольшой системы
:
(Оффтоп)
Видно, что значение сильно флуктуирует. И вроде бы как это имеет смысл. Действительно, в кластерных алгоритмах спины переворчаиваются сразу большими блоками, причём (для алгоритма Вольффа) вероятность принятия новой конфигурации равна единице. Поэтому даже после установления равновесия большие кластеры будут то и дело переворачиваться. В таких случаях, насколько я знаю, используют разные приёмы вроде усреднения по блокам (block averaging). Но из-за
симметрии я не очень понимаю, как поступить здесь. По-хорошему мне бы получить два средних:
и
. И тогда разумной оценкой было бы
. Но как вычленить
и
? Ну или как поступить по-другому?
UPDT: В общем, сделал пока что по-колхозному. Создал
M_pos = 0, M_neg = 0, T_pos = 0, T_neg = 0. На каждом монте-карловском шаге после
T_therm (задаю сам) смотрю на знак среднего значения спина
M. Если положительный, то
M_pos += M и
T_pos++, а если отрицательный, то
M_neg += M и
T_neg++. Потом это дело усредняю
M_pos = M_pos/T_pos,
M_neg = M_neg/T_neg, а итоговое среднее считаю как
M_avg =
(M_pos - M_neg)/2. Разумеется, можно сделать ещё и оценку ошибки. Результаты выглядят в целом неплохо. Если кто-то может подсказать более разумный способ, буду рад услышать.