拡散項のみ

KABIRA2010-12-25

  • 拡散のシミュレーション
  • 今回は拡散方程式を解析的にではなく数値的に計算していく
  • いろいろな項を考えているがまずは拡散項のみ
    • 独立変数:x, \hspace{4} y,\hspace{4} t
    • 従属変数:u(x,y,t)
    • \frac{\partial u}{\partial t} = D\nabla^2uのつもり
  • 計算にあたり
    • u(x,y,t)の値を array U[i,j,t]に入れてある
  • 1. 計算について
    • 区間[1,N] \times [1,M] の内点について計算
    • つまり 2 \leq i \leq N-1, \hspace{4} 2 \leq j \leq M-1 の範囲で計算
    • i=1,N,  \hspace{8} j = 1,Mのときのarray U の値は境界条件を表すようにする
  • 2. 境界条件について
    • Dirichlet、Neumann 両方入れてみた
    • Dirichlet条件
      • 0に固定することに
      • i =N \hspace{4} or \hspace{4} j = Mについては何も計算しないので
      • u(N,y,t)=u(x,M,t)=0となっている
    • Neumann条件にはなっていないかも
      • U[1,,t]=U[2,,t] としたので
      • \frac{\partial u}{\partial x}(1,y,t) = 0にはなっているが
      • 今回の計算の仕方ではfluxが(x=1)のところで0になっている訳ではない?
      • 追記
        • 保存されるようにしたのがこちら
  • 3. 初期条件については
    • 今回はとりあえずパルス状に発生させておいた
N<-30
M<-40
T<-50

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

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

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

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

for(i in 2:(N-1)){
for(j in 2:(M-1)){
du<-D*(sum(U[(i-1):(i+1),(j-1):(j+1),t])-9*U[i,j,t])/(d^2)*dt        #uの変化量duを計算
U[i,j,t+1]<-U[i,j,t]+du
}
}
U[,1,t+1]<-U[,2,t+1]  #Neumann条件
U[1,,t+1]<-U[2,,t+1]

}
min(U)

for (t in 1:T){
persp(U[,,t],col=3,theta=20,phi=30,zlim=c(0,1))
#image(U[,,t],col=topo.colors(10))
}