2階定数係数線形微分方程式をRunge-Kutta法で数値的に解いて解析解と比べた
やったこと
- JuliaでRunge-Kutta法実装した
- 2階定数係数線形微分方程式をRunge-Kutta法で数値的に解いて解析解と比べた
参考にした文献
価格:4,989円 |
微分方程式を解析的に解く
以下のようなについての2階微分方程式を解く.
まずは解析解をサクッと導出すると,次のようになる.
微分方程式を数値的に解く
微分方程式のRunge-Kutta法による解法
微分方程式を数値的に解くには独立変数を離散化し,のように書く. 離散化されたに対するの値をと決める.
次のような1階の微分方程式
の近似解$y_n$はRunge-Kutta法により,次式のように計算できる.
ここで,とする.
m元連立微分方程式におけるRunge-Kutta法
上の節ではひとつの微分方程式についてのRunge-Kutta法について述べたが, m元の連立微分方程式に対してもRunge-Kutta法を使うことができる.
変数を ,
,
とおくと, 次のようなm元の連立微分方程式
の近似解$\mathbf y_n$はRunge-Kutta法により,次式のように計算できる.
ここですごいのは,未知関数が増えてもRunge-Kutta法は同じものがそのまま使えること.すごい.
2階の微分方程式を2元の連立微分方程式に書き直す
2階の微分方程式のままだとRunge-Kutta法が使えないので式変形をする. ちょっとトリッキーな感じがするが,制御工学で状態方程式使うときはよくやる変形だと思う.
上式において,, と置くと,
と書ける.これをについて解くと次式のようになる.
あとは,と連立させて,
とすれば連立微分方程式のできあがり. ここで,
[tex: A = \begin{pmatrix}0 & 1 \\ -3 & -2\end{pmatrix}] [tex: B = \begin{pmatrix} 0 \\ 1 \end{pmatrix}] [tex: C = \begin{pmatrix} 1 & 0 \end{pmatrix} ]
(ここの数式の表示のバグ全然直らないのでLaTeXコマンドから読み取ってほしい)
とおくと,
のように,状態方程式の形で書ける. 状態方程式の一つ目の式は「」の形になっているので,そのままRunge-Kutta法に組み込める.
Juliaプログラム
Runge-Kutta法のJulia 1.0実装は以下の通り.数式がそのままコードになる感じがとても気持ち良い.
using Plots function main() # 時間の定義 t = collect(0:0.005:5) h = t[2] - t[1] # 解析解 y_analytical = exp.(-2 * t) / 3.0 + exp.(-t) .* ((-1.0/3.0) * cos.(√2 * t) .+ (1.0 / (3.0*√2.0)) * sin.(√2 * t)) # 数値解を突っ込む配列 x = zeros(2, size(t, 1)); # 初期条件を入れる x[:, 1] .= 0.0 # 微分方程式の定義 A = [0 1; -3 -2]; B = [0; 1]; C = [1 0]; f(t::Float64, x::Array{Float64, 1}) = A * x + B * exp(-2*t) # Runge-Kutta法を実行する for n in 2:size(t, 1) k1 = h * f(t[n-1], x[:, n-1]) k2 = h * f(t[n-1] + h / 2.0, x[:, n-1] + k1 / 2.0) k3 = h * f(t[n-1] + h / 2.0, x[:, n-1] + k2 / 2.0) k4 = h * f(t[n-1] + h, x[:, n-1] + k3) x[:, n] = x[:, n-1] + (k1 + 2*k2 + 2*k3 + k4) / 6.0 end # 数値解を取り出す y_numerical = C * x y_numerical = reshape(y_numerical, size(y_numerical, 2)); # 2つの解をプロットする plot(t, y_numerical, line=(:steppre, :dash, 0.5, 4, :blue), label="numerical"), plot!(t, y_analytical, line=(:steppre, :dot, 0.5, 4, :red), label="analytical") savefig("runge-kutta.png"); end main()
実行結果は以下の通り.解析解とよく一致している.