我正在尝试使用迎风方案对一维平流对流进行数值建模。我使用以下等式来计算内部单元格的值:
我正在使用 Robin 边界条件(又名绝缘边界)。换句话说,我试图保证没有质量会离开模型环境。通过将最左边和最右边的单元格设置为:
和
在哪里是浓度,扩散系数,是速度和是当前单元格的 x 坐标,从到.
我理解当满足以下两个条件时,该方案在数值上应该是稳定和准确的:
和
但是,如果我使用参数运行此模型,,,, 10,000 个时间步后有一些质量损失,即使满足上述条件。可能看起来很多,但由于我的时间步长非常小,这意味着更少当这种情况开始发生时。
任何想法,什么会导致这种质量损失?
下面是在 R 中进行此模拟的代码。
transfun = function(time,state,parms) {
D = parms$D
u = parms$u
dt = parms$dt
dx = parms$dx
n = length(state)
new = numeric(n)
#Boundary cells
state[1]= state[2]* D/(u+D)
state[n]= state[n-1]* (u*dx+D)/D
# Internal cells
for(a in 2:(n-1)) {
state[a] = state[a] +D*dt/dx^2 * ( state[a-1] + -2*state[a] + state[a+1]) +
u * dt/dx * (-state[a] + state[a+1])
}
#Boundary cells
state[1]= state[2]* D/(u+D)
state[n]= state[n-1]* (u*dx+D)/D
return(list(state))
}
## Hand made loop
# Ensure parameters follow the stability rule: 0<= C^2 <= 2s <= 1
# where C = u*dt/dx and s = D*dt/dx^2
D=0.05
u=0.1
dt=0.001
dx=1
C = u*dt/dx
s = D*dt/(dx^2)
n = 15
T = 10000
print(C+2*s < 1)
print(u*dx/D<2/(1-C))
resul = matrix(NA,T,n)
resul[1,] = rep(0,n)
resul[1,ceiling(15/2)] = 1
for(a in seq(2,T,1)) {
resul[a,] = transfun(1,state=resul[a-1,],parms=list(D=D,u=u,dt=dt,dx=dx))[[1]]
}
,