| (1) |
implicit none
integer i,j
double precision ran
do j = 1, 100
i=843314861*i+453816693
if(i.lt.0) i=(I+2147483647)+1
ran=dfloat(i)*4.656612873D-10
write(*,*) j,ran
enddo
end
をつかうことで[0,1)に規格化された乱数をつくることができる.一辺が長さ1.D0の正方形からできている碁盤の目を考える.原点(0,0)にn個の球が置いてある.乱数を発生させ,上下左右に存在する隣の格子点にそれぞれ確率1/4で移動する.n回乱数を発生させ,n個全ての球を一回移動させると1ステップが終了する.
このプログラムを作成しようとすると,球の数nの大きさの配列を複数用意する必要がある.たとえばi番目の球のx座標,y座標.100個の場合なら
double precision x(100),y(100)などとと記述する.さらに,それぞれの球の原点からの距離もあったら dis(100) などが追加される. 同じ数字を何回も書くのは面倒であり,配列のサイズを変化させる場合に書き間違いが起こる.そこでparamtere文を用いる.parameter文は,ある文字列をその数字として読み替える,ということを行う.つまりプログラム中でその文字列が登場すると,parameter文で定義された数値にコンパイル時におきかわる.注意点は,parameter文で定義された変数は,プログラム中で別の値を代入はできない.ということである. 例:
integer n
parameter (n=1000)
double precision x(n),y(n)
n個の球がランダムウォークするプログラムを作成せよ.始めはすべて原点に球は存在する.確率 1/4 = 0.25D0 で上下左右に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) |
| (4) |
| (5) |
課題2のプログラム,および時刻ー平均距離のデータファイルを送付すること.
上下よりも左右に移動する確率が大きい場合を考える.右と左に移動する確率がそれぞれ1/3, 上と下に移動する確率がそれぞれ1/6の場合について計算を行う.n=10の場合について計算し,アニメを観察せよ.
n=1000にして計算を行う.x座標の絶対値の平均値と,y座標の絶対値の平均値をそれぞれ各時刻で算出し,横軸が時刻,縦軸がそれぞれの平均値でグラフを作成する.当然,x座標の平均値の方が大きくなる.
x座標の絶対値の平均値と,y座標の絶対値の平均値を同じにするためには,y方向の1ステップでの移動量をもともとの値である1.D0から何倍させればよいか.プログラムと,増加させたあとのy方向の移動量の数値を送ること.