数値計算の練習 ニュートン・ラフソン法, ロトカ・ボルテラの方程式 倉橋 貴彦 (1) ニュートン・ラフソン法による 非線形連立方程式の計算 x y 5 0 2 2 2 x y2 1 0 9 方程式をf,gとする。 f x, y x 2 y 2 5 x2 g x, y y 2 1 9 各方程式のテイラー展開を 正解 x 4.5 2.121 y 2 0.707 2 一階微分の項まで示すと・・・ n n n 1 f f n x y f f x y n n g g g n 1 g n x y x y 行列で示すと・・・ f n n 1 n f f x n g g g x n f y x n g y y x、yが解の場合はf,gは零なので・・・ f n n 1 n 0 f x n 0 g g x 上式を整理すると・・・ f n x n g x n f y x n g y y n f x f n y n g y g y 左辺の行列: ここに変化量Δx、Δyは・・・ x x n 1 x n n 1 n y y y ヤコビ行列 よって変化量Δx、Δyは・・・ f n x x n y g x 1 f f n y n g g y n よって、x、yの値の更新式は・・・ x y n 1 x x y y n 具体例で考えると・・・ f x, y x 2 y 2 5 x2 g x, y y 2 1 9 ヤコビ行列は・・・ f n x n g x n f 2xn y n 2 n g x 9 y 2 yn n 2y ヤコビ行列の逆行列は・・・ f x n g x n 1 f 1 y n 4 n n g n n 4 x y x y 9 y n 2 yn 2 n x 9 2 yn n 2x よって、x、yの更新式は・・・ x y n 1 x x y y n f x x n y g x n n 1 f f n y n g g y n n 2 y x 1 2 n y 4 x n y n 4 x n y n 9 x 9 n n 2 n 2 ( x ) ( y ) 5 2y n 2 ( x ) ( y n ) 2 1 2 x n 9 n 例えば、初期値を以下の様に設定して反復計算を行う。 収束判定定数ε=10-6とし、 |dx|<εおよび|dy|<εを満足したら計算を終了する。 x y (0) 1.5 0.5 表:反復計算の履歴 iteration x y dx dy 0 1.5000000 0.5000000 0.7500000 0.2500000 1 2.2500000 0.7500000 -0.1250000 -0.0416667 2 2.1250000 0.7083333 -0.0036765 -0.0012255 3 2.1213235 0.7071078 -0.0000032 -0.0000011 4 2.1213203 0.7071068 正解 x 4.5 2.121 y 2 0.707 2 Fortranによるプログラム例 (newton.f) implicit double precision ( a-h, o-z ) c open(10,file='input.dat') open(11,file='output.dat') c read(20,*) x0 read(20,*) y0 c eps = 0.000001d0 iter = 0 c 222 continue c f0 = x0*x0 + y0*y0 - 5.d0 g0 = (x0*x0/9.d0) + y0*y0 -1.d0 c x0 = x1 y0 = y1 iter = iter + 1 go to 222 c 111 continue c write(11,100) iter, x0, y0, dx, dy c 100 format(i5,4f12.7) c stop end c acoef = 1.d0 / ( 4.d0*x0*y0 - (4.d0/9.d0)*x0*y0 ) c dx = acoef * ?????????? dy = acoef * ?????????? c if ( dabs(dx) .lt. eps .and. dabs(dy) .lt. eps ) then go to 111 else end if c write(11,100) iter, x0, y0, dx, dy c x1 = x0 + dx y1 = y0 + dy Input.dat 1.50 0.50 初期値の設定による解の収束する値の違い Case2 (4,3) Case3 (-3,4) Case1(1.5,0.5) 注:Case1では, 解の近傍を少し 過ぎてから戻って 収束をしている. 全て解である。初期値の設定に x 4.5 2.121 よっては,解の収束位置が異な 2 y 0.707 ることに注意。 2 Case5 (-5,-5) Case4 (3,-2) ロトカ・ボルテラの方程式 (捕食者・非捕食者の関係を表した連立微分方程式) dx x( y ) f x, y dt dy y ( x) g x, y dt X:捕食者 Y:非捕食者 k x1 tf x n , y n txn y n 修正オイラー法(2次のルンゲ・クッタ法) による時間進展式 1 k x1 k x 2 2 1 y n 1 y n k y1 k y 2 2 x n 1 x n k x 2 tf x n 1, y n 1 txn 1 y n 1 t x n tf x n , y n y n tg x n , y n k y1 tg x n , y n ty n ( x n ) k y 2 tg x n 1, y n 1 ty n 1 x n 1 t y n tg x n , y n x n tf x n , y n Start フローチャート例 n=0,Δt ,x0=x|t=0 ,y0=y|t=0 ,T (※T/Δtが整数になるようにΔtを選択する。) imax = T/Δt T:全時間 n:ステップ数 imax:最大ステップ数 n*Δt, x0, y0 k x1 tf x n , y n txn y n n=n+1 n 1 n 1 k x 2 tf x n 1, y n 1 y t x tf x , y y tx kx1, kx2, ky1, ky2の計算 n 1 k x1 k x 2 2 1 y n 1 y n k y1 k y 2 2 n x n 1 x n k y1 tg x n , y n x t y tg x , y x yn+1 ty n 1 n 1 n n Yes No tg x n , y n ty n ( x n ) n*Δt, n k y 2 tg x n 1, y n 1 xn+1, n n=imax end n n tf x n , y n Fortranによるプログラム例 (lotoca.f) implicit double precision (a-h,o-z) c open(10,file='input.dat') open(11,file='output.dat') c c----- computational conditions c read(10,*) x0 read(10,*) y0 read(10,*) delt read(10,*) imax c read(10,*) alpha read(10,*) beta read(10,*) gamma read(10,*) delta c c----- output of initial input value c write(11,*) 0.d0, x0, y0 c do istep = 1,imax c c----- value of right hand side term at n step c call fx & ( f0, alpha, beta, x0, y0 ) c call fy & ( g0, gamma, delta, x0, y0 ) c c----- value update by Euler method c ax1 = x0 + delt * f0 ay1 = y0 + delt * g0 c c----- value of right hand side term at n+1 step c call fx & ( f1, alpha, beta, ax1, ay1 ) c call fy & ( g1, gamma, delta, ax1, ay1 ) c c----c akx1 = delt * f0 akx2 = delt * f1 c aky1 = delt * g0 aky2 = delt * g1 c c----- value update by modified Euler method c x1 = x0 + 0.5d0 * ( akx1 + akx2 ) y1 = y0 + 0.5d0 * ( aky1 + aky2 ) c write(11,*) delt*istep, x1, y1 c c----- step change c x0 = x1 y0 = y1 c end do c stop end c c================================== c subroutine fx & ( f0, alpha, beta, x0, y0 ) c c================================== c implicit double precision (a-h,o-z) c f0 = x0 * ( alpha - beta * y0 ) c return end c c================================== c subroutine fy & ( g0, gamma, delta, x0, y0 ) c c================================== c implicit double precision (a-h,o-z) c g0 = - y0 * ( gamma - delta * x0 ) c return end 計算結果の例 input.dat 計算条件 0.3 0.7 0.2 500 0.2 0.4 0.3 0.3 ←x0 = 0.3 ←y0 = 0.7 ←Δt= 0.2 ←time step = 500 ←α = 0.2 ←β = 0.4 ←γ = 0.3 ←δ = 0.3 x,yの値の時系列変化 レポート 検討課題 (1) ニュートンラフソン法による非線形連立方程式の解を得るプログラムを 作成し,初期値を変えることで,収束する解の値の違いについて検討 をし,結果から分かることについて,式や図,説明を交えて整理せよ。 (※初期値を0,0とすると計算ができない理由についても合わせて検討 し,説明せよ。) (2) ロトカ・ボルテラの方程式を修正オイラー法により解くプログラムを作成 し,係数α,β,γ,δの値および,初期値x0,y0,また時間刻みΔtの値を変 えることで,得られうる解の違いについて,結果から分かることについ て式や図,説明を交えて整理せよ。
© Copyright 2024 ExpyDoc