Две эквивалентные функции:
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])