前回はクランク=ニコルソン法を紹介し、計算精度について説明しました。
今回と次回で、2次元の熱伝導の問題を解いてみたいと思います。そして最後には温度が変化する様子をアニメーションにしてみましょう。本日は熱伝導方程式を2次元に拡張し、プログラムでの2次元データの扱いについて説明します。
目次
問題
前回まで1次元の熱伝導の問題を解いてきました。これを2次元に拡張してみます。

今度は2次元の板の熱伝導の問題です。
2次元熱伝導方程式
まずは数式を考えましょう。きちんと導出からやろうとすると、前と同じように微小体積の熱の出入りを考えてやればよいです。方程式としては、1次元の熱伝導方程式の空間項に y 方向の空間微分が追加された式となります。
これが2次元熱伝導方程式です。
離散化
次に(1)式を数値的に解くために離散化を考えます。今度は空間に y 方向が加わったので、この方向にも離散化してみます。
y 方向を Δy の幅で分割して離散化すると図のようになります。

ここで、x 方向の点の添字を i、y 方向の点の添字を j として、位置 (xi,yj) の温度を Ti,j と書くことにします。
時間方向にはこれまでと同じように上付きの添字 n をつけて、Tni,j とします。
完全陰解法
(1)式を解く数値計算法ですが、ここでは完全陰解法を使うことにしましょう。(1)式を完全陰解法で表記すると、
となります。空間の差分をとるときは、微分する方向の点に対して差分をとっていけばよいです。
(2)式を Tn+1i,j について整理すると最終的に次式のようになります。
ここで、cx=αΔt/Δx2、cy=αΔt/Δy2。
あとは(3)式をガウス=ザイデル法で解いていけば解が求まります。
どうでしょうか、2次元への拡張はそれほど難しくはないと思います。これまでの式に機械的に当てはめていけばよいのです。
プログラミング
ここまで出来たらあとはプログラミングしていくだけですが、今回のように2次元のデータはどのように扱えばよいでしょうか。
これまでは一次元のデータを配列 temp[i] を使って表してきました。2次元のデータも配列で表します。この配列は2次元配列と呼ばれます。
2次元配列の要素は temp[i][j] のように表します。Ti,j と全く同じように考えればよいです。2次元配列は次のように箱が並んでいるとイメージしてください。

Pythonでは、要素数が nx個×ny個で、全ての値が 0.0 の2次元配列を作るためには、
temp = np.zeros((nx, ny))
値が100.0 の2次元配列を作るには、
temp = np.full((nx, ny), 100.0)
と書きます。
また、全ての要素に対して処理をしようとすると、
for i in range(nx):
for j in range(ny):
temp_old[i][j] = temp[i][j]
のように、i と j でforループを回します。
さあこれだけの情報があれば、以前作った完全陰解法のプログラムを2次元に拡張できると思います。ぜひチャレンジしてみてください。
まとめ
本日は2次元熱伝導方程式へ拡張を行い、2次元データをプログラムでどう扱えばよいかを説明しました。
さて次回はいよいよ最終回です。2次元平面で熱が伝わっていく様子をアニメーションにする部分を加えてプログラムを完成させます。