Сообщение, переданное в вычислительной науке:
ср https://scicomp.stackexchange.com/questions/30635/solving-advection-equation-periodic-conditions-using-roll-python-function
Я должен численно решить уравнение адвекции с периодическими граничными условиями: 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:
Я пробовал с классическим подходом (простой возвратФормула nce) вот так:
# 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
Действительно, результат плохой (значения для каждой стороны не одинаковы).Я мог бы навязывать теоретические значения на каждом шаге, но на практике мы не всегда знаем аналитическое решение.
В чем смысл навязывать это периодическое граничное условие числовому решению на каждом шаге времени?