clear; N = 200; // 粒子数 J = 1; // 交換相互作用 H = 0.0; // 外部磁界 im = [0:N - 1]; im(1) = N; ip = [2:N + 1]; ip(N) = 1; Neq = 5 * N; Samp = 200; DIV = 19; rand("uniform"); // 乱数は一様乱数とする spin = ones(1,N); // スピン T = linspace(0.5,5,DIV); // 温度 // *** モンテカルロ計算 *** for kt = 1:DIV do // エネルギー e1 = 0; e2 = 0; mag1 = 0; mag2 = 0; for ks = 1:Samp do for kq = 1:Neq do is = ceil(N * rand()); de = J * 2 * spin(is) * (spin(im(is)) + spin(ip(is))); if de > 0 & exp(- de / T(kt)) < rand() then spin(is) = 1 * spin(is); else spin(is) = -1 * spin(is); end end mag1 = mag1 + sum(spin); mag2 = mag2 + sum(spin) ^ 2; e1 = e1 - J * (spin * [spin(2:$),spin(1)]'); e2 = e2 + (J * (spin * [spin(2:$),spin(1)]')) ^ 2; end M(kt) = mag1 / Samp; M2(kt) = mag2 / Samp; E(kt) = e1 / Samp; E2(kt) = e2 / Samp; X(kt) = (M2(kt) - M(kt) .^ 2) ./ T(kt) / N; C(kt) = (E2(kt) - E(kt) .^ 2) ./ T(kt) .^ 2 / N; end // 磁気感受率の逆数 RX = 1 ./ X; // *** 厳密解の計算 *** // 温度ベクトル Ta = linspace(0.1,5,50); // 粒子1個あたりの平均エネルギー Ea = - tanh(J ./ Ta); // 比熱 Ca = (J ./ Ta) .^ 2 ./ cosh(J ./ Ta) .^ 2; // 磁化 Ma = sinh(H ./ Ta) ./ sqrt(sinh(H ./ Ta) .^ 2 + exp(-4 * J ./ Ta)); // 磁気感受率 Xa = exp(2 * J ./ Ta) ./ Ta; RXa = 1 ./ Xa; // *** グラフのプロット *** // エネルギー subplot(2,2,1); plot(T,E / N,'or'); plot(Ta, Ea, '--g'); xlabel("kT/J"); ylabel("E/NJ"); // 比熱 subplot(2,2,2); plot(T,C,'or'); plot(Ta,Ca,'--g'); xlabel("kT/J"); ylabel("C/Nk"); // 磁化 subplot(2,2,3); plot(T,M/N,'or'); plot(Ta,Ma/N,'--g'); xlabel("kT/J"); ylabel("M/N"); // 磁気感受率の逆数 subplot(2,2,4); plot(T,RX,'or'); plot(Ta,RXa,'--g'); xlabel("kT/J"); ylabel("N/JX");