「Excel / OpenOffice で学ぶフーリエ変換入門」では本章で解説する微分方程式の数値的解法を用いたマクロを ソースを閲覧可能な形で収録しております。 |
f2(x1, x2, t) = -4 x1 + 2 cos(2t) という式を実現するため、 前ページの Excel のみの手法では -4*B2+2*cos(2*A2) と記述したのに対し、今回の VBA では、 -4*x1+2*cos(2*t) と記述できる。 |
!Excel 2007 に関する注意! このように本ページのプログラムを実行するとExcel シートにデータが表示され、 それをグラフに表示することができる。 多くの場合このまま作業を続けて良いのだが、 Excel 2007 を使う場合はグラフを表示したままプログラムを再実行すると 処理に非常に長い時間がかかり、パソコンがフリーズしてしまうこともある。 そのため、Excel 2007 を使う場合、グラフを一度表示して確認したら キーボードの Delete キーでグラフを削除してしまうのが無難である。 もし誤ってグラフを表示したままプログラムを実行してしまったら、 キーボードの Esc キーか、Ctrl+Pause キーで急いで退避しよう。 いちいちグラフを消去するのが面倒だという場合 (もっともな意見)、 While ~ Wend の前後に以下のように命令を付加すれば良い。
これにより、シートへのアクセス中はシートとグラフの更新が行われず、 シートへのアクセスが完了してからシートとグラフの更新が行われるようになるため、 Excel 2007 でいちいちグラフを削除しなくても処理が正しく終了する。 |
|
Sub RK_4(x1 As Double, x2 As Double, t As Double, dt As Double) Dim k11 As Double, k12 As Double Dim k21 As Double, k22 As Double Dim k31 As Double, k32 As Double Dim k41 As Double, k42 As Double k11 = dt * func1(x1, x2, t) k12 = dt * func2(x1, x2, t) k21 = dt * func1(x1 + k11 / 2, x2 + k12 / 2, t + dt / 2) k22 = dt * func2(x1 + k11 / 2, x2 + k12 / 2, t + dt / 2) k31 = dt * func1(x1 + k21 / 2, x2 + k22 / 2, t + dt / 2) k32 = dt * func2(x1 + k21 / 2, x2 + k22 / 2, t + dt / 2) k41 = dt * func1(x1 + k31, x2 + k32, t + dt) k42 = dt * func2(x1 + k31, x2 + k32, t + dt) x1 = x1 + (k11 / 6 + k21 / 3 + k31 / 3 + k41 / 6) x2 = x2 + (k12 / 6 + k22 / 3 + k32 / 3 + k42 / 6) End Sub Function func1(x1 As Double, x2 As Double, t As Double) func1 = x2 End Function Function func2(x1 As Double, x2 As Double, t As Double) func2 = -4 * x1 + 2 * Cos(2 * t) End Function |