温度シミュレーション (下部のみ100℃ 周りは0℃の例)

Option Explicit
Option Base 0
Private Const XX = 41
Private Const YY = 41
Private T(YY, XX) ' Tはこのプロシージャ内で共通化している
Sub 境界条件(T)
Dim x As Integer
Dim y As Integer
Erase T
For x = 0 To XX - 1 ' 上面
T(0, x) = 0
Next x
For x = 0 To XX - 1 ' 下面だけ100度
T(YY - 1, x) = 100
Next x
For y = 0 To YY - 1 ' 左面
T(y, 0) = 0
Next y
For y = 0 To YY - 1 ' 右面
T(y, XX - 1) = 0
Next y
End Sub
Sub メイン()
Dim i As Integer
Dim j As Integer
Dim Max誤差 As Double
Dim 旧data As Double
Call 境界条件(T)
Do
Max誤差 = 0
For i = 1 To YY - 2
For j = 1 To XX - 2
旧data = T(i, j) ' 前データを保管
T(i, j) = (T(i + 1, j) + T(i - 1, j) + T(i, j + 1) + T(i, j - 1)) / 4 ' まわりの平均値 2次元なら1/4、3次元なら1/6
' 前データとの差を見て差が一番大きいものをMax誤差とする
If Max誤差 < Abs(T(i, j) - 旧data) Then
Max誤差 = Abs(T(i, j) - 旧data)
End If
Next j
Next i
Loop While Max誤差 > 0.001 ' 差が収束したら終了。
'描画する
For i = 0 To YY
For j = 0 To XX
Cells(i + 5, j + 5) = T(i, j)
Next j
Next i
End Sub
熱拡散方程式(全海洋蒸発後、 1年間 地表面で4000℃が続くとしたモデルの例)
初期値:地中40℃
(温度拡散率は砂の係数を使った : χ=2×10^(-7))

Option Explicit
Option Base 0
Sub 一次元拡散方程式()
Range("E5:P1040000").ClearContents
Const Xmax = 21 ' メートル
Const tmax = 350001 ' 秒
' 砂の係数 2 * 10 ^ (-7)
Const χ = 2 * 10 ^ (-7) * 100 '温度拡散率 100秒を1単位とした
Const 描画圧縮率 = 10000
Dim i As Long, j As Long
Dim T(Xmax, tmax)
Erase T
For j = 0 To (tmax - 1) '地表表面を4000℃
T(0, j) = 4000
Next j
For j = 0 To (tmax - 1) '地中を40℃
For i = 1 To Xmax
T(i, j) = 40
Next i
Next j
For j = 0 To (tmax - 1)
For i = 1 To (Xmax - 1)
'両端は除いて計算
T(i, j + 1) = T(i, j) + χ * (T(i + 1, j) + T(i - 1, j) - 2 * T(i, j))
Next i
Next j
For j = 0 To (tmax - 1)
If Int(j / 描画圧縮率) = j / 描画圧縮率 Then
Cells(j / 描画圧縮率 + 5, 5) = j
For i = 0 To (Xmax - 1)
Cells(j / 描画圧縮率 + 5, i + 6) = T(i, j) ' T(x,t)
Next i
End If
Next j
End Sub