Решение уравнения переноса - периодические условия - с использованием функции python
Я должен численно решить уравнение адвекции с периодическими граничными условиями: u(t,0) = u(t,L), где L - длина системы, которую нужно решить.
Я также начинаю with u(0,x) = uexacte(0,x) = sin(2*pi*x/L)
Здесь основная часть кода с временем цикла (мы используем здесь FTCS scheme
):
V=1
L=1
# analytical solution --------------------------
def uexacte(t,x):
return sin(2*pi*(x-V*t)/L)
# 1. Centre FTCS (Forward Time Centered Space)
cfl = 0.25
nx = 10
tend = 1
#
dx = L/(nx-1.)
dt = cfl*dx/V
nt = int(tend/dt)+1
print "CFL=%5.2f tend=%4.1f --> %i iterations en temps"%(cfl,tend,nt)
# Arrays
x = linspace(0,L,nx)
# Bounadry condition
u0 = uexacte(0,x)
# Starting solution
t=0.0 ; u=copy(u0)
# Time loop
for i in range(1,nt):
# FTCS
#u[1:nx-1] = u[1:nx-1] - cfl/2*(u[2:nx] - u[0:nx-2])
# Using roll
u = u + - cfl/2*(roll(u,-1)- roll(u,1))
# Update time
t = t+dt
Я не понимаю решение, данное учителем, который использует функцию Python roll
в этом случае:
# Using roll
u = u - cfl/2*(roll(u,-1)- roll(u,1))
Один говорит, что с использованием roll
Мы обязательно соблюдаем периодические граничные условия, но я не понимаю, почему?
Действительно, мой первый подход был сделать:
u[0] = u[nx-1]
u[1:nx-1] = u[1:nx-1] - cfl/2*(u[2:nx] - u[0:nx-2])
но это не работает, и я не знаю, как реализовать эти периодические условия таким образом (без использования roll
функция).
Если кто-то может объяснить этот вопрос и трюк с roll function
было бы неплохо это сказать.
ОБНОВЛЕНИЕ 1:
Я попытался с классическим подходом (простая формула повторения), как это:
# Time loop
for i in range(1,nt):
# FTCS
u[1:nx-1] = u[1:nx-1] - cfl/2*(u[2:nx] - u[0:nx-2])
# Try to impose periodic boundary conditions but without success
u[0] = u[0] - cfl/2*(u[0] - u[nx-1])
# Update time
t = t+dt
Действительно, результат плохой (значения для каждой стороны не одинаковы). Я мог бы навязывать теоретические ценности на каждом этапе, но на практике мы не всегда знаем аналитическое решение.
Какова хитрость, чтобы наложить это периодическое граничное условие на численное решение на каждом шаге времени?