移動項 拡散項 境界 繊維方向

KABIRA2011-01-12

  • 拡散方程式のシミュレーション
  • 昨日のものとほとんど同じにみえるが
    • 一部修正
    • 移動項の中身を修正
    • 境界条件の計算方法を違う方法でかくほうがいいのだろうか
    • パラメータ(cやnu)にdxやdyの値をかけて補正がきくようにしたい
  • ムービ−はDirichlet条件で値0にして計算している
  • 移動について
  • 人の移動を考えると
    • 道を両方向に移動する
    • 移動の平均が移動項であらわされる
    • 移動の分散は拡散項であらわされる
  • 道の走る方向に拡散しやすいと考えて
    • ベクトル場を道の走向とみて、拡散係数nuにかける
    • 斜め方向の移動がないので、ベクトル場による斜め方向の影響がうまくあらわせない
X<-20    #空間
Y<-20
T<-50    #時間


dx<-1
dy<-1
dt<-0.5  #時間間隔

Nx<-X/dx   #格子の数
Ny<-Y/dy
Nt<-T/dt   #計算する回数

phi<-pi/20
Ox<-Nx/2
Oy<-Ny/2
V<-array(0,c(Nx,Ny,2))

f<-function(x,y,Ox,Oy,phi){
#r<-sqrt((x-Ox)^2+(y-Oy)^2)
r<-1
th<-atan2(y-Oy,x-Ox)
v<-c(-r*sin(th+phi),r*cos(th+phi))
v
}

for(i in 1:Nx){
for(j in 1:Ny){
V[i,j,]<-f(i,j,Ox,Oy,phi)
}
}

U<-array(0,c(Nx,Ny,Nt))
#U[5:10,5:10,1]<-1     #初期分布
U[floor(Nx/6):floor(Nx/3),floor(Ny/6):floor(Ny/3),1]<-1


cx<-0.1
cy<-0.1
c1<-cx*dx/dt
c2<-cy*dy/dt

nux<-0.05
nuy<-0.05
nu1<-nux*dx^2/dt
nu2<-nuy*dy^2/dt
 
#nux<-0.4
#nuy<-0.4

for(t in 1:(Nt-1)){
#for(i in 1:Nx){
#for(j in 1:Ny){

for(i in 2:(Nx-1)){
for(j in 2:(Ny-1)){

kx<-length(max(1,i-1):min(Nx,i+1))
ky<-length(max(1,j-1):min(Ny,j+1))

dux<-nu1/2*(sum(U[max(1,i-1):min(Nx,i+1),j,t])-kx*U[i,j,t])/(dx^2)*dt+c1*(max(0,V[max(i-1,1),j,1]*(i != 1))*U[max(i-1,1),j,t]-min(0,V[min(Nx,i+1),j,1]*(i != Nx))*U[min(i+1,Nx),j,t]-(max(0,V[i,j,1]*(i != Nx))-min(0,V[i,j,1]*(i != 1)))*U[i,j,t])/dx*dt

duy<-nu2/2*(sum(U[i,max(1,j-1):min(Ny,j+1),t])-ky*U[i,j,t])/(dy^2)*dt+c2*(max(0,V[i,max(j-1,1),2]*(j != 1))*U[i,max(j-1,1),t]-min(0,V[i,min(j+1,Ny),2]*(j != Ny))*U[i,min(j+1,Ny),t]-(max(0,V[i,j,2]*(i != Ny))-min(0,V[i,j,2]*(i != 1)))*U[i,j,t])/dy*dt

du<-dux+duy

U[i,j,t+1]<-U[i,j,t]+du
}
}
}
min(U)

for(t in 1:Nt){
persp(U[,,t],col=6,theta=20,phi=60,zlim=(c(0,1)))
#image(U[,,t],col=topo.colors(50))
print(sum(U[,,t]))
}
X<-20    #空間
Y<-20
T<-500    #時間


dx<-1
dy<-1
dt<-1  #時間間隔

Nx<-X/dx   #格子の数
Ny<-Y/dy
Nt<-T/dt   #計算する回数

phi<--pi/4
Ox<-Nx/2
Oy<-Ny/2
V<-array(0,c(Nx,Ny,2))

f<-function(x,y,Ox,Oy,phi){
#r<-sqrt((x-Ox)^2+(y-Oy)^2)
r<-1
th<-atan2(y-Oy,x-Ox)*0
v<-c(-r*sin(th+phi),r*cos(th+phi))
v
}

for(i in 1:Nx){
for(j in 1:Ny){
V[i,j,]<-f(i,j,Ox,Oy,phi)
}
}

U<-array(0,c(Nx,Ny,Nt))
#U[5:10,5:10,1]<-1     #初期分布
U[floor(Nx/6):floor(Nx/3),floor(Ny/6):floor(Ny/3),1]<-1


cx<-0.1
cy<-0.1
c1<-cx*dx/dt
c2<-cy*dy/dt

nux<-0.1
nuy<-0.1
nu1<-nux*dx^2/dt
nu2<-nuy*dy^2/dt
 
#nux<-0.4
#nuy<-0.4

for(t in 1:(Nt-1)){
for(i in 1:Nx){
for(j in 1:Ny){

kx<-length(max(1,i-1):min(Nx,i+1))
ky<-length(max(1,j-1):min(Ny,j+1))

dux<-abs(V[i,j,1])*nu1/2*(sum(U[max(1,i-1):min(Nx,i+1),j,t])-kx*U[i,j,t])/(dx^2)*dt
duy<-abs(V[i,j,2])*nu2/2*(sum(U[i,max(1,j-1):min(Ny,j+1),t])-ky*U[i,j,t])/(dy^2)*dt
du<-dux+duy

U[i,j,t+1]<-U[i,j,t]+du
}
}
}
min(U)

for(t in 1:Nt){
persp(U[,,t],col=6,theta=20,phi=60,zlim=(c(0,1)))
image(U[,,t],col=topo.colors(50))
print(sum(U[,,t]))
}