アップデート 2003.9.12

熱方程式のマクロ


Sub parabolic()
Range("d1:z200").Clear '領域消去
coeff = Range("coeff") '熱伝導率
Length = Range("length") '空間軸の長さ
step_x = Range("step_x") '空間軸の分割間隔
step_t = Range("step_t") '時間軸の分割間隔
u_l_value = Range("u_l_value") 'x=0での境界条件
u_r_value = Range("u_r_value") 'x=Lでの境界条件
time_emd = Range("time_end") '終了時刻
n = Length / step_x '空間軸の分割数
cf = coeff / step_x
r = step_t * cf * cf '0.5以下でないと収束しない
t = Int(time_emd / step_t)'最終時刻の番号
Cells(10, 2) = r 'rを表示する
Cells(11, 2) = n '空間分割数を表示する
Cells(12, 2) = t '時間分割数を表示する
Cells(13, 2) = n * t '表示セル数を表示する
[e1].Select '表示するセルの最初の位置
ActiveCell.Offset(1, -1) = 0 '時刻0の表示
For i = 0 To n
x = i * step_x '空間位置
ActiveCell.Offset(0, i) = x '空間位置の表示
ActiveCell.Offset(1, i) = f(x) '初期値の計算と表示
Next i
For j = 1 To t'時間番号
jp = j + 1'計算すべき時間番号
ActiveCell.Offset(jp, -1) = j * step_t '時刻の表示
ActiveCell.Offset(jp, 0) = u_l_value 'x=0での境界条件
ActiveCell.Offset(jp, n) = u_r_value 'x=Lでの境界条件
For i = 1 To n - 1
um = ActiveCell.Offset(j, i - 1)'空間左隣の関数値
u = ActiveCell.Offset(j, i)'現在の関数値
up = ActiveCell.Offset(j, i + 1) '空間右隣の関数値
ActiveCell.Offset(jp, i) = sabunn(um, u, up, r)
Next i
Next j
End Sub
Function sabunn(um, u, up, r)
sabunn = u + r * (um - 2 * u + up)
End Function
Function f(x) '初期温度分布関数
f = x * x * (2 - x)
End Function