計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美...

15
計算機実験1 自然情報学講座 瀬戸 繭美 [email protected] H23 奈良女 計算機実験1 2(2011/11/25修正版) H23 奈良女 計算機実験1 2前回まで t i t i+1 x i x i+1 f(t i , x i ) x t 誤差 Euler法による常微分方程式の数値解法 問題点 精度の低い近似 ( 時間の刻み幅を小さくす ることにより改善するが 計算量が大きくなる) h 解析解 数値解

Transcript of 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美...

Page 1: 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美 seto@ics.nara-wu.ac.jp H23 奈良女 計算機実験1 第2回 (2011/11/25修正版)

計算機実験1

自然情報学講座 瀬戸 繭美[email protected]

H23 奈良女 計算機実験1 第2回(2011/11/25修正版)

H23 奈良女 計算機実験1 第2回

前回まで

ti ti+1

xi

xi+1

f(ti, xi)

x

t

誤差

Euler法による常微分方程式の数値解法

問題点

精度の低い近似( 時間の刻み幅を小さくすることにより改善するが計算量が大きくなる)

h

解析解

数値解

Page 2: 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美 seto@ics.nara-wu.ac.jp H23 奈良女 計算機実験1 第2回 (2011/11/25修正版)

H23 奈良女 計算機実験1 第2回修正Euler法

ti ti+1

xi

xi+1

x

t

誤差

区間の中点に相当する曲線の勾配を用いるEuler法

ti + h/2

h

f

�t

i

+ t

i+1

2,

x

i

+ x

i+1

2

k1 = h f (ti

, x

i

)

x

i+1 = x

i

+ h f

�t

i

+ h

2, x

i

+ k1

2

�xi+1

H23 奈良女 計算機実験1 第2回

オイラー法との精度の比較

x(t)をt = ti の周りでテイラー展開すると

x(ti+1) = x(t

i

+h) = x(ti

)+hx

�(ti

)+h

2

2x

��(ti

)+ · · ·オイラー法修正オイラー法

修正オイラー法はTaylor級数のO(h2)までの項と一致 (精度は2次)

Page 3: 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美 seto@ics.nara-wu.ac.jp H23 奈良女 計算機実験1 第2回 (2011/11/25修正版)

H23 奈良女 計算機実験1 第2回

Runge-Kutta (ルンゲ・クッタ) 法Euler法より精度の高い近似を得る解法

Taylor級数のO(h4)までの項と一致(精度は4次)

4次のルンゲ・クッタ法k1 = f (t

i

, x

i

)

k2 = f

�t

i

+ h

2, x

i

+ k1

2

k3 = f

�t

i

+ h

2, x

i

+ k2

2

k4 = f (ti

+ h, x

i

+ k3)

x

i+1 = x

i

+ h

�k1

6+ k2

3+ k3

3+ k4

6

H23 奈良女 計算機実験1 第2回

ti ti+1

xi

xi+1

x

tti + h/2

h

4次のルンゲ・クッタ法k1 = f (t

i

, x

i

)

k2 = f

�t

i

+ h

2, x

i

+ k1

2

k3 = f

�t

i

+ h

2, x

i

+ k2

2

k4 = f (ti

+ h, x

i

+ k3)

x

i+1 = x

i

+ h

�k1

6+ k2

3+ k3

3+ k4

6

12

3

41

2

34

Runge-Kutta (ルンゲ・クッタ) 法

Page 4: 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美 seto@ics.nara-wu.ac.jp H23 奈良女 計算機実験1 第2回 (2011/11/25修正版)

H23 奈良女 計算機実験1 第2回

ti ti+1

xi

xi+1

x

tti + h/2

h

4次のルンゲ・クッタ法

12

12

34

Runge-Kutta (ルンゲ・クッタ) 法

k1 = f (ti

, x

i

)

k2 = f

�t

i

+ h

2, x

i

+ k1

2

k3 = f

�t

i

+ h

2, x

i

+ k2

2

k4 = f (ti

+ h, x

i

+ k3)

x

i+1 = x

i

+ h

�k1

6+ k2

3+ k3

3+ k4

6

H23 奈良女 計算機実験1 第2回

ti ti+1

xi

xi+1

x

tti + h/2

h

4次のルンゲ・クッタ法

12

3

12

34

Runge-Kutta (ルンゲ・クッタ) 法

k1 = f (ti

, x

i

)

k2 = f

�t

i

+ h

2, x

i

+ k1

2

k3 = f

�t

i

+ h

2, x

i

+ k2

2

k4 = f (ti

+ h, x

i

+ k3)

x

i+1 = x

i

+ h

�k1

6+ k2

3+ k3

3+ k4

6

Page 5: 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美 seto@ics.nara-wu.ac.jp H23 奈良女 計算機実験1 第2回 (2011/11/25修正版)

H23 奈良女 計算機実験1 第2回

ti ti+1

xi

xi+1

x

tti + h/2

h

4次のルンゲ・クッタ法

12

3

41

2

34

Runge-Kutta (ルンゲ・クッタ) 法

k1 = f (ti

, x

i

)

k2 = f

�t

i

+ h

2, x

i

+ k1

2

k3 = f

�t

i

+ h

2, x

i

+ k2

2

k4 = f (ti

+ h, x

i

+ k3)

x

i+1 = x

i

+ h

�k1

6+ k2

3+ k3

3+ k4

6

H23 奈良女 計算機実験1 第2回

プログラム例 (ルンゲ・クッタ法, 1変数)#define'DT'0.01'''''''/*'時間刻み幅'*/

#define'STEP_MAX'1000'/*'実時間'DT*STEP_MAX'='10.0'まで'*/

double'fn(double,'double);'/*'導関数'*/

void'runge_kutta(double,'double,'double*,'double);'/*'ルンゲ・クッタ法'*/

main(){''long'step;''double't,'x,'x_next;

''x=0.1;'''/*'初期値設定'*/

''for(i=0;'i<STEP_MAX;'i++){''''t'='i*DT;''''euler(t,'x,'&x_next,'DT);''''x'='x_next;''}}

void'runge_kutta(double't,'double'x,'double'*x_out,'double'h){...

}

double'fn(double't,'double'x){...

}

dx

dt

= f (t,x)

t = 0 より t = DT*STEP_MAXまでを計算

Page 6: 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美 seto@ics.nara-wu.ac.jp H23 奈良女 計算機実験1 第2回 (2011/11/25修正版)

H23 奈良女 計算機実験1 第2回

プログラム例 (ルンゲ・クッタ法, 1変数)

void'runge_kutta(double't,'double'x,'double'*x_out,'double'h){

}

関数runge_kutta

ti, x(ti), h の引数を与えると ti+1 = ti + h 時の x(ti+1) を引数を介して関数呼び出し元に返す

ti x(ti) x(ti+1)のアドレス h

k1 = f (ti

, x

i

)

k2 = f

�t

i

+ h

2, x

i

+ k1

2

k3 = f

�t

i

+ h

2, x

i

+ k2

2

k4 = f (ti

+ h, x

i

+ k3)

x

i+1 = x

i

+ h

�k1

6+ k2

3+ k3

3+ k4

6

H22 奈良女 計算機実験1 第1回

1. 初期値問題(x(0) = 1)を刻み幅 h = 0.1 及び h = 0.05 のルンゲ・クッタ法 で解き、解析解(自分で求める)と比較し、下記の形式で出力し、 刻み幅 h を半分にすると解の精度はどの程度改善するか述べよ。

2. 解析解と数値解をMathematicaを用いて同一グラフで視覚化せよ。解析解 誤差数値解

レポート課題3下記(1)式、(2)式の常微分方程式について下記の課題に取り組め

(1)

(2)解析解 誤差数値解

dx

dt

= �x sin (t) 0 ⇥ t ⇥ 50

dx

dt

= x 0 � t � 1

Page 7: 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美 seto@ics.nara-wu.ac.jp H23 奈良女 計算機実験1 第2回 (2011/11/25修正版)

H23 奈良女 計算機実験1 第2回

レポート課題4下記(1)-(3)式の常微分方程式について初期値問題を刻み幅 h = 0.05 のルンゲ・クッタ法で解き、解析解と数値解をMathematicaを用いてグラフとして視覚化せよ。

(1)

(2)

(3)

t

dx

dt

= x +�

t

2 + x

2, x(0) = 1

dx

dt

= t

�1 � x

2�

, x(0) = 0.05

dx

dt

= � x

1 + t

+ cos t, x(0) = 1

x(0) = 0 0 ≤ t ≤ 5

1 ≤ t ≤ 10

0 ≤ t ≤ 100

1

H23 奈良女 計算機実験1 第2回

ヒント(1)

(2)

(3)

dx

dt

= t

�1 � x

2�

, x(0) = 0.05

t

dx

dt

= x +�

t

2 + x

2, x(0) = 1

dx

dt

= � x

1 + t

+ cos t, x(0) = 1

ヒント1: 変数分離形dy

dx

= f (x)g(y)

ヒント1: 同次形 dy

dx

= f

�y

x

�dx�

x

2 + a

2= sinh�1 x

a

+Cヒント2:

sinh-1 x (インバースハイパボリックサイン)はMathematicaではArcSinh[t]

ヒント1: 1階線形微分方程式

x

� + P(t)x = Q(t)

µ = e�

P(t)dt

ヒント2: 積分因子を求めて両辺にかけると?

ヒント3: d

dt

(1 + t)x =?

Page 8: 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美 seto@ics.nara-wu.ac.jp H23 奈良女 計算機実験1 第2回 (2011/11/25修正版)

1 階の連立常微分方程式 ベクトル表示の場合

オイラー法

連立常微分方程式

k

1

= f (t, x)

k

2

= f

�t + h

2, x + k

1

2

k

3

= f

�t + h

2, x + k

2

2

k

4

= f (t + h, x + k

3

)

x(t + h) = x(t) + h�

k

1

6+ k

2

3+ k

3

3+ k

4

6

1 階の連立常微分方程式 ベクトル表示の場合

ルンゲ・クッタ法

連立常微分方程式

Page 9: 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美 seto@ics.nara-wu.ac.jp H23 奈良女 計算機実験1 第2回 (2011/11/25修正版)

H23 奈良女 計算機実験1 第2回

プログラム例 (ルンゲ・クッタ法, 多変数)#define'DIM'2''''''''''/*'次元'(変数の数)'*/

#define'DT''0.01'''''''/*'時間刻み幅'*/

#define'STEP_MAX'1000''/*'実時間'DT*STEP_MAX'='10.0'まで'*/

void'derives(double,'double[],'double[],'int);'/*'導関数'*/

void'runge_kutta(double,'double,'double*,'double);'/*'ルンゲ・クッタ法'*/

main(){''long'step;''double't,'x,'x_next;

''x=0.1;'''/*'初期値設定'*/

''for(i=0;'i<STEP_MAX;'i++){''''t'='i*DT;''''euler(t,'x,'&x_next,'DT);''''x'='x_next;''}}

void'runge_kutta(double't,'double'x,'double'*x_out,'double'h){...

}

double'fn(double't,'double'x){...

}

t = 0 より t = DT*STEP_MAXまでを計算

dx

dt= f (t, x)

H23 奈良女 計算機実験1 第2回

void'derives(double't,'double'x[],'double'derivatives[]){

}

関数derives

t, x(ti)の引数より導関数を計算し、derivatives[] 引数を介して計算結果を返す

ti x(ti)

dx/dtorf(t, x)

f(t, x)をそれぞれ計算し, それぞれの変数の導関数をderivatives[] に格納

例) derivative[0]+=+a*(x[1]1x[0]);

プログラム例 (ルンゲ・クッタ法, 多変数)

Page 10: 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美 seto@ics.nara-wu.ac.jp H23 奈良女 計算機実験1 第2回 (2011/11/25修正版)

H23 奈良女 計算機実験1 第2回

void'derives(double't,'double'x[],'double'x_out[],'double'h){

}

関数runge

t, x(ti), hよりルンゲクッタ法で x(ti+1) で計算し、x_out[] にそれぞれの結果を格納する

ti x(ti)

赤四角内を計算し, x_out[] に格納

プログラム例 (ルンゲ・クッタ法, 多変数)

x(ti+1) h

k1~k4はそれぞれderives[]を用いて計算する

k

1

= f(t, x)

k

2

= f(t +h2, x + h

k

1

2)

k

3

= f(t +h2, x + h

k

2

2)

k

4

= f(t + h, x + hk

3

)

x(t + h) = x + h�

k

1

6+

k

2

3+

k

3

3+

k

4

6

H23 奈良女 計算機実験1 第2回

• ロトカ・ボルテラ被食-捕食系

• ローレンツ系

Page 11: 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美 seto@ics.nara-wu.ac.jp H23 奈良女 計算機実験1 第2回 (2011/11/25修正版)

H23 奈良女 計算機実験1 第2回

dx

dt

= ax�bxy

dy

dt

=�cy+dxy

a: 餌生物の増殖速度b: 捕食による餌生物の減少速度c: 捕食者の死亡速度d: 捕食による捕食者の増殖速度

餌生物

捕食者

Lotka-Volterra捕食式

• 捕食者がいなければ餌生物は指数増殖• 餌生物がいなければ捕食者は絶滅

H23 奈良女 計算機実験1 第2回

レポート課題5

パラメータa = 1, b = 0.03, c = 1, d = 0.025の条件でロトカ・ボルテラ捕食式をルンゲ・クッタ法を用いて解け。なお、初期値 x(0), y(0) を様々な値に設定したとき、解が相平面上でどのような軌道を描くか調べて比較せよ。

Page 12: 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美 seto@ics.nara-wu.ac.jp H23 奈良女 計算機実験1 第2回 (2011/11/25修正版)

H23 奈良女 計算機実験1 第2回

ローレンツ方程式

dx1

dt

= a

(x2 � x1)

dx2

dt

= bx1 � x2 � x1x3

dx3

dt

= x1x2 � cx3

1963年に大気学者であるE. N. Lorenzによって定式化された極度に単純化された大気対流モデル

対流運動の速度

水平方向の温度変位

垂直方向の温度変位

a: プラントル数b: レイリー数c: 系の物理的サイズに関わるパラメータ

H23 奈良女 計算機実験1 第2回

レポート課題6

(1) パラメータa = 10, b = 28, c = 8.0/3の条件でローレンツ方程式をルンゲ・クッタ法を用いて解き、3次元表示で視覚化せよ。なお、初期条件は (a) (x1, x2, x3) = (0, 2, 0)と(b) (x1, x2, x3) = (0, 1.99, 0) として計算せよ。

(2)(1)の(a)と(b)の計算結果について、 横軸を時間とした x1 の時間動態の図を作成し、解の振る舞いを比較せよ。

t

x1 ?

Page 13: 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美 seto@ics.nara-wu.ac.jp H23 奈良女 計算機実験1 第2回 (2011/11/25修正版)

H23 奈良女 計算機実験1 第2回

Mathematicaによる数値解の視覚化 (1/4)オイラー法により書き出したMathematica により読み込み, 視覚化する ti x1(ti)

$ mathematica

SetDirectory[“~/keisanki-1-2010/”]

1) オイラー法により計算した結果を右図の形式で書き出す

2) GNOME端末からMathematicaを起動する

3) Mathematicaのシートでデータファイルのあるディレクトリを【SetDirectory】コマンドで指定する

x2(ti)0.000'1.00'2.00'3.000.001'1.02'1.97'3.030.002'1.05'1.94'3.08...

スペースを空ける

x3(ti)

H22 奈良女 計算機実験1 第1回

data = ReadList[ “data_file”, {Real, Real, Real, Real}];

データファイルより{ti, x1(ti), x2(ti), x3(ti)}の対を読み込み、読み込んだリストにdata という名前を付ける。

Mathematicaによる数値解の視覚化 (2/4)4) データファイルを読み込む

5) グラフ描画用にデータを成形する - リストの転置data は {{t0, x1(t0), x2(t0), x3(t0)}, {t1, x1(t1), x2(t1), x3(t1)}, ... } という形式になっているのでTranspose(転置)コマンドによりdataの成分を転置したものをdataTとする

dataT = Transpose[data];

これにより dataT は {{t0, t1, t2, ... }, {x1(t0), x1(t1), x1(t2), ... }, {x2(t0), x2(t1), x2(t2), ...}, {x3(t0), x3(t1), x3(t2), ... }} となる

Page 14: 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美 seto@ics.nara-wu.ac.jp H23 奈良女 計算機実験1 第2回 (2011/11/25修正版)

H22 奈良女 計算機実験1 第1回

Mathematicaによる数値解の視覚化 (3/4)6) グラフ描画用にデータを成形する - 描画用リストの作成

dataX = Transpose[ {dataT[[1]], dataT[[2]] } ];dataY = Transpose[ {dataT[[1]], dataT[[3]] } ];dataZ = Transpose[ {dataT[[1]], dataT[[4]] } ];

dataT の第 1 成分と他成分を組み合わせて転地し、新たに( t, x1(t) ), ( t, x2(t) ), ( t, x3(t) ) のデータリストを作成する

3次元プロット用に( x1(t), x2(t), x3(t) ) のデータ dataXYZ をつくる

dataXYZ = Transpose[ {dataT[[2]], dataT[[3]], dataT[[4]] } ];

H22 奈良女 計算機実験1 第1回

Mathematicaによる数値解の視覚化 (4/4)7) データをグラフに描く時系列データをグラフに描くコマンド ListPlot を用いて、横軸を時刻 t 、縦軸をそれぞれ x1(t), x2(t), x3(t) としたグラフを描き、名前を付ける

gx = ListPlot[ dataX, PlotJoined->True, PlotRange->All]gy = ListPlot[ dataY, PlotJoined->True, PlotRange->All]gz = ListPlot[ dataZ, PlotJoined->True, PlotRange->All]

3 つのグラフを Show コマンドで重ね合わせて表示Show[gx, gy, gz]

3 次元空間の軸をそれぞれ x1(t), x2(t), x3(t) としたグラフ(相空間内の解軌道)を描くには、3 次元グラフパッケージをあらかじめ読み込んでおく

視点を指定する

<<Graphics`Graphics3D`ScatterPlot3D[dataXYZ, BoxRatios->{1,1,1}, ViewPoint->{0.810, -2.475, 2.160}]

軸の表示比率を指定

Page 15: 計算機実験1 2seto/keisanki1/H23_kei...計算機実験1 自然情報学講座 瀬戸 繭美 seto@ics.nara-wu.ac.jp H23 奈良女 計算機実験1 第2回 (2011/11/25修正版)

H23 奈良女 計算機実験1 第2回

参考文献: 1) 高須 夫悟 (2009) H21年度 計算機実験1 講義レジュメ2) Hirsch, M.W., Smale S., Devaney, R.L. (2007) 力学系入門 原著第2版 - 微分方程式からカオスまで - , 株式会社 共立出版