Сообщение передано по вычислительной науке - решение уравнения переноса - периодические условия - с использованием функции python - PullRequest
0 голосов
/ 27 ноября 2018

Сообщение, переданное в вычислительной науке:

ср 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

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

В чем смысл навязывать это периодическое граничное условие числовому решению на каждом шаге времени?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...