全量が保存されるNeumann条件

KABIRA2011-01-02

  • 拡散をシミュレーションしていて
  • こちらこちらでNeumann条件になっていなかった
  • 境界でゼロフラックスになるようにする
    • 端からの流出が起きないようにする
    • そのため流入の起こるマスを制限する
      • 計算過程で流入の起こるマスの数も数えておく
      • ソースの中のkが流入の起こるマスの数
  • 計算しているのは
    • \frac{\partial u}{\partial t} = D\nabla^2u
N<-30
M<-30
T<-100

d<-1    #キョリの次元
dt<-1   #時間の次元
D<-0.12  #拡散係数

U<-array(0,c(N,M,T))

U[5:10,5:10,1]<-1    #初期条件

#拡散
for(t in 1:(T-1)){

for(i in 1:N){
for(j in 1:M){
k<-length(U[max(1,i-1):min(i+1,N),max(1,j-1):min(j+1,M),t])
du<-D/9*(sum(U[max(1,i-1):min(i+1,N),max(1,j-1):min(j+1,M),t])-k*U[i,j,t])/(d^2)*dt
U[i,j,t+1]<-U[i,j,t]+du
}
}

}
min(U)

for (t in 1:T){
persp(U[,,t],col=3,theta=20,phi=30,zlim=c(0,1))
#print(sum(U[,,t]))
}