![]() |
(1) |
I=843314861*I+453816693 if(I.lt.0) I=(I+2147483647)+1 ran=float(I)*4.656612873D-10をつかうことで[0,1)に規格化された乱数をつくることができる.
一辺が長さ1の正方形からできている格子を考える.原点(0,0)にn個の球が置いてある.乱数を発生させ,上下左右に存在する隣の格子点にそれぞれ確率1/4で移動する.n回乱数を発生させ,N個全ての球を一回移動させると1ステップが終了する.
このプログラムを作成すると,同じサイズ(球の数n)の配列を多数用意する必要がある.同じ数字を何回も書くのは面倒であり,さらに配列のサイズを変化させる場合に手間がかかる.そこでparamtere文を用いる.parameter文は,ある文字列をその数字として読み替える,ということを行う.つまりプログラム中でその文字列が登場すると,parameter文で定義された数値にコンパイル時におきかわる.注意点は,parameter文で定義された変数は,プログラム中で別の値を代入はできない.ということである.
例:integer n parameter (n=1000) double precision x(n),y(n)
fortran90以降においては以下のようにもかける.
integer, parameter :: n = 1000 double precision, dimension(n) :: x,y
n個の球がランダムウォークするプログラムを作成せよ.始めはすべて原点に球は存在する.確率1/4で上下左右に1.D0だけ移動する.まずはn=10でプログラムを実行する.10000ステップ計算を実行すること.
N個のx座標,y座標をファイルに書き出したら,その次には空白行を入れておくこと.
例:do i=1,n write(1,*) x(i),y(i) enddo write(1,*)
set xrange [-100:100] set yrange [-100:100] if (n>1000) exit plot "ファイル名" every 1:1::n::n with points pt 7 ps 2 pause 0.05 n=n+1 rereadgnuplot上で
gnuplot> n=1 gnuplot> load 'anim.txt'
![]() |
(2) |
![]() |
(3) |
![]() |
(4) |
![]() |
(5) |
中心から距離が5よりも内側に存在している球の数を考える.球は外側に拡散してゆくので,この数は時間と共に小さくなる.