8  Step 2: 物理量の計算

次の仕事は、格子から意味のある物理量を計算することである。

8.1 目的

スピン配置から磁化とエネルギーを計算する小さな関数を書く。

8.2 到達目標

このステップの終わりまでに、以下ができていること:

  • 磁化の関数がある
  • エネルギーの関数がある
  • 周期境界条件の基本的な理解がある

8.3 実行スペル

Julia で行列として格納された 2次元イジング格子がある。
今度は物理量を計算したい。

まず以下を説明せよ:
- 磁化とは何か
- 2次元イジングモデルにおけるエネルギーとは何か
- なぜこれらを格子を引数に取る関数として書くべきか
- 周期境界条件がコード上どのように現れるか

その後、以下を書くのを手伝え:
- 磁化の関数
- エネルギーの関数

実装はシンプルで読みやすくせよ。
一度に1つずつ小さなステップで示せ。

8.4 説明スペル

今やったことを説明せよ。磁化とエネルギーの関数が
それぞれ何を計算しているか、周期境界条件がコード上
どう実現されているか、格子を引数として渡す利点を説明せよ。

8.5 習得する概念

  • 関数の引数
  • データと操作の分離
  • 配列の走査
  • mod1 による周期境界条件
  • 以下のコードにおける J = 1 の慣習

8.6 最小限のバージョン

以下のコードでは J = 1 の慣習を使っているため、相互作用の強さは別の因子として現れない。

function magnetization(spins)
    return sum(spins) / length(spins)
end

function energy(spins)
    L = size(spins, 1)
    e = 0
    for i in 1:L, j in 1:L
        e -= spins[i, j] * spins[mod1(i + 1, L), j]
        e -= spins[i, j] * spins[i, mod1(j + 1, L)]
    end
    return e
end

8.7 コードリーディング確認

以下の関数を読んで、何を計算しようとしているか説明せよ。

function magnetization(spins)
    return sum(spins) / length(spins)
end

次に以下の行を読め:

spins[mod1(i + 1, L), j]

以下の質問に答えよ:

  1. 最初の関数は物理的に何を返すか?
  2. エネルギー計算に mod1 が現れるのはなぜか?
  3. グローバルの spins 変数を読むよりも energy(spins) と書く方が良いのはなぜか?

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

2次元イジングモデルのエネルギーまたは磁化の計算について、
短いコードリーディング問題を3つ作成せよ。

以下に焦点を当てよ:
- 各関数が何を計算しているか
- インデックスの間違い
- グローバル変数に依存するよりも引数として配列を渡す方が良い理由

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

8.9 スキップ条件

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

  • このモデルにおける磁化とエネルギーの意味を説明できる
  • 簡単な周期境界条件のインデックスを読める
  • spins を明示的に渡す方がグローバル変数に依存するより良い理由が分かる