眠気.jl

投稿=不定期

JuliaでD次元正方格子上のランダムウォークを見る(D=2)

動機

下記の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)
f:id:julialangisthebestlang:20190802194348j:plain

やってみる

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)

結果

f:id:julialangisthebestlang:20190802194520g:plain
random walk

おまけ

scatter!で重ねて書けるので,2個以上の粒子を考える場合はscatter以降をscatter!にする必要がある
意図的にscatter!だけを使ってpathを全部プロットするとこうなる

f:id:julialangisthebestlang:20190802194652g:plain
random walk with 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/