動機
下記のpdfの3/17ページのような正方格子上のランダムウォークを見たくなったので
注意
リントしてないので汚いです
反射壁,吸収壁は考えていません
1辺200の正方格子の中心から300歩やったので奇跡的にはみ出す可能性があります
方針
mutable struct
としてParticle
を作成して,x座標,y座標,次の方向をもたせる
次の方向=rand(1:4)として→↑↓←を割り振りました,もう少しいい方法もある気がしてます
使うライブラリ
Plotで,Backendはgr()を使う
∵スピード,3D,GUI,を重視したいときはBackendをgr()にすることがおすすめされているので
インタラクティブ性を重視したいとき,速さ重視のとき,綺麗さを重視したいときetc...
結局どうすればいいんだ!早く結論だけ言え!!というせっかちな人のための図があります(For the impatient)
やってみる
using Plots gr() ONESIDE = 100 mutable struct Particle x::Int8 y::Int8 next_direction::Int8 end particle = Particle(0,0,0) function assign_direction(Particle) Particle.next_direction = rand(1:4) return Particle end function step(Particle) if Particle.next_direction == 1 Particle.x = Particle.x-1 return Particle elseif Particle.next_direction == 2 Particle.y = Particle.y-1 return Particle elseif Particle.next_direction == 3 Particle.y = Particle.y+1 return Particle elseif Particle.next_direction == 4 Particle.x = Particle.x+1 return Particle else return Particle end end #300枚のanimを作る anim = @animate for i = 1:300 scatter([particle.x],[particle.y],color="blue",xlims=(-ONESIDE,ONESIDE),ylims=(-ONESIDE,ONESIDE),legend=false) step(assign_direction(particle)) end # fps=1秒あたりに見せるフレーム数 gif(anim, "file_name_you_want.gif", fps=20)
結果
おまけ
scatter!
で重ねて書けるので,2個以上の粒子を考える場合はscatter
以降をscatter!
にする必要がある
意図的にscatter!
だけを使ってpathを全部プロットするとこうなる
蛇みたいでかわいい
D=1,2の格子ランダムウォークは原点を無限回訪問するが,D>=3から突然成立しなくなることはよく知られていて例えばD.Williams本にも載ってます
Plot完全理解者になってD=3も可視化したいです
参考
1
オープンコア講座
ランダムウォークと確率論
熊谷 隆(京都大学理学部数学教室)
http://www.kurims.kyoto-u.ac.jp/~kumagai/Open-core-TK.pdf
2
Probability with Martingales(D.Williams)
3
plotのbackendに関して
https://docs.juliaplots.org/latest/backends/