我有一个基本的循环(实际上是更新数组值的时间循环):
for i in range(1,nt):
#Using roll
u = u - cfl/2*(roll(u,-1)- roll(u,1))
# Update time
t = t+dt
有了此循环和roll
函数,模拟工作正常。
我明确规定我必须具有周期性边界条件(x[0] = x[n-1]
)
现在,我正拼命地尝试获取相同的等效代码,但采用经典方法,我的意思是写出roll
移位函数的作用的显式代码。
在另一个论坛上的上一篇文章中,有人建议这样做:
for i in range(1,nt):
utemp1 = u[0] - cfl/2*(u[nx-1] - u[1])
utemp2 = u[nx-1] - cfl/2*(u[nx-2] - u[0])
u[1:nx-2] = u[1:nx-2] - cfl/2*(u[0:nx-3] - u[2:nx-1])
u[0] = utemp1
u[nx-1] = utemp2
但是,此“ 等效代码”所产生的结果与第一版(使用roll
python函数)所产生的结果不同。
我想获得有关我的作业中有什么问题的帮助。这似乎是覆盖值或边界更新不正确的问题。
更新1:
@B提供的解决方案。 M.工作完美且清晰。谢谢大家。
答案 0 :(得分:0)
两个等效功能:
nt=7
nx=10
cfl=1.1
def old(u0,cfl=-cfl):
u=u0.copy()
for i in range(1,nt):
utemp1=u[0] - cfl/2*(u[nx-1] - u[1])
utemp2=u[nx-1] - cfl/2*(u[nx-2] - u[0])
u[1:nx-1] = u[1:nx-1] - cfl/2*(u[0:nx-2] - u[2:nx])
u[0] = utemp1
u[nx-1] = utemp2
return u
def new(u0):
u=u0.copy().astype(float)
for i in range(1,nt):
u -= cfl/2*(roll(u,-1)- roll(u,+1))
return u
索引中的错误,滚动符号和v
的类型:必须是浮动的。
运行:
In [521]: u0
Out[521]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
In [522]: old(u0)
Out[522]:
array([-15.06651094, 22.56142656, 28.93808047, 11.76161172,
0.41970625, 1.41970625, -9.92219922, 9.25426953,
15.63092344, -19.99701406])
In [523]: new(u0)
Out[523]:
array([-15.06651094, 22.56142656, 28.93808047, 11.76161172,
0.41970625, 1.41970625, -9.92219922, 9.25426953,
15.63092344, -19.99701406])