7 Step 1: 格子の作成
2次元イジングモデルの最小の状態を構築する。
7.1 2次元イジングモデルとは?
2次元イジングモデルは、正方格子上の磁性の単純なモデルである。
- 各サイトはスピン
s_i = ±1を持つ - 隣接するスピンは揃おうとする
- 温度がその傾向と競合する
エネルギーの標準的な形の一つは
H = -J \sum_{\langle i, j \rangle} s_i s_j
ここで s_i = ±1 で、和は最近接対について取る。
以降、一般的な簡略化の慣習として J = 1 を使う。そのため、後のエネルギーや ΔE のコードには J の明示的な因子は現れない。
低温では揃ったスピンが有利なので、大きな秩序ドメインが現れる傾向がある。高温では熱揺らぎが強くなり、スピンはよりランダムに見える。無限系では、このモデルは臨界温度 T_c で相転移を持つ。この講義では、理論からその結果を導くことはしない。代わりに、小さなシミュレーションを構築し、数値結果が厳密な T_c と明らかに矛盾しないことを後で確認する。
7.2 目的
スピン配置を 2 次元の Julia 配列として表現し、初期化する。
7.3 前提知識
Julia 文法クイックスタートを読んでいれば、配列と関数についてすでに知っているはずである。このステップでは:
- スピン格子を表す 2 次元配列を作成する
- その配列を初期化する関数を書く
クイックスタートをスキップした場合、最低限必要なことは:
- 配列は多くの値をまとめて格納する。2次元配列は行列のようなもの。
- 関数は入力を受け取り、計算を行い、出力を返す。
- Julia は 1-based インデックス(配列は 0 ではなく 1 から始まる)。
7.4 到達目標
このステップの終わりまでに、以下ができていること:
L x Lの格子を作成する関数がある- スピンは
+1と-1で格納されている - 初期化を関数に入れる理由が明確になっている
ヒントコードの保存先について
AI エージェントにコードを生成させると、ising.jl のようなファイルに直接書き込んでくれる。AI がどのファイルにコードを保存したかを意識しておくこと。Step 6 でパッケージ構造に整理するまでは、1つのファイルにまとまっていれば十分である。
7.5 実行スペル
Julia で 2次元イジングモデルの状態を作りたい。
以下のような小さな関数を書くのを手伝え:
- 格子サイズ L を受け取る
- L x L の行列を返す
- スピンを +1 と -1 で格納する
- 初学者が読める簡単な Julia コードにする
コードを出す前に、以下を説明せよ:
- なぜ行列が自然な表現なのか
- なぜ初期化を関数に入れるべきか
- どの要素型が妥当か
その後、一度に1つずつ小さな実装ステップを示せ。
7.6 説明スペル
今やったことを説明せよ。作成された関数が何をするか、
なぜ行列が自然な表現か、選んだ要素型の理由、
初期化を関数にまとめる利点を説明せよ。
7.7 習得する概念
- システム状態としての行列
- ランダム初期化
- 関数ベースの初期化
Int8やIntなどの要素型の選択
7.8 最小限のバージョン
function initialize_spins(L::Int)
return rand(Int8[-1, 1], L, L)
end以下を試すとよい:
spins = initialize_spins(8)
size(spins)
eltype(spins)7.9 コードリーディング確認
以下のコードを読んで、何をしているか説明せよ。
L = 8
spins = rand(Int8[-1, 1], L, L)そして以下の質問に答えよ:
spinsには何が格納されているか?- これを
initialize_spins(L)でラップした方が良い理由は? - グローバルスコープに置いたままだと、コードのどの部分が再利用しにくくなるか?
7.10 追加テスト生成プロンプト
Julia で 2次元イジング格子を初期化することについて、
短いコードリーディング問題を3つ作成せよ。
以下に焦点を当てよ:
- コードが何を格納しているか
- 関数が何を返すか
- ロジックを関数にラップすることがなぜ有用か
まだ答えは出すな。
私が答えた後、回答を採点し、フォローアップ質問を1つ出せ。
7.11 スキップ条件
以下がすでにできるなら、このステップはスキップできる:
L x Lのスピン行列を返す関数を書ける- ここで関数スコープが望ましい理由を説明できる
- 簡単な Julia の配列初期化を助けなしで読める