コンピュータ工学基礎演習 2014 10 常微分方程式を解く・解答例 機能創成専攻 生体工学領域 井村 誠孝 [email protected] 課題ex10-1 [必須] 講義資料: http://bit.ly/bpe-ecp14 次の微分方程式をオイラー法を用いて解き,t=2の ときのyの値y (2)を小数点以下6桁まで求めよ.時 間刻みは ∆t =10−4 とせよ. y′ =− y + 2t exp(−t ) y (0) = 0 解答 y (2) = 0.541350 2014/6/30 Exercises in Computer Programming 2 / 16 講義資料: http://bit.ly/bpe-ecp14 解のグラフ 2014/6/30 Exercises in Computer Programming 3 / 16 講義資料: http://bit.ly/bpe-ecp14 確認: 小さい値の表記 C言語では a × 10b を aeb と表記できます(指数表 記). 例 12.3456 (=1.23456×101) → 1.23456e1 あまり意味はないですが、123456e-4 と書くことも可能. 1.0×10-1 → 1e-1 0が沢山付く場合の表記に適している. 0.00000002 → 2e-8 2014/6/30 Exercises in Computer Programming 4 / 16 課題ex10-2 [発展] 講義資料: http://bit.ly/bpe-ecp14 前問と同じ常微分方程式の初期値問題について引 き続き考える.y (2)の数値解を,時間刻みを変え て求め,時刻の増分 ∆t と,数値解と解析解との誤 差 ∆yとの関係について調査せよ. 解析解は = y t 2 exp(−t ) 2014/6/30 Exercises in Computer Programming 5 / 16 講義資料: http://bit.ly/bpe-ecp14 解のグラフ 2014/6/30 Exercises in Computer Programming 6 / 16 講義資料: http://bit.ly/bpe-ecp14 t=2付近の拡大 2014/6/30 Exercises in Computer Programming 7 / 16 講義資料: http://bit.ly/bpe-ecp14 時間の増分と誤差の関係 誤差大 刻みは小さければ 小さい方がよいとは 限らない. DTを1e-1(10-1)から1e-9(10-9) まで変え,真値との差を調べる. 誤差小 刻み小 2014/6/30 刻み大 Exercises in Computer Programming 8 / 16 講義資料: http://bit.ly/bpe-ecp14 時間刻みを小さくすると誤差が増える DTが非常に小さいことがどこで影響しているか? y += dydt(t, y) * DT; yの大きさ: 1(100)のオーダー dydt(導関数の値)の大きさ: 1(100)のオーダー DT: 10-9のオーダー dydt*DT: 10-9のオーダー(有効数字は十分ある) →doubleの精度は10進数で15桁程度であるから, dydt*DT の 上 6 桁 程 度 し か y に は 加 え ら れ な い . dydt*DTの実質的な有効桁数は6桁(情報落ち). 2014/6/30 Exercises in Computer Programming 9 / 16 課題ex10-3 [必須] 講義資料: http://bit.ly/bpe-ecp14 次の微分方程式をオイラー法とルンゲ・クッタ法 を用いてそれぞれ解き, t=1 のときのyの値y (1)を 求めよ.同じ ∆t のときの,誤差について調べよ. y′ = sin t y (0) = 1 2014/6/30 Exercises in Computer Programming 10 / 16 講義資料: http://bit.ly/bpe-ecp14 解析解を求める 両辺をtで積分して, dy = sin t dt ⇔ y= − cos t + C 初期条件t=0でy=1より, 1 = C −1 ⇔ C = 2 よって 2014/6/30 y= 2 − cos t 2 − cos1 = 1.45969769413186... y (1) = Exercises in Computer Programming 11 / 16 講義資料: http://bit.ly/bpe-ecp14 ルンゲ・クッタ法の実装 オイラー法 y += dydt( t, y ) * DT; ルンゲ・クッタ法 double k1, k2, k3, k4, dy; k1 = dydt(t, y); k2 = dydt(t + DT/2, y + k1*DT/2); k3 = dydt(t + DT/2, y + k2*DT/2); k4 = dydt(t + DT, y + k3*DT ); dy = (k1 + 2*k2 + 2*k3 + k4) / 6; y += dy * DT; 2014/6/30 Exercises in Computer Programming 12 / 16 講義資料: http://bit.ly/bpe-ecp14 誤差の比較 DT オイラー法 ルンゲ・クッタ法 10-1 10-2 10-3 4.25×10-2 4.21×10-3 4.21×10-4 1.60×10-8 1.60×10-12 <10-15 ルンゲ・クッタ法の方が圧倒的に誤差が小さい. オイラー法: 誤差~DT ルンゲ・クッタ法: 誤差~DT4 2014/6/30 Exercises in Computer Programming 13 / 16 課題ex10-4 [発展] 講義資料: http://bit.ly/bpe-ecp14 前問の常微分方程式の数値解について,誤差が同 程度になる場合(つまり時間刻みが異なる)の,計 算回数(導関数の評価回数)について,どちらが有 利か考察せよ. 2014/6/30 Exercises in Computer Programming 14 / 16 講義資料: http://bit.ly/bpe-ecp14 計算回数の評価...の前に 1.0 / DT すなわち繰り返し回数が整数にならない 場合,tにDTを整数回加える限りはt=1.0にはなら ず、y(1)が求められません. 例: DT=0.07 とすると,1.0/DT=14.28... なので14回の繰 り返しが行われる.このとき最終的なtの値は t=0.07×14=0.98となるため,誤差が生じる. 対処法 繰り返し数を1回増やす. 現在のtにDTを加えると1より大きくなる場合には,DTで はなく1-tを加える(刻み幅を最後だけ可変に). 2014/6/30 Exercises in Computer Programming 15 / 16 講義資料: http://bit.ly/bpe-ecp14 計算回数の評価 1.0×10-8程度の誤差になるDTを調べる. オイラー法: DT=2.50×10-8 ルンゲ・クッタ法: DT=8.96×10-2 繰り返し回数は1.0/DT程度 オイラー法: 4.0×107回 ルンゲ・クッタ法: 12回 dydt()が呼び出された回数 オイラー法: 4.0×107回 計算効率: 約83万倍異なる. ルンゲ・クッタ法: 48回 (この事例に限れば) 2014/6/30 Exercises in Computer Programming 16 / 16
© Copyright 2024 ExpyDoc