Від мікростанів до макростанів
Класична термодинаміка описує теплові двигуни й фазові діаграми, не запитуючи, що роблять молекули. Статистична механіка робить протилежне: вона виводить кожну термодинамічну величину — температуру, ентропію, тиск — з мікроскопічних імовірностей. Міст між ними простий: система в тепловій рівновазі займає кожен мікростан з імовірністю, пропорційною e^(−E/kT), фактору Больцмана.
Ентропія S = k·ln(Ω) підраховує мікростани. Другий закон — ентропія ніколи не зменшується в ізольованій системі — не каже нічого більшого, ніж те, що система прямує до макростанів з більшою кількістю мікростанів. При 10²³ частинках імовірність руху назад практично дорівнює нулю.
Імовірність мікростану i: P_i = e^(−E_i/kT) / Z
Статистична сума: Z = Σ_i e^(−E_i/kT) (сума за всіма
мікростанами)
Вільна енергія Гельмгольца: F = −kT · ln Z
Середня енергія: ⟨E⟩ = −∂(ln Z)/∂β де β = 1/kT
Ентропія: S = −∂F/∂T = k·ln Z + ⟨E⟩/T
Гамільтоніан Ізінга: H = −J·Σ_{⟨ij⟩} s_i·s_j − h·Σ_i s_i
Імовірність прийняття в Метрополісі: min(1, e^(−ΔE/kT))
Фазові переходи й критичні явища
Модель Ізінга зазнає фазового переходу другого роду при температурі Кюрі T_c ≈ 2.269 J/k (точний 2D-розв'язок Онсагера, 1944). Нижче T_c система порушує симетрію: спіни вирівнюються феромагнітно. Точно при T_c довжина кореляції ξ → ∞, флуктуації відбуваються на кожному масштабі довжини, і система описується масштабно-інваріантною (конформною) теорією поля. Саме тому критична опалесценція виглядає однаково під мікроскопом чи на відстані витягнутої руки.
Чому працює алгоритм Метрополіса? Правило Метрополіса — завжди приймати рухи, що знижують енергію, іноді приймати рухи, що її підвищують — задовольняє детальну рівновагу: потік імовірності зі стану A до стану B дорівнює потоку з B до A в рівновазі. Це гарантує, що ланцюг Маркова сходиться до розподілу Больцмана незалежно від початкової конфігурації.
Реалізація методу Монте-Карло Метрополіса
// Крок Метрополіса для моделі Ізінга (2D, періодична межа)
function metropolisStep(spins, J, T) {
const N = spins.length;
const i = (Math.random() * N) | 0;
const j = (Math.random() * N) | 0;
// Зміна енергії від перевертання spin[i][j]
const s = spins[i][j];
const neighbours =
spins[(i + 1) % N][j] + spins[(i - 1 + N) % N][j] +
spins[i][(j + 1) % N] + spins[i][(j - 1 + N) % N];
const dE = 2 * J * s * neighbours;
// Прийняти / відхилити (критерій Метрополіса)
if (dE <= 0 || Math.random() < Math.exp(-dE / T)) {
spins[i][j] = -s; // перевернути спін
}
}