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
end8.7 コードリーディング確認
以下の関数を読んで、何を計算しようとしているか説明せよ。
function magnetization(spins)
return sum(spins) / length(spins)
end次に以下の行を読め:
spins[mod1(i + 1, L), j]以下の質問に答えよ:
- 最初の関数は物理的に何を返すか?
- エネルギー計算に
mod1が現れるのはなぜか? - グローバルの
spins変数を読むよりもenergy(spins)と書く方が良いのはなぜか?
8.8 追加テスト生成プロンプト
2次元イジングモデルのエネルギーまたは磁化の計算について、
短いコードリーディング問題を3つ作成せよ。
以下に焦点を当てよ:
- 各関数が何を計算しているか
- インデックスの間違い
- グローバル変数に依存するよりも引数として配列を渡す方が良い理由
まだ答えは出すな。
私が答えた後、回答を採点し、フォローアップ質問を1つ出せ。
8.9 スキップ条件
以下がすでにできるなら、このステップはスキップできる:
- このモデルにおける磁化とエネルギーの意味を説明できる
- 簡単な周期境界条件のインデックスを読める
spinsを明示的に渡す方がグローバル変数に依存するより良い理由が分かる