Решение уравнения переноса - периодические условия - с использованием функции 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

Действительно, результат плохой (значения для каждой стороны не одинаковы). Я мог бы навязывать теоретические ценности на каждом этапе, но на практике мы не всегда знаем аналитическое решение.

Какова хитрость, чтобы наложить это периодическое граничное условие на численное решение на каждом шаге времени?

0 ответов

Другие вопросы по тегам