11장 — 이징 모형과 상전이

엔트로피와 결합의 겨루기: 봉우리가 갈라지는 자리

스핀 1만 개에서 βJ = 0.9와 1.1은 전혀 다른 계였다. 그렇다면 그 경계는 정확히 어디이고, 무엇이 스핀들을 두 무리로 나누는 것일까?

스핀 하나당 점수

확률의 로그를 스핀 수로 나눠 보면 두 항이 겨루는 모양이 드러난다. 배치의 수 W(n)은 동전 N개 가운데 앞면 n개를 고르는 수와 같아서, N이 크면 그 로그가 N × (위를 향할 확률이 (1 + m)/2인 스핀 하나의 엔트로피)에 가깝다. 에너지 쪽은 −βE = βJ(Nm² − 1)/2이므로 스핀 하나당 βJm²/2다. 둘을 더한 스핀 하나당 점수와 그 점수를 가장 크게 하는 조건은 다음과 같다.

1Nln⁡[W e−βE]≈H(1+m2)+βJ2 m2 ≈ ln⁡2−1−βJ2 m2−m412ddm[H(1+m2)+βJ2 m2]=−artanh⁡m+βJ m=0  ⟹  m=tanh⁡(βJ m)\begin{aligned} \frac{1}{\textcolor{#1f77b4}{N}} \ln\big[\textcolor{#d62728}{W}\, e^{-\textcolor{#8c564b}{\beta}\textcolor{#ff7f0e}{E}}\big] &\approx \textcolor{#9467bd}{H}\Big(\frac{1+\textcolor{#dd6677}{m}}{2}\Big) + \frac{\textcolor{#8c564b}{\beta}\textcolor{#b8860b}{J}}{2}\,\textcolor{#dd6677}{m}^2 \ \approx\ \ln 2 - \frac{1-\textcolor{#8c564b}{\beta}\textcolor{#b8860b}{J}}{2}\,\textcolor{#dd6677}{m}^2 - \frac{\textcolor{#dd6677}{m}^4}{12} \\ \frac{d}{d\textcolor{#dd6677}{m}}\Big[\textcolor{#9467bd}{H}\Big(\frac{1+\textcolor{#dd6677}{m}}{2}\Big) + \frac{\textcolor{#8c564b}{\beta}\textcolor{#b8860b}{J}}{2}\,\textcolor{#dd6677}{m}^2\Big] &= -\operatorname{artanh}\textcolor{#dd6677}{m} + \textcolor{#8c564b}{\beta}\textcolor{#b8860b}{J}\,\textcolor{#dd6677}{m} = 0 \ \ \Longrightarrow\ \ \textcolor{#dd6677}{m} = \tanh(\textcolor{#8c564b}{\beta}\textcolor{#b8860b}{J}\,\textcolor{#dd6677}{m}) \end{aligned}
H(1+m2)위를 향할 확률이 (1 + m)/2인 스핀 하나의 엔트로피 (nat). 배치 수의 로그를 N으로 나눈 것12βJ m2스핀 하나당 결합 에너지의 이득 (볼츠만 인자의 로그)βJ결합 계수와 온도의 비m스핀 전체의 평균 방향W, E, N배치의 수, 에너지, 스핀의 수 (위 식과 같다)\begin{array}{ll} \textcolor{#9467bd}{H}\big(\tfrac{1+\textcolor{#dd6677}{m}}{2}\big) & \text{위를 향할 확률이 (1 + m)/2인 스핀 하나의 엔트로피 (nat). 배치 수의 로그를 N으로 나눈 것} \\ \tfrac{1}{2}\textcolor{#8c564b}{\beta}\textcolor{#b8860b}{J}\,\textcolor{#dd6677}{m}^2 & \text{스핀 하나당 결합 에너지의 이득 (볼츠만 인자의 로그)} \\ \textcolor{#8c564b}{\beta}\textcolor{#b8860b}{J} & \text{결합 계수와 온도의 비} \\ \textcolor{#dd6677}{m} & \text{스핀 전체의 평균 방향} \\ \textcolor{#d62728}{W},\ \textcolor{#ff7f0e}{E},\ \textcolor{#1f77b4}{N} & \text{배치의 수, 에너지, 스핀의 수 (위 식과 같다)} \end{array}

첫째 항인 엔트로피는 m = 0에서 ln 2로 가장 크고, 스핀들이 한쪽으로 모일수록 배치가 줄어 작아진다. 둘째 항인 결합 에너지의 이득은 반대로 m의 크기가 클수록 커진다. 0 근처에서 두 항을 합치면 m²의 계수가 −(1 − βJ)/2이므로, βJ가 1보다 작으면 0이 봉우리이고 1보다 크면 0이 골짜기가 되어 양옆에 봉우리가 하나씩 생긴다. 엔트로피가 0 근처에서 점수를 끌어내리는 곡률은 스핀 하나당 1로 정해져 있는데 결합이 끌어올리는 곡률은 βJ이므로, βJ = 1에서 승자가 바뀌는 것이다. 스핀 1만 개에서 0.9와 1.1이 전혀 다른 계가 된 이유가 이것이다.

스핀 하나당 점수를 두 항으로 나눠 그린 것. 엔트로피(보라 점선)는 m = 0에서 ln 2로 가장 크고 양 끝에서 0으로 떨어지며, 결합 에너지의 이득 βJm²/2(금색 점선)는 양 끝으로 갈수록 커진다. βJ = 0.8에서는 둘의 합(검은 선)이 0에서 가장 크지만, βJ = 1.5에서는 0 근처가 오목하게 꺼지고 봉우리가 ±0.859 두 곳에 생긴다.
스핀 하나당 점수를 두 항으로 나눠 그린 것. 엔트로피(보라 점선)는 m = 0에서 ln 2로 가장 크고 양 끝에서 0으로 떨어지며, 결합 에너지의 이득 βJm²/2(금색 점선)는 양 끝으로 갈수록 커진다. βJ = 0.8에서는 둘의 합(검은 선)이 0에서 가장 크지만, βJ = 1.5에서는 0 근처가 오목하게 꺼지고 봉우리가 ±0.859 두 곳에 생긴다.

봉우리의 자리는 도함수를 0으로 놓아 찾는다. 엔트로피 항의 도함수가 −artanh m(artanh는 tanh를 거꾸로 돌린 함수, 곧 tanh의 역함수다)이므로 조건은 m = tanh(βJm)이고, 이 식의 양수 해는 βJ = 1.1에서 0.5029, 1.5에서 0.8586이다. 스핀 1만 개에서 센 봉우리 0.503, 0.859와 같다. 스핀 100개에서 0.88이 나온 것은 스핀 수가 적어 로그 근사가 덜 맞기 때문이다. 이 식은 「스핀 하나가 나머지 스핀들의 평균 방향 m에 βJ를 곱한 만큼 한쪽으로 끌릴 때, 그 스핀이 향하는 평균 방향」으로 읽을 수도 있다. 모든 쌍이 똑같이 묶인 이 계에서는 그렇게 읽어도 스핀이 많을수록 정확해진다.

스핀이 많을수록 전환이 날카로워지는 이유도 이 점수에 있다. 확률은 스핀 하나당 점수에 N을 곱한 값의 지수이므로, 봉우리와 0의 점수 차이가 작아도 확률의 비는 N에 대해 지수적으로 벌어진다. βJ = 1.5에서 그 차이는 스핀 하나당 0.1152 nat이라서, 스핀 100개이면 봉우리 근처가 0 근처보다 약 e^11.5배(정확히 세면 e^12.2배), 1000개이면 약 e^115배 더 흔하다.

이제 무엇이 스핀들을 두 무리로 나누는지 말할 수 있다. 엔트로피는 스핀들을 제각각 두려 하고 결합은 한쪽으로 모으려 하는데, βJ가 1을 넘으면 모으는 쪽이 이긴다. 그런데 에너지는 모든 스핀을 뒤집어도 같으므로 위로 모이는 것과 아래로 모이는 것이 똑같이 좋고, 그래서 봉우리가 대칭인 두 곳에 생긴다.

코드로 확인: 스핀 100개를 무리별로 세어 보기

앞의 표들과, 뒤에서 쓸 N × Var(m)의 표를 한 번에 만든다. 위를 향한 스핀 수 n으로 배치를 묶으면 2^N개 대신 N + 1개의 항만 더하면 되므로 스핀 1만 개도 곧바로 계산된다. 마지막 부분은 봉우리 조건 m = tanh(βJm)을 되풀이 대입으로 푼다.

import numpy as np
from math import lgamma

def m_distribution(N, K, b=0.0):
    """모든 쌍에 결합 계수 J/N을 둔 스핀 N개의 평균 방향 m의 분포 (K = βJ, b = β × 편향).
    위를 향한 스핀 수 n이 같은 배치는 에너지가 같으므로 2^N개 대신 N + 1개의 무리로 묶어 정확히 센다."""
    n = np.arange(N + 1)
    M = 2 * n - N                                            # (위를 향한 수) − (아래를 향한 수)
    log_W = np.array([lgamma(N + 1) - lgamma(k + 1) - lgamma(N - k + 1) for k in n])
    log_w = log_W + K * (M**2 - N) / (2 * N) + b * M         # ln W(n) − βE(n)
    p = np.exp(log_w - log_w.max())
    return M / N, p / p.sum()

for K in (0.5, 0.9, 1.0, 1.1, 1.5):
    for N in (100, 1000, 10000):
        m, p = m_distribution(N, K)
        print(f"βJ = {K}, N = {N:5d}: 봉우리 |m| = {abs(m[p.argmax()]):.3f}, "
              f"P(|m| < 0.1) = {p[np.abs(m) < 0.1].sum():.3f}, N·Var(m) = {N * (p @ m**2):7.2f}")

for K in (1.1, 1.5):                                          # 큰 N의 봉우리: m = tanh(βJ·m)의 양수 해
    x = 1.0
    for _ in range(500):
        x = np.tanh(K * x)
    print(f"βJ = {K}: m = tanh(βJ·m)의 해 = {x:.4f}")
# βJ = 0.5, N =   100: 봉우리 |m| = 0.000, P(|m| < 0.1) = 0.476, N·Var(m) =    1.96
# βJ = 0.5, N =  1000: 봉우리 |m| = 0.000, P(|m| < 0.1) = 0.973, N·Var(m) =    2.00
# βJ = 0.5, N = 10000: 봉우리 |m| = 0.000, P(|m| < 0.1) = 1.000, N·Var(m) =    2.00
# βJ = 0.9, N =   100: 봉우리 |m| = 0.000, P(|m| < 0.1) = 0.251, N·Var(m) =    6.57
# βJ = 0.9, N =  1000: 봉우리 |m| = 0.000, P(|m| < 0.1) = 0.690, N·Var(m) =    9.26
# βJ = 0.9, N = 10000: 봉우리 |m| = 0.000, P(|m| < 0.1) = 0.999, N·Var(m) =    9.91
# βJ = 1.0, N =   100: 봉우리 |m| = 0.180, P(|m| < 0.1) = 0.165, N·Var(m) =   11.45
# βJ = 1.0, N =  1000: 봉우리 |m| = 0.054, P(|m| < 0.1) = 0.328, N·Var(m) =   36.76
# βJ = 1.0, N = 10000: 봉우리 |m| = 0.017, P(|m| < 0.1) = 0.582, N·Var(m) =  116.81
# βJ = 1.1, N =   100: 봉우리 |m| = 0.540, P(|m| < 0.1) = 0.075, N·Var(m) =   21.90
# βJ = 1.1, N =  1000: 봉우리 |m| = 0.506, P(|m| < 0.1) = 0.001, N·Var(m) =  242.42
# βJ = 1.1, N = 10000: 봉우리 |m| = 0.503, P(|m| < 0.1) = 0.000, N·Var(m) = 2520.49
# βJ = 1.5, N =   100: 봉우리 |m| = 0.880, P(|m| < 0.1) = 0.000, N·Var(m) =   72.45
# βJ = 1.5, N =  1000: 봉우리 |m| = 0.860, P(|m| < 0.1) = 0.000, N·Var(m) =  735.97
# βJ = 1.5, N = 10000: 봉우리 |m| = 0.859, P(|m| < 0.1) = 0.000, N·Var(m) = 7370.10
# βJ = 1.1: m = tanh(βJ·m)의 해 = 0.5029
# βJ = 1.5: m = tanh(βJ·m)의 해 = 0.8586

βJ = 1.5에서 봉우리는 N이 커질수록 0.880, 0.860, 0.859로 옮겨 가며 m = tanh(βJm)의 해 0.8586에 다가가고, βJ = 1.0의 봉우리는 0으로 다가간다.

직접 움직여 보기점수 곡선과 봉우리 조건새 창에서 열기 ↗

문제 2. 임계점 바로 위의 봉우리

0 근처에서 스핀 하나당 점수는 ln 2 − (1 − βJ)m²/2 − m⁴/12로 어림된다. (가) 이 어림에서 봉우리의 자리를 βJ의 식으로 구하라. (나) βJ = 1.01, 1.1, 1.5에서 그 값을 m = tanh(βJm)의 해와 견주라.

이서연 S11
이서연

미분해서 0으로 두면 −(1 − βJ)m − m³/3 = 0이니까 m² = 3(βJ − 1), 곧 m = √(3(βJ − 1))이에요. 1.01이면 0.173, 1.1이면 0.548, 1.5면 1.225예요.

김민준 M02
김민준

나는 tanh 식을 되풀이 대입으로 풀었어. 0.1717, 0.5029, 0.8586이야. 1.01에서는 거의 같은데 1.1에서는 0.045 차이가 나고, 1.5에서는 0.37이나 벌어져.

선생님 T14
선생님

서연 학생, m은 원래 어느 범위의 값이었죠?

이서연 S04
이서연

위를 향한 비율에서 아래를 향한 비율을 뺀 거니까 −1부터 1까지요. 1.225는 나올 수가 없는 값이네요. 이 어림은 m이 작다고 보고 m⁶ 이상의 항을 버린 거라, 봉우리가 0에서 멀어지면 쓰면 안 되는 거였어요.

선생님 T01
선생님

그럼 이 어림이 맞는 자리에서는 무엇을 알려 줄까요?

김민준 M07
김민준

임계점 바로 위에서는 맞으니까… βJ가 1을 넘는 순간 봉우리가 어느 값으로 툭 떨어지는 게 아니라, 0에서부터 √(βJ − 1)처럼 자라 나온다는 거네요.

선생님 T02
선생님

맞아요. 그런데 √ 꼴은 0 근처에서 아주 가팔라서, 1을 0.01만 넘어도 봉우리가 벌써 0.17까지 가요.

이서연 S09
이서연

해석학 시간에 테일러 전개는 전개한 점 근처에서만 믿으라고 배운 거랑 같네요. 가까운 데서 잘 맞는다고 멀리까지 끌고 가면 안 되고요.