2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 Уравнение теплопроводности. Продольно-поперечная схема.
Сообщение26.11.2017, 20:10 


26/11/17
3
Стоит задача решить задачу дирехле для уравнения теплопроводности (в прямоугольной области). Насколько я знаю, продольно-поперечная схема является безусловно устойчивой, значит должна сходиться при любом шаге по времени или координате. Я попытался реализовать алгоритм, в итоге никакой безусловной устойчивости не получается. Ведёт себя, как явная схема: если уменьшить шаг по координатам, то, без уменьшения шага по времени, решение расходится. С чем это может быть связано? Я думал, может просто ошибка машинном округлении накапливается.

Если что, вот питоний код моей реализации. Функция принимает значения на одном временном слое и находит значения на следующем.

код: [ скачать ] [ спрятать ]
Используется синтаксис Python
#
# T - шаг по времени
# hx = hy шаги по координатам
#
def solveLayer(vv):
    for k in range(1, Nxy + 1): # Первый полушаг по времени
#Заполнение коэффициентов СЛУ для неявной схемы. Крайние элементы VV всегда  = 0 (гран условия)
        a = [0 if i == 1 else - 0.5 * T / (hx ** 2) for i in range(1, Nxy + 1)]
        b = [T / (hx ** 2) + 1] * Nxy
        c = [0 if i == Nxy else -0.5 * T / (hx ** 2) for i in range(1, Nxy + 1)]
        d = [vv[i][k] * (1 - T / (hy ** 2)) + (vv[i][k + 1] + vv[i][k - 1]) * 0.5 * T / (hy ** 2) for i in
             range(1, Nxy + 1)]
        for j in range(1, Nxy):
            t = a[j] / b[j - 1]
            a[j] = 0
            b[j] -= t * c[j - 1]
            d[j] -= t * d[j - 1]
        vv[Nxy][k] = d[Nxy - 1] / b[Nxy - 1]
        for i in range(Nxy - 1, 0, -1):
            vv[i][k] = 1 / b[i - 1] * (d[i - 1] - c[i - 1] * vv[i + 1][k])

    for k in range(1, Nxy + 1): # Второй полушаг
        a = [0 if i == 1 else - 0.5 * T / (hx ** 2) for i in range(1, Nxy + 1)]
        b = [T / (hx ** 2) + 1] * Nxy
        c = [0 if i == Nxy else -0.5 * T / (hx ** 2) for i in range(1, Nxy + 1)]
        d = [vv[k][i] * (1 - T / (hy ** 2)) + (vv[k + 1][i] + vv[k - 1][i]) * 0.5 * T / (hy ** 2) for i in
             range(1, Nxy + 1)]
        for j in range(1, Nxy):
            t = a[j] / b[j - 1]
            a[j] = 0
            b[j] -= t * c[j - 1]
            d[j] -= t * d[j - 1]
        vv[k][Nxy] = d[Nxy - 1] / b[Nxy - 1]
        for i in range(Nxy - 1, 0, -1):
            vv[k][i] = 1 / b[i - 1] * (d[i - 1] - c[i - 1] * vv[k][i + 1])
    return vv
 

 i  Pphantom:
Очень полезно пользоваться подсветкой кода, благо она есть. Поправил.

 Профиль  
                  
 
 Re: Уравнение теплопроводности. Продольно-поперечная схема.
Сообщение26.11.2017, 21:31 
Заслуженный участник


11/05/08
32166
MJiri в сообщении #1269322 писал(а):
Я думал, может просто ошибка машинном округлении накапливается.

Нет, этого не может быть. Дело в том, что схема переменных направлений -- она, в общем, уточняющая по своему смыслу. Во всяком случае, через каждую пару шагов, а этого и достаточно. Поэтому погрешности округления будут, наоборот, нивелироваться.

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

 Профиль  
                  
 
 Re: Уравнение теплопроводности. Продольно-поперечная схема.
Сообщение26.11.2017, 22:43 
Заслуженный участник
Аватара пользователя


01/08/06
3140
Уфа
В код совершенно неохота вникать.
Но у вас должен выполняться "принцип максимума": значение во внутренней точке на следующем временном слое является средним из значений на предыдущем (известных) и соседних значений (неизвестных). Что-то типа такого:
$$T_{ij}^{k+0.5}=\alpha_1 T_{ij}^k+\beta_1 T_{i-1,j}^{k+0.5}+\gamma_1 T_{i+1,j}^{k+0.5},$$$$T_{ij}^{k+1}=\alpha_2 T_{ij}^{k+0.5}+\beta_2 T_{i,j-1}^{k+1}+\gamma_2 T_{i,j+1}^{k+1},$$где$$\alpha_1+\beta_1+\gamma_1 = \alpha_2+\beta_2+\gamma_2 = 1,$$и все эти коэффициенты положительны.
Надо проверить (отладочным кодом), выполняется ли этот принцип для коэффициентов уравнений (с учётом округлений, нужно проверять с какой-то погрешностью).
Если выполняется, то нужно смотреть уже код решения системы линейных уравнений, для тех внутренних точек, в которых "принцип максимума" нарушается, т.е. значения меньше минимума или больше максимума соседних (участвующих в одном уравнении) — значит для этих значений система решена неверно.
Если и тут всё нормально, то ещё остаётся последняя возможность, что решение начинает портиться с краёв, тогда отдельно на реализацию граничных условий надо обратить внимание.
Дальше я пас.

P.S. Я всё-таки код глянул одним глазком. По-моему, вы напутали с hx и hy в коэффициентах a, b, c и d: в первой системе везде должно быть hx, а во второй — hy. Ну или наоборот.

 Профиль  
                  
 
 Re: Уравнение теплопроводности. Продольно-поперечная схема.
Сообщение27.11.2017, 05:45 


26/11/17
3
worm2 в сообщении #1269389 писал(а):
P.S. Я всё-таки код глянул одним глазком. По-моему, вы напутали с hx и hy в коэффициентах a, b, c и d: в первой системе везде должно быть hx, а во второй — hy. Ну или наоборот.


Есть такое, но hx = hy, так что это не влияет никак.

 Профиль  
                  
 
 Re: Уравнение теплопроводности. Продольно-поперечная схема.
Сообщение27.11.2017, 15:56 


26/11/17
3
Спасибо всем, нашёл ошибку. Алгоритм реализован верно, проблема была в том, что коэффициент d завист от всех соседних значений температуры на предудущем шаге, а я перезаписывал эти значения на первом же полушаге. Запись промежуточных результатов в ещё однин массив всё исправила.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: CDDDS


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group