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 習得する概念

  • システム状態としての行列
  • ランダム初期化
  • 関数ベースの初期化
  • Int8Int などの要素型の選択

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)

そして以下の質問に答えよ:

  1. spins には何が格納されているか?
  2. これを initialize_spins(L) でラップした方が良い理由は?
  3. グローバルスコープに置いたままだと、コードのどの部分が再利用しにくくなるか?

7.10 追加テスト生成プロンプト

Julia で 2次元イジング格子を初期化することについて、
短いコードリーディング問題を3つ作成せよ。

以下に焦点を当てよ:
- コードが何を格納しているか
- 関数が何を返すか
- ロジックを関数にラップすることがなぜ有用か

まだ答えは出すな。
私が答えた後、回答を採点し、フォローアップ質問を1つ出せ。

7.11 スキップ条件

以下がすでにできるなら、このステップはスキップできる:

  • L x L のスピン行列を返す関数を書ける
  • ここで関数スコープが望ましい理由を説明できる
  • 簡単な Julia の配列初期化を助けなしで読める