教科 > 計算機シミュレーション > 2 2008-10-21

【2008-10-21(Tue) 08:56:10】
1限目
<------------------------------

計算機シミュレーション
2回目
どこまで話したっけ?

//流れ
モデル考案
数式化
数式をとく
解の考察
モデルの妥当性
あるゲームをシミュレーションしよう

*ライフゲーム
数学者John Conweylyによって考案 (1970)
名前にはゲームとついてるけどゲームじゃない
ルールはシンプル
今日は1次元と2次元でやってみよう

セル・オートマトン

今日のルール
1 ×:死んでる
○:生きてる

2 3つ生きているセルが並んだとき 中央のセルは死ぬ
3つ死んでいるセルが並んだとき、中央のセルが誕生

3 以外はそのまま
定常状態にいくよね
すぐに


計算回数について一気に真値に行ってしまう
微分方程式はだんだんひらいて来る
なぜひらくのか
//計算機特有のもの

2回目ルール
1 死んでいるセルの周囲に3つ生きているセルがあれば次のステップでそのセルは生きる(誕生する)
2 生きているセルの周囲に2,3つ生きているセルがあれば生きる
3 上記以外は全部死ぬ

**誤差の原因があることを覚えているか
計算機が持つ特有の誤差
桁落ち
近い数値同士の計算
ex.
100000 6
- 99999 5
      1 1
有効数字が減ってしまう


情報落ち
SとAがあって
|S|>>|A|のとき
Aの計算結果がなくなってしまう

ex.
S 1.00000*10^6
A 1.00000*10^-1

S+A =
1.0000001*10^6
      ↑有効桁数の関係で消えてしまう

//満員通過
S=1.00*10^0
T=1.00*10^0
S=S+T;
・・・
S=9.98*10^2
S=9.99*10^2
S=1.00*10^3
S=1.001*10^3
      ↑足した1が消してしまう
有効桁の切捨て

丸め、打ち切り
四捨五入とか
切捨てとか

0.001を1000回足すと・・・?
Cで書くと・・・
float i;
for(i=0.01;i!=1.0;i=i+0.001);
コンピュータでは0.001を近似値でしか表せない
循環定数なので

こんなミスをしてしまう
float a;
int b;
b=1;
a=b/2;
何も入らない
0という数字が入る
a=b/2.0;

プログラム作ってというレポートを出します
動かない
int <- int と intの計算
//暗黙の型変換


<内容>
微分方程式を解く
<微分方程式とは>
1つ以上の変数とその導関数を
道の導関数として含んだ方程式のこと

<導関数を未知の関数>

1つの独立変数と導関数の常微分方程式

常微分方程式
モデルを立てて解析できるとは限らない
常微分方程式を数値的に解く
//**常微分方程式の初期値問題
スタートの地点の値がわかっている状態で計算を進めていく
dy/dx=f(x,y),y(x0)=y0
-> f(x,y)は点(x0,y0)を通り、2次元で有界かつ、
連続ならばその点の近傍で解を持つ


//ただし、一意とは限らない


</導関数を未知の関数>

</微分方程式とは>

<例>
y'=y x=0のときy=1
y'=dy/dx とおける
∫1/y dy = ∫dx
log|y| = x + c
y = ec + ex
    ↑1であればいい
∴y = ex
-> 初期値に応じて変化する




</例>

</内容>

初期値問題は初期値によって解が異なる
一意性は保障されない



->
最終更新:2008年10月22日 15:24