В контексте численного решения адвекции я пытаюсь реализовать следующую формулу рекурсии во временном цикле:

Recurrence Leapfrog

Как видите, мне нужно второе предыдущее значение времени для (j-1) и предыдущее (j) значение, чтобы вычислить значение времени (j + 1).

Я не знаю, как реализовать эту формулу повторения. Ниже моя попытка на Python, где u представляет массив значений T для каждой итерации:

l = 1
# Time loop
for i in range(1,nt+1):                                                                  
# Leapfrog scheme                                                                        
    # Store (i-1) value for scheme formula                                               
    if (l < 2):                                                                          
       atemp = copy(u)                                                                   
       l = l+1                                                                           
    elif (l == 2):                                                                       
       btemp = copy(atemp)                                                               
       l = 1                                                                             
    u[1:nx-1] = btemp[1:nx-1] - cfl*(u[2:nx] - u[0:nx-2])                                
    t=t+dt                                                                               

Коэффициент cfl равен s.

Но результаты моделирования не дают полностью хороших результатов. Я считаю, что я поступаю неправильно.

Кто-нибудь может помочь мне реализовать это повторение?, То есть в основном, как сохранить значение (j-1) вовремя, чтобы ввести его в формулу для вычисления (j + 1)?

ОБНОВЛЕНИЕ 1:

В формуле: формула повторения

Временной индекс j должен начинаться с j=1, поскольку у нас есть термин T_(i,j-1).

К сожалению, для первой итерации у нас есть:

T_i,2 = T_i,0 - s (T_(i+1),1 - T_(i-1),1)

Затем, если я использую только временной цикл (а не пространственный цикл, таким образом, я не могу вычислить dudx[i]=T[i+1]-T[i-1]), как я могу вычислить (T_(i+1),1 - T_(i-1),1), я имею в виду, без предварительного вычисления dudx[i] = T_(i+1),1 - T_(i-1),1?

Это был трюк, который я пытаюсь реализовать в своем первоначальном вопросе. Вы видите мою проблему? основная проблема в том, что я вынужден использовать только временную петлю.

Код был бы проще, если бы я мог использовать 2D-массив с элементом T[i][j], i для пространственного и j для времени, но мне не разрешено использовать 2D-массив в моем исследовании.

Спасибо за вашу помощь

0
youpilat13 27 Ноя 2018 в 05:59

1 ответ

Лучший ответ

Я вижу несколько проблем в вашем коде. Во-первых, это обозначения. Из представленной вами числовой схемы похоже, что вы дискретизируете время с помощью j и пространство с помощью i, используя центральные различия в обоих. Но в вашем коде похоже, что временной цикл написан в терминах i, и это сбивает с толку. Я буду использовать j для космоса и n для времени здесь.

Во-вторых, эта строка

u[1:nx-1] = btemp[1:nx-1] - cfl*(u[2:nx] - u[0:nx-2]) 

Неверно, поскольку для пространственной производной du / dx вам необходимо применить центральную разностную схему в каждой пространственной точке u. Следовательно, u[2:nx] - u[0:nx-2] ничего подобного не делает, он просто вычитает то, что кажется решением, включая граничные точки слева, из решения, включая граничные точки справа. Вам необходимо правильно вычислить эту пространственную производную.

Наконец, метод Leapfrog, который действительно учитывает решение n-1, обычно реализуется путем сохранения копии предыдущего временного шага в другой переменной, такой как u_prev. Так что, если вы используете временную схему Leapfrog плюс пространственную схему центральных разностей, в конечном итоге у вас должно получиться что-то вроде

u_prev = u_init
u = u_prev
for n in time...:
    u_new = u_prev - cfl*(dudx)
    u_prev = u
    u = u_new

Обратите внимание, что u на LHS предназначен для вычисления времени n+1, u_prev находится во времени n-1 и dudx использует u в текущее время n. Кроме того, вы можете вычислить dudx с помощью

for j in space...:
    dudx[j] = u[j+1]-u[j-1]
1
b-fg 29 Ноя 2018 в 02:39