Swarm oscillators 계산

16557 단어 수치 계산Julia

목적


  • Swarm Oscillators의 수치 계산
  • Julia v1.0 시도
  • Jupyter notebook

  • Swarm Oscillators 모델



    Swarm Oscillator는 직역하면 "무리 움직이는 진동자"이며, 그 이름대로 주변과의 상호 작용에 의해 집단적인 거동을 보여줍니다. Swarm oscillator 모델은 내부 자유도와 공간 자유도를 가진 요소가 상호작용하는 다중 요소 시스템의 모델입니다.

    요소는 각각 내부 상태(위상) $\psi$를 가지며 위치 $\boldsymbol{r}$에 있다고 가정합니다.
    평면에 $n$개의 입자가 존재할 때, 내부 상태(위상)는 $n$행 벡터 $\boldsymbol{\psi}$이고 위치는 $n$행 2열 행렬 $\boldsymbol{r }$라고 합니다. 이때 $i$번째 입자의 위상은 $\psi_i$이고 위치는 $\boldsymbol{r_i}$입니다. $i$번째 입자와 $j$번째 입자의 위상차를 $\Psi_{ji}=\psi_j-\psi_i$, 위치 차이를 벡터 $\boldsymbol{R_{ji}}=\boldsymbol{ r_j}-\boldsymbol{r_i}$로 설정하면 $i$번째 요소의 시간 발전은
    \frac{d}{dt}\psi_i=\sum_{\{j|j\neq i\}}e^{-|\boldsymbol{R_{ji}}|}\sin(\Psi_{ji}+\alpha|\boldsymbol{R_{ji}}|-c_1)\\
    \frac{d}{dt}\boldsymbol{r_i}=c_3 \sum_{\{j|j\neq i\}}\boldsymbol{\hat{R}_{ji}} e^{-|\boldsymbol{R_{ji}}|}\sin(\Psi_{ji}+\alpha|\boldsymbol{R_{ji}}|-c_2)
    
    

    로 작성됩니다. 여기서 $\boldsymbol{\hat{R}_{ji}}$는 표준화된 것을 나타냅니다.

    이미지로서는 소자가 위상 $\psi$에 따라 z축 방향으로 진동하고 있는 느낌입니다. 소자 자체로부터의 거리에 따라 지수 감쇠하는 정현파(즉 동심원)의 장이 있어, 그것이 다른 소자의 위상이나 위치에 영향을 주는 것 같은 느낌일까요?

    수치 계산


    using LinearAlgebra
    using Plots
    gr(size=(340,300),titlefont=font("sans-serif",9))
    
    const n=50 #素子数
    const L=25 #系のサイズ
    const c1=1.5
    const c2=0.5
    const c3=2.0
    const α=0.5
    const dt=0.05 #時間刻み
    
    function(ψ,r)
        a=zeros(n)
        for i=1:n
            sum=0
            for j=1:n
                if j==i; continue;end
                sum+=exp(-norm(r[j,:]-r[i,:]))*sin(ψ[j]-ψ[i]+α*norm(r[j,:]-r[i,:])-c1)
            end
            a[i]=sum
        end
        return a
    end
    
    function dr(ψ,r)
        a=zeros(n,2)
        for i=1:n
            sum=[0,0]
            for j=1:n
                if j==i; continue; end
                sum+=(normalize(r[j,:]-r[i,:]).*exp(-norm(r[j,:]-r[i,:]))*sin(ψ[j]-ψ[i]+α*norm(r[j,:]-r[i,:])-c2))
            end
            a[i,:]=sum
        end
        return c3*a
    end
    
    function oneStep!(ψ,r)
        ψ.=mod.(ψ+(ψ,r)*dt,2π)
        r.=mod.(r+dr(ψ,r)*dt,L)
    end
    
    function draw(gen,ψ,r)
        t=round(gen*dt;digits=2)
        scatter(r[:,1],r[:,2],
            xlab="x",xlims=(0,L),
            ylab="y",ylims=(0,L),
            zcolor=ψ,
            leg=false,
            cbar=true,
            cbarlims=(0,2π),
            title="t = $t, (gen = $gen),\n c=[$c1,$c2,$c3],alpha=$α")
    end
    
    psi=rand(0:0.01:2π, n)
    pos=rand(0:0.01:L,n,2)
    
    @time anim = @animate for m in 0:5000
        oneStep!(psi,pos)
        draw(m,psi,pos)
    end every 100
    
    @time gif(anim,"tmp/swarm_osillators.gif",fps=4)
    

    26.595608 seconds (263.93 M allocations: 22.255 GiB, 11.16% gc time)
    0.633165 seconds (701 allocations: 39.125 KiB)


    $ n = 50, L = 25, c_1 = 1.5, c_2 = 0.5, c_3 = 2.0,\alpha = 0.5, dt = 0.05 $ 일 때 Swarm Oscillators (동적 곡선 위상).


    $ n = 50, L = 25, c_1 = 5.5, c_2 = 0.5, c_3 = 2.0,\alpha = 0.5, dt = 0.05 $ 일 때 Swarm Oscillators (응집상).


    $ n = 50, L = 10, c_1 = 2.0, c_2 = 3.0, c_3 = 2.0,\alpha = 1.0, dt = 0.05 $ 일 때 Swarm Oscillators (격자상).

    6개의 파라미터 $n,L,c_1,c_2,c_3,\alpha$를 조절하는 것으로 다양한 집단적 거동을 나타냅니다.

    집어 넣은 곳



    표준 라이브러리 로드



    Julia v1.0부터 표준 라이브러리가 Base. 이하가 아니므로 사용할 때는 명시적으로 using 해야 합니다. 이번에는 normalize를 사용하기 위해 using LinearAlgebra라고 써야합니다.





    const의 힘



    글로벌 변수에 const를 붙이면 상당히 빨라진다(~100sec -> ~25sec)

    round



    이전에는
    
    round(m*dt,3)
    

    으로 3자리 표시가 가능했다. 현재는
    round(m*dt;digits=2)
    

    에서 소수 2위까지 표시 지정하게 되어 있다. 쉼표가 아니라 세미콜론임을 유의하십시오. (20180918 추가) 세미콜론이 아닌 쉼표에서도 OK입니다.
    round(m*dt,digits=2)
    

    참고문헌


  • 미우라다케, 발생 수리, 교토 대학 학술 출판회, pp206-209, 2015
  • 와사 마사토시, 다나카 댄, Swarm oscillator 모델의 집단 현상 http://traffic.phys.cs.is.nagoya-u.ac.jp/~mstf/pdf/mstf2010-02.pdf
  • 좋은 웹페이지 즐겨찾기