8.3 常微分方程式の数値解法
数値解法では,解析的に積分できないような問題
を扱うことが多い
オイラーってどんな人?
数学者・物理学者であり、天体物理学者。
スイスのバーゼル生まれ
現ロシアのサンクトペテルブルクで死んだ。
1707/4/15-1783/9/18
Leonhard Euler
8.3.1 オイラー法
(1)前進差分によるオイラー法
微分方程式
dy
g (t , y ),
dt
y (0) C1
[例]前進差分近似
y (t t ) y (t )
g (t , y (t )) y (t t ) y (t ) g (t , y (t )) t
t
次のような繰返し計算で近似する
y
(t1 , y1 )
y (0) C1
(t0 , y0 )
y (t ) y (0) g (0, y (0))t
y (2t ) y (t ) g (t , y (t ))t
g (t0 , y0 )t
t
0
t
あるいは,
差分近似が微分の近似であることから
(本来は,t は限りなく0に近い値)
dy
y (t t ) y (t ) y (t t ) y (t )
lim
t
0
dt
t
t
y (0) C1
y (t ) y (0) g (t , y (0))t
y (2t ) y (t ) g (2t , y (t ))t
(例)
dy
(t 1) ydt
dt
Excelでオイラー法(1)
もちろん,この式は次のようにして厳密解を求めることができるが,誤差評価
のためにこの例を求める。
1
1
t2
dy (t 1)dt dy (t 1)dt log y t C
y
y
2
[Excelの定義
例]
tとして現時刻をとる定義
(例)
dy
(t 1) ydt
dt
Excelでオイラー法(2)
グラフを描いてみると
tとして現時刻をとる定義のほうが誤差が少ない
(2)修正オイラー法(修正法1)
データ点における微分係数で増分を計算し,
増分から得られた座標点から更に増分を計算し,
両増分の平均値を最終的な増分とする。
k1 g (t , y )t
y
(t1 , y1 )
k 2 g (t t , y k1 )t
k2
1
y (t t ) y (t ) (k1 k 2 )
2
(t0 , y0 )
0
k1
t
t
Excelによる修正法1
式定義
結果グラフ
(3)修正オイラー法(修正法2)
データ点における微分係数で増分を計算し,
増分の1/2から得られた座標点から増分を計算し,
この増分を最終的な増分とする。
k1 g (t , y )t
y
t
k1
k 2 g (t , y )t
2
2
y (t t ) y (t ) k 2
(t1
t
k
, y1 1 )
2
2
(t0 , y0 )
0
k1
k2
t
t
Excelによる修正法2
式定義
結果グラフ
VBAによる定義
①データ宣言,データ設定および結果設定用シートへのX値設定
Private DX As Double
Private Y0 As Double
Private XST As Double
Private Y(11) As Double
Private N As Integer
Sub データ設定()
N = 11: Y0 = 1: DX = 0.1: XST = 0
End Sub
Sub X値設定()
With Worksheets("Sheet4")
X = XST
For i = 1 To N
.Cells(i + 1, 1) = X: X = X + DX
Next
End With
End Sub
VBAによる定義
②結果設定とボタンのClickイベントハンドラ
Sub 結果設定(ID)
With Worksheets("Sheet4")
For i = 1 To N
.Cells(i + 1, ID) = Y(i)
Next
End With
End Sub
Sub ボタン1_Click()
データ設定
X値設定
オイラー法前進差分 Y, Y0, XST, DX, N
結果設定 2
修正オイラー法1 Y, Y0, XST, DX, N
結果設定 3
修正オイラー法2 Y, Y0, XST, DX, N
結果設定 4
厳密解 Y, Y0, XST, DX, N
結果設定 5
End Sub
VBAによる定義
③関数値,オイラー法,修正法1
Function g(X, Y) As Double
g = (X + 1) * Y
End Function
Sub オイラー法前進差分(Y, Y0, XST, DX, N)
Y(1) = Y0: X = XST
For i = 2 To N
X = X + DX
Y(i) = Y(i - 1) + g(X, Y(i - 1)) * DX
Next
End Sub
Sub 修正オイラー法1(Y, Y0, XST, DX, N)
Y(1) = Y0: X = XST
For i = 2 To N
K1 = DX * g(X, Y(i - 1))
K2 = DX * g(X + DX, Y(i - 1) + K1)
X = X + DX
Y(i) = Y(i - 1) + (K1 + K2) / 2
Next
End Sub
VBAによる定義
④修正法2,厳密解設定
Sub 修正オイラー法2(Y, Y0, XST, DX, N)
Y(1) = Y0: X = XST
For i = 2 To N
K1 = DX * g(X, Y(i - 1))
K2 = DX * g(X + DX / 2, Y(i - 1) + K1 / 2)
Y(i) = Y(i - 1) + K2
X = X + DX
Next
End Sub
Sub 厳密解(Y, Y0, XST, DX, N)
X = XST
For i = 1 To N
Y(i) = Exp(X * X / 2 + X)
X = X + DX
Next
End Sub
VBAによる定義による結果
結果(Excelによる結果より誤差が少ない)
(4)修正オイラー法(一般化)
以下の係数に適当な値を代入する。修正法1,2はその代表的な例。
k1 g (t , y)t
k2 g (t t , y k1 )t
y(t t ) y(t ) (c1k2 c2 k2 )
[注]以下,式の展開による導出を示すが,
式の展開自体を覚える必要はない。
どのような流れで導出されているかを理解し,
最終的な結果を確認すること。
式の展開自体が必要なときは,資料を参照すれば良い。
確認
k2 をテーラ展開すると
k 2 g (t t , y k1 )t g (t , y ) t
dg
dg
k1
O(t 2 , y 2 )
dt
dy
dg
dg
g (t , y ) t
g (t , y )t
O(t 2 , y 2 )
dt
dy
第3式に代入すると
y (t t ) y (t ) (c1k 2 c2 k 2 )
dg
dg
y (t ) c1t g (t , y ) c2 t g (t , y ) t
g (t , y )t
O(t 2 )
dt
dy
dg
dg
y (t ) (c1 c2 )t g (t , y ) c2 t 2
g (t , y )c2 t 2
O(t 3 )
dt
dy
テーラ展開の式と比較すると
1
1
(c1 c2 ) 1, c2 , c2
2
2
1
修正法1 c1 c2 , 1
2
修正法2 c1 0, c2 1,
1
2
8.3.2 ルンゲ・クッタ法(Runge-Kutta method)
(1)2次のルンゲ・クッタ法(その1)
k1 g (t j , x j ), k2 g (t j b1h, x j b2hk1 ), x j 1 x j h(a1k1 a2k2 ) とおくと
k 2 g (t j b1h, x j b2 hk1 ) g (t j , x j ) b1h
g (t j , x j ) b1h
g (t j , x j )
t
b2 hg(t j , x j )
g (t j , x j )
t
g (t j , x j )
b2 hk1
g (t j , x j )
x
O(h 2 )
O(h 2 )
x
g (t j , x j )
g (t j , x j )
2
x j 1 x j ha1 g (t j , x j ) a2 g (t j , x j ) b1h
b2 hg(t j , x j )
O(h )
t
x
g (t j , x j )
g (t j , x j )
3
x j h(a1 a2 ) g (t j , x j ) h a2b1
a2b2 g (t j , x j )
O(h )
t
x
2
(1)2次のルンゲ・クッタ法(その2)
d 2 x dg(t , x) g (t , x) g (t , x)
定義から 2
g (t , x) であるからテーラ展開すると
dt
dt
t
x
h2
x j 1 x j hg(t j , x j )
2
g (t j , x j ) g (t j , x j )
3
g
(
t
,
x
)
O
(
h
)
j
j
x
t
係数を比較して
a1 a2 1, a2b1
1
1
, a2b2
2
2
1
, b1 b2 1 を選択して
2
k1 g (t j , x j )
これらを満足する値として a1 a2
k2 g (t j h, x j hk1 )
x j 1 x j
h
k1 k2
2
この式はホイン(Heun)の2次公式とも呼ばれる。
y j 1 y j hg(t j , y j ) において
(2)3次のルンゲ・クッタ法
k1 g (t j , y j ), k2 g (t j b1h, y j b2 hk1 ), k3 g (t j c1h, y j c2 hk1 c3hk2 )
y j 1 y j h(a1k1 a2 k2 a3k3 )
とおくと,2次の場合と同様,係数比較によって a1 , a2 , a3 , b1 , b2 , c1 , c2 , c3
を決めることができる。
k1 g (t j , x j )
h
h
k 2 g (t j , x j k1 )
2
2
k3 g (t j h, x j hk1 2hk2 )
x j 1 x j
h
k1 4k2 k3
6
この式はクッタ(Kutta)の公式と呼ばれる。
(3)4次のルンゲ・クッタ法
y j 1 y j hg(t j , y j ) において
k1 g (t j , y j ), k 2 g (t j b1h, y j b2 hk1 ),
k3 g (t j c1h, y j c2 hk2 ), k 4 g (t j d1h, y j d 2 hk2 ),
y j 1 y j h(a1k1 a2 k 2 a3k3 a4 k 4 )
とおくと,2次の場合と同様,係数比較によって a1 , a2 , a3 , b1 , b2 , c1 , c2 , d1 , d2
を決めることができる。
k1 g (t j , x j )
h
h
k 2 g (t j , x j k1 )
2
2
h
h
k3 g (t j , x j k 2 )
2
2
k 4 g (t j h, x j hk3 )
x j 1 x j
h
k1 2k2 2k3 k4
6
この式はルンゲ・クッタの式と呼ばれる。
(4)ルンゲ・クッタ・ギルの公式
(Runge-Kutta-Gill method)
4次のルンゲ・クッタ型の公式の一つとして,次の公式がある。
k1 g t j , x j
h
h
k 2 g t j , x j k1
2
2
h
1
1 1
k3 g t j , x j
hk
1
1
hk2
2
2
2
2
1
1
k 4 g t j h, x j
hk2 1
hk3
2
2
h
1
1
x j 1 x j k1 21
k
2
1
k
k
2
3 4
6
2
2
ルンゲとクッタ
• カール・ルンゲ(Runge,Carl David Tolme) ドイツ
の数学者で物理学者。 1856/08/30-1927/01/03
• ウイルヘルム・クッタ(Wilhelm Kutta)ドイツの数
学者でかつ物理学者。1867~1944。渦による揚
力の発生クッタ-ジェコフスキーの揚力理論で有
名。
VBAによる定義
①データ宣言,データ設定および結果設定用シートへのX値設定
Private DX As Double
Private Y0 As Double
Private XST As Double
Private Y(11) As Double
Private N As Integer
Sub データ設定()
N = 11: Y0 = 1: DX = 0.1: XST = 0
End Sub
Sub X値設定()
With Worksheets("Sheet4")
X = XST
For i = 1 To N
.Cells(i + 1, 1) = X: X = X + DX
Next
End With
End Sub
VBAによる定義
②結果設定とボタンのClickイベントハンドラ
Sub 結果設定(ID)
With Worksheets("Sheet4")
For i = 1 To N
.Cells(i + 1, ID) = Y(i)
Next
End With
End Sub
Sub ボタン1_Click()
データ設定
X値設定
ルンゲクッタ Y, Y0, XST, DX, N
結果設定 2
ルンゲクッタギル Y, Y0, XST, DX, N
結果設定 3
厳密解 Y, Y0, XST, DX, N
結果設定 4
End Sub
VBAによる定義
③関数値,4次のルンゲ・クッタ法
Function g(X, Y) As Double
g = (X + 1) * Y
End Function
Sub ルンゲクッタ(Y, Y0, XST, DX, N)
Y(1) = Y0: X = XST
For i = 2 To N
k1 = g(X, Y(i - 1))
k2 = g(X + DX / 2, Y(i - 1) + DX * k1 / 2)
k3 = g(X + DX / 2, Y(i - 1) + DX * k2 / 2)
k4 = g(X + DX, Y(i - 1) + DX * k3)
Y(i) = Y(i - 1) + (k1 + 2 * k2 + 2 * k3 + k4) * DX / 6
X = X + DX
Next
End Sub
VBAによる定義
④ルンゲ・クッタ・ギル法
Sub ルンゲクッタギル(Y, Y0, XST, DX, N)
Y(1) = Y0: X = XST
A1 = -(1 / 2 - 1 / Sqr(2))
A2 = (1 - 1 / Sqr(2))
B1 = -1 / Sqr(2)
B2 = 1 + 1 / Sqr(2)
C1 = 2 * (1 - 1 / Sqr(2))
C2 = 2 * (1 + 1 / Sqr(2))
For i = 2 To N
k1 = g(X, Y(i - 1))
k2 = g(X + DX / 2, Y(i - 1) + DX * k1 / 2)
k3 = g(X + DX / 2, Y(i - 1) + A1 * DX * k1 + A2 * DX * k2)
k4 = g(X + DX, Y(i - 1) + B1 * DX * k2 + B2 * DX * k3)
Y(i) = Y(i - 1) + (k1 + C1 * k2 + C2 * k3 + k4) * DX / 6
X = X + DX
Next
End Sub
VBAによる定義
⑤厳密解の設定
Sub 厳密解(Y, Y0, XST, DX, N)
X = XST
For i = 1 To N
Y(i) = Exp(X * X / 2 + X)
X = X + DX
Next
End Sub
VBAによる定義
④修正法2,厳密解設定
Sub 修正オイラー法2(Y, Y0, XST, DX, N)
Y(1) = Y0: X = XST
For i = 2 To N
K1 = DX * g(X, Y(i - 1))
K2 = DX * g(X + DX / 2, Y(i - 1) + K1 / 2)
Y(i) = Y(i - 1) + K2
X = X + DX
Next
End Sub
Sub 厳密解(Y, Y0, XST, DX, N)
X = XST
For i = 1 To N
Y(i) = Exp(X * X / 2 + X)
X = X + DX
Next
End Sub
ルンゲクッタ法による結果
非常に良い結果が得られていることに注意
8.3.3 連立微分方程式
(1)手順
次の連立1次微分方程式を考える。
dx
f (t , x )
dt
x1
f1 (t , x1 , , xn )
x
f (t , x , , x )
1
n
x 2 , f 2
x
f
(
t
,
x
,
,
x
)
1
n
n
n
①増分ベクトル k1 を求める。
k1 f (t , x )
k11 f1 (t , x1 , , xn )
k f (t , x , , x )
1
n
12 2
k
f
(
t
,
x
,
,
x
)
1
n
1n n
②増分 k2 ~ k4 を求める。
h
hk
k 2 f (t , x 1 )
2
2
h
hk
k3 f (t , x 2 )
2
2
k 4 f (t h, x hk3 )
③ x(t h) を求める。
x (t h) x (t )
h
k1 2k2 2k3 k4
6
(2)プログラム例
次の連立1次微分方程式を解くプログラムを例とする。
dy1
dy2
x y2 ,
x
dx
dx
y1 (0) 0,
y2 (0) 0
①データ宣言,データ設定および結果設定用シートへのX値設定
Private DX As Double
Private Y0() As Double
Private XST As Double
Private Y(11, 2) As Double
Private N As Integer
Private M As Integer
Sub データ設定()
N = 11: DX = 0.1: XST = 0
M = 2: ReDim Y0(M)
For k = 1 To M
Y0(k) = 0
Next
End Sub
Sub X値設定()
With Worksheets("Sheet2")
X = XST
For i = 1 To N
.Cells(i + 1, 1) = X: X = X + DX
Next
End With
End Sub
②結果設定およびボタンのClickイベントハンドラ
Sub 結果設定()
With Worksheets("Sheet2")
For i = 1 To N
For k = 1 To M
.Cells(i + 1, k + 1) = Y(i, k)
Next
Next
End With
End Sub
Sub Sheet2_ボタン1_Click()
データ設定
X値設定
連立ルンゲクッタ Y, Y0, XST, DX, N, M
結果設定
End Sub
③関数設定および処理本体(その1)
Function g(ID, X, Y) As Double
If ID = 1 Then
g = X + Y(2)
Else
g = X
End If
End Function
Sub 連立ルンゲクッタ(Y, Y0, XST, DX, N, M)
Dim K1() As Double: ReDim K1(M)
Dim K2() As Double: ReDim K2(M)
Dim K3() As Double: ReDim K3(M)
Dim K4() As Double: ReDim K4(M)
Dim YY() As Double: ReDim YY(M)
For k = 1 To M
Y(1, k) = Y0(k)
Next
⑤処理本体(その3)
X = XST
For i = 2
For k =
YY(k)
Next
For k =
K1(k)
Next
For k =
YY(k)
Next
For k =
K2(k)
Next
For k =
YY(k)
Next
For k =
K3(k)
Next
To N
1 To M
= Y(i - 1, k)
1 To M
= g(k, X, YY)
1 To M
= Y(i - 1, k) + DX * K1(k) / 2
1 To M
= g(k, X + DX / 2, YY)
1 To M
= Y(i - 1, k) + DX * K2(k) / 2
1 To M
= g(k, X + DX / 2, YY)
⑤処理本体(その4)
For k = 1
YY(k) =
Next
For k = 1
K4(k) =
Next
For k = 1
Y(i, k)
Next
X = X + DX
Next
End Sub
To M
Y(i - 1, k) + DX * K3(k)
To M
g(k, X + DX, YY)
To M
= Y(i - 1, k) + _
(K1(k) + 2 * K2(k) + 2 * K3(k) + K4(k)) * DX / 6
8.3.4 高階の常微分方程式
(1)考え方
次の微分方程式を考える。
d nx
d n 1 x
dx
a0 n a1 n1 an 1 an x 0
dt
dt
dt
各次数の時間微分を別々の変数と考えると
dxn 1
dx1
dx2
x2 ,
x3 , ,
xn ,
dt
dt
dt
dxn
1
a1 xn a2 xn 1 an x1
dt
a0
x x1 ,
という連立1次微分方程式の形式であるため,
ルンゲ・クッタ法を適用することができる。
[例題]
2
d x
m 2 kx
dt
解析的に解けるが,
厳密解が分かっているので,
誤差検証のために
あえてこの例題を取り上げる。
(連立ルンゲ・クッタ法の変更部分)
(下記,赤線部分の変更)
Private DX As Double
Private Y0() As Double
Private XST As Double
Private Y(60, 2) As Double
Private N As Integer
Private M As Integer
Sub データ設定()
N = 60: DX = 0.1: XST = 0
M = 2: ReDim Y0(M)
Y0(1) = 0
Y0(2) = 4
End Sub
・
・(中略)
・
Function g(ID, X, Y) As
Double
If ID = 1 Then
g = Y(2)
Else
g = -Y(1)
End If
End Function
・
・(後略)
・
実行結果
誤差が少ないことを確認する。
(2)ルンゲ・クッタ法を使わない高次微分方程式
(オイラー法による例題)
d 2x
m 2 kx
dt
k / m , t s
ここで,s = nhとなる有限の刻み幅hを導入し
,
次のような数式モデルを設定
2
とおくと
d 2x
x
2
ds
とすることができるので,
dx
v,
ds
と変形しておく。
dv
x
ds
xn 1 xn
vn xn 1 xn hvn
(n 1)h nh
vn 1 vn
xn vn 1 vn hxn
(n 1)h nh
処理の手順
①
②
③
④
⑤
DT = 刻み幅
V0 = 初速度,X0 = 0,T = 0とする.
T時刻の速度,位置をV0,X0とする.
T = T + DTとする.
T ≦ 最終時刻の間,以下を繰り返す.
・X = X0 + V0 × DT
・V = V0 - X0 × DT
・T時刻の速度,位置をV,Xとする.
・X0 = X,V0=V
・T = T + DT
単純な方法による式定義
(厳密解との比較を含む)
単純な方法による結果
(誤差が蓄積している)
この理由(エネルギー保存則)
1
1 2
2
mV kx =一定,
2
2
V
dx dx ds dx
dx k
k
w
v
dt ds dt ds
ds m
m
したがって
2
1
k 1 2 1 2 k 1 2 k 2
kx m v kx v x 2
m v
2
m 2
2
m 2
2
v2 x2
=一定
=一定
一方,数式モデルから
xn21 vn21 xn hvn vn hxn 1 h2 xn2 vn2
2
2
刻み幅が0であれば一定となるが,今刻み幅は有限の値にしているので
保存則が成立していない。
式の改良
現在時刻における速度と位置の値は,お互いに現在時刻における値と前
時刻との平均値を使用して計算するものとする。
1
vn 1 vn xn 1 xn h
2
1
xn 1 xn vn 1 vn h
2
現在時刻における値がお互いに入っているので,計算上はループしてし
まうので,お互いに代入して整理すると,
1
2
xn 1
(
4
h
) xn 4vn h
2
4h
vn 1
1
2
(
4
h
) vn 4 xn h
2
4h
両式を二乗して加えると
確認(エネルギー保存則が満足されている)
xn21 vn21
2
1
1
2
2
(
4
h
)
x
4
v
h
(
4
h
) vn 4 xn h
n
n
2 2
2 2
(4 h )
(4 h )
2
(4 h 2 ) 2 xn2 16vn2 h 2 8(4 h 2 ) xn vn h (4 h 2 ) 2 vn2 16xn2 h 2 8(4 h 2 ) xn vn h
(4 h 2 ) 2
(16h 2 (4 h 2 ) 2 ) xn2 (16h 2 (4 h 2 ) 2 ) vn2 (4 h 2 ) 2 xn2 (4 h 2 ) 2 vn2
2 2
(4 h )
(4 h 2 ) 2
(4 h 2 ) 2 xn2 vn2
2
2
x
v
n
n
(4 h 2 ) 2
考慮した結果
(3)かえる飛び法
次のようにお互いに相手の中間値を使用する方法
xn1 xn vn1/ 2 h
vn1/ 2 vn1/ 2 xn h
論理的には,中心差分であることに注意しよう。
かえるとび法(元の式は変わらないが誤差が少ない)
(4)テーラ展開による方法
まず,微分方程式から高次の微分を求め,
テーラ展開の式に代入する。
[例]
y (n)
dy
x2 y
dx
d n y とすると
n
dx
y (1) x 2 y,
y ( 2) 2x y (1) ,
y (3) 2 y ( 2) ,
y ( 4) y (3)
これを次のようなテーラ展開の式に代入する。
2
3
4
x
x
x
y ( x x) y( x) x y (1) ( x)
y ( 2 ) ( x)
y ( 3) ( x )
y ( 4 ) ( x)
2!
3!
4!
式の変形
次のように近似できる。
yn(1) xn2 yn , yn( 2) 2 xn yn(1) , yn(3) 2 yn( 2) , yn( 4) yn(3)
xn1 xn x
2
3
4
x
x
x
yn1 yn x yn(1)
yn( 2)
yn(3)
yn( 4)
2!
3!
4!
更に次のように変形できる。
y (1) x 2 y,
y ( 2) 2 x y (1) 2 x x 2 y,
y ( 3) 2 y ( 2 ) 2 2 x x 2 y ,
y ( 4 ) y ( 3) 2 2 x x 2 y
式の整理
すなわち,y
( 5)
y
( 4)
y
( 3)
( n)
(3)
y
y
。同様にして
x 3 x 4 x 5
x 2 ( 2)
( 3)
y ( x x) y ( x) x y ( x)
y ( x) y ( x)
2!
4!
5!
3!
(1)
2
x
y ( x) x y (1) ( x)
y ( 2 ) ( x)
2!
x 2 x 3 x 4 x 5 (3)
x 2
( 3)
y ( x)1 x
y ( x)1 x
2!
3!
4!
5!
2!
2
x
y ( x) x y (1) ( x)
y ( 2 ) ( x)
2!
x 2 x 3 x 4 x 5 (3)
x 2
( 3)
y ( x)1 x
y ( x)1 x
2!
3!
4!
5!
2!
単純化
一方,定義から
x 2 x 3 x 4 x 5
e 1 x
2!
3!
4!
5!
x
2
2
x
x
(1)
( 2)
( 3)
x
y( x x) y( x) x y ( x)
y ( x) y ( x)e 1 x
2!
2
!
最終的な数式モデル
yn(1) xn2 yn , yn( 2) 2 xn yn(1) , yn(3) 2 yn( 2)
xn 1 xn x,
x 2 ( 2)
x 2
( 3) x
yn 1 yn x y
yn yn e 1 x
2!
2!
(1)
n
テーラ展開による方法
テーラ展開による方法(結果)
[例題2]
d 2x
x
2
dt
x ( 2) x, x (3) 1, x ( 4) x (5) x ( n ) 0
h ( 3)
(1)
(1)
( 2)
x (t h) x (t ) hx (t ) x (t )
2
[結果]
© Copyright 2026 ExpyDoc