計算機実験1 2seto/keisanki1/h23_kei...計算機実験1 自然情報学講座 瀬戸 繭美...
Post on 18-Aug-2020
0 Views
Preview:
TRANSCRIPT
計算機実験1
自然情報学講座 瀬戸 繭美seto@ics.nara-wu.ac.jp
H23 奈良女 計算機実験1 第2回(2011/11/25修正版)
H23 奈良女 計算機実験1 第2回
前回まで
ti ti+1
xi
xi+1
f(ti, xi)
x
t
誤差
Euler法による常微分方程式の数値解法
問題点
精度の低い近似( 時間の刻み幅を小さくすることにより改善するが計算量が大きくなる)
h
解析解
数値解
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次)
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 (ルンゲ・クッタ) 法
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
�
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までを計算
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
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 =?
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 階の連立常微分方程式 ベクトル表示の場合
ルンゲ・クッタ法
連立常微分方程式
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]);
プログラム例 (ルンゲ・クッタ法, 多変数)
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回
• ロトカ・ボルテラ被食-捕食系
• ローレンツ系
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) を様々な値に設定したとき、解が相平面上でどのような軌道を描くか調べて比較せよ。
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 ?
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), ... }} となる
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}]
軸の表示比率を指定
H23 奈良女 計算機実験1 第2回
参考文献: 1) 高須 夫悟 (2009) H21年度 計算機実験1 講義レジュメ2) Hirsch, M.W., Smale S., Devaney, R.L. (2007) 力学系入門 原著第2版 - 微分方程式からカオスまで - , 株式会社 共立出版
top related