Swarm oscillators 계산
목적
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 dψ(ψ,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.(ψ+dψ(ψ,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)
참고문헌
Reference
이 문제에 관하여(Swarm oscillators 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/STInverSpinel/items/ba25bbdf32c83336990f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)