Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности с помощью python (NumPy)

Я решаю уравнение теплопроводности для металлического стержня, поскольку один конец поддерживается при 100 ° C, а другой при 0 ° C как

Решение уравнения теплопроводности в питоне

Если изменение граничного условия Неймана как одного конца изолировано (а не флюсом),

Решение уравнения теплопроводности в питоне

то как расчетный термин

Типичный подход к граничному условию Неймана состоит в том, чтобы представить «точку-призрак» на один шаг за пределами области и вычислить значение для нее с использованием граничного условия; затем выполните нормально (используя PDE) для точек, находящихся внутри сетки, включая границу Неймана.

Точка призрака позволяет использовать симметричную конечную разностную аппроксимацию производной на границе, т.е. (T[n, j+1] — T[n, j-1])/(2*dy) если y — пространственная переменная. Несимметричная аппроксимация (T[n, j] — T[n, j-1])/dy , которая не содержит точки призрака, намного менее точна: введенная ошибка на порядок хуже ошибки участвующих в дискретизации самого PDE.

Итак, когда j является максимальным возможным индексом для T, граничное условие говорит, что » T[n, j+1] » следует понимать как T[n, j-1] и это то, что делается ниже.

Видео:#5. Математические функции и работа с модулем math | Python для начинающихСкачать

#5. Математические функции и работа с модулем math | Python для начинающих

Уравнение теплопроводности в tensorflow

Привет, Хабр! Некоторое время назад увлекся глубоким обучением и стал потихоньку изучать tensorflow. Пока копался в tensorflow вспомнил про свою курсовую по параллельному программированию, которую делал в том году на 4 курсе университета. Задание там формулировалось так:

Линейная начально-краевая задача для двумерного уравнения теплопроводности:

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Хотя правильнее было бы назвать это уравнением диффузии.

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

Я не специалист в численных методах, пока не специалист в tensorflow, но опыт у меня уже появился. И я загорелся желанием попробовать вычислять урматы на фреймворке для глубокого обучения. Метод сопряженных градиентов реализовывать второй раз уже не интересно, зато интересно посмотреть как с вычислением справится tensorflow и какие сложности при этом возникнут. Этот пост про то, что из этого вышло.

Видео:Решение уравнения теплопроводности методом конечных разностейСкачать

Решение уравнения теплопроводности методом конечных разностей

Численный алгоритм

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Разностная схема:

Чтобы проще было расписывать, введем операторы:

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Явная разностная схема:

Решение уравнения теплопроводности в питоне

В случае явной разностной схемы для вычисления используются значения функции в предыдущий момент времени и не требуется решать уравнение на значения Решение уравнения теплопроводности в питоне. Однако такая схема менее точная и требует значительно меньший шаг по времени.

Неявная разностная схема:

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Перенесем в левую сторону все связанное с Решение уравнения теплопроводности в питоне, а в правую Решение уравнения теплопроводности в питонеи домножим на Решение уравнения теплопроводности в питоне:

Решение уравнения теплопроводности в питоне

По сути мы получили операторное уравнение над сеткой:

Решение уравнения теплопроводности в питоне

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

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Заменив Решение уравнения теплопроводности в питонена нашу оценку Решение уравнения теплопроводности в питоне, запишем функционал ошибки:

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

где Решение уравнения теплопроводности в питоне— ошибка в узлах сетки.

Будем итерационно минимизировать функционал ошибки, используя градиент.

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

Видео:Python - численное решение дифференциального уравнения 1го порядка и вывод графикаСкачать

Python - численное решение дифференциального уравнения 1го порядка и вывод графика

Реализация на tensorflow

Кратко о tensorflow

В tensorflow сначала строится граф вычислений. Ресурсы под граф выделяются внутри tf.Session. Узлы графа — это операции над данными. Ячейками для входных данных в граф служат tf.placeholder. Чтобы выполнить граф, надо у объекта сессии запустить метод run, передав в него интересующую операцию и входные данные для плейсхолдеров. Метод run вернет результат выполнения операции, а также может изменить значения внутри tf.Variable в рамках сессии.

tensorflow сам умеет строить графы операций, реализующие backpropagation градиента, при условии, что в оригинальном графе присутствуют только операции, для которых реализован градиент (пока не у всех).

Сначала код инициализации. Здесь производим все предварительные операции и считаем все, что можно посчитать заранее.

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

Стоит отметить, что метод с адаптивным моментом показал себя наилучшим образом, пусть функционал ошибки и квадратичный.

Вычисление функции: в каждый момент времени делаем несколько оптимизационных итераций, пока не превысим maxiter или ошибка не станет меньше eps, сохраняем и переходим к следующему моменту.

Запуск:

Видео:8.1 Решение уравнения теплопроводности на отрезкеСкачать

8.1 Решение уравнения теплопроводности на отрезке

Результаты

Решение уравнения теплопроводности в питоне
Решение уравнения теплопроводности в питоне

Условие как и оригинальное, но без Решение уравнения теплопроводности в питонев уравнении:

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Что легко правится в коде:

Разницы почти нет, потому что производные имеют большие порядки, чем сама функция.

Решение уравнения теплопроводности в питоне
Решение уравнения теплопроводности в питоне

Условие с одним нагревающимся краем:

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне
Решение уравнения теплопроводности в питоне

Условие с остыванием изначально нагретой области:

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне
Решение уравнения теплопроводности в питоне

Условие с включением нагрева в области:

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне

Решение уравнения теплопроводности в питоне
Решение уравнения теплопроводности в питоне

Видео:Использование библиотеки SymPy для работы с системами уравнений в PythonСкачать

Использование библиотеки SymPy для работы с системами уравнений в Python

Рисование гифок

Функция рисования 3D-гифки:

В основной класс добавляем метод, возвращающий U в виде pandas.DataFrame

Функция рисования 2D-гифки:

Стоит отметить, что оригинальное условие без использования GPU считалось 4м 26с, а с использованием GPU 2м 11с. При больших значениях точек разрыв растет. Однако не все операции в полученном графе GPU-совместимы.

  • Intel Core i7 6700HQ 2600 МГц,
  • NVIDIA GeForce GTX 960M.

Посмотреть, какие операции на чем выполняются, можно с помощью следующего кода:

Это был интересный опыт. Tensorflow неплохо показал себя для этой задачи. Может быть даже такой подход получит какое-то применение — всяко приятнее писать код на питоне, чем на C/C++, а с развитием tensorflow станет еще проще.

Видео:01.02. Модель SIR. Численное решение системы дифференциальных уравнений с помощью SciPyСкачать

01.02. Модель SIR. Численное решение системы дифференциальных уравнений с помощью SciPy

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

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

Вход РегистрацияDonate FAQ Правила Поиск

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

Видео:Лекция №1.1 Явная и неявная схемы для уравнения теплопроводностиСкачать

Лекция №1.1 Явная и неявная схемы для уравнения теплопроводности

Уравнение теплопроводности. Продольно-поперечная схема.

Решение уравнения теплопроводности в питоне

Последний раз редактировалось Pphantom 26.11.2017, 22:35, всего редактировалось 1 раз.

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

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

#
# 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

iPphantom:
Очень полезно пользоваться подсветкой кода, благо она есть. Поправил.
Решение уравнения теплопроводности в питоне
ewert
Заслуженный участник
Решение уравнения теплопроводности в питоне

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

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

Решение уравнения теплопроводности в питоне
worm2
Заслуженный участник
Решение уравнения теплопроводности в питоне

01/08/06
2884
Уфа

Последний раз редактировалось worm2 26.11.2017, 22:46, всего редактировалось 2 раз(а).

В код совершенно неохота вникать.
Но у вас должен выполняться «принцип максимума»: значение во внутренней точке на следующем временном слое является средним из значений на предыдущем (известных) и соседних значений (неизвестных). Что-то типа такого:
Решение уравнения теплопроводности в питонеРешение уравнения теплопроводности в питонегдеРешение уравнения теплопроводности в питонеи все эти коэффициенты положительны.
Надо проверить (отладочным кодом), выполняется ли этот принцип для коэффициентов уравнений (с учётом округлений, нужно проверять с какой-то погрешностью).
Если выполняется, то нужно смотреть уже код решения системы линейных уравнений, для тех внутренних точек, в которых «принцип максимума» нарушается, т.е. значения меньше минимума или больше максимума соседних (участвующих в одном уравнении) — значит для этих значений система решена неверно.
Если и тут всё нормально, то ещё остаётся последняя возможность, что решение начинает портиться с краёв, тогда отдельно на реализацию граничных условий надо обратить внимание.
Дальше я пас.

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

Решение уравнения теплопроводности в питоне
MJiri
Решение уравнения теплопроводности в питоне

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

📽️ Видео

Python для самых маленьких. Линейные уравнения. Решение задачСкачать

Python для самых маленьких. Линейные уравнения. Решение задач

Решение неоднородного уравнения теплопроводностиСкачать

Решение неоднородного уравнения теплопроводности

Решение ОДУ в PythonСкачать

Решение  ОДУ в Python

Алгоритмы. Нахождение корней уравнения методом хордСкачать

Алгоритмы. Нахождение корней уравнения методом хорд

Решение уравнения теплопроводности в одномерной постановке в Excel с применением неявной схемыСкачать

Решение уравнения теплопроводности в одномерной постановке в Excel с применением неявной схемы

48 Генераторы и итераторы. Выражения -генераторы в PythonСкачать

48 Генераторы и итераторы. Выражения  -генераторы в Python

Решение ОДУ 2 порядка в PythonСкачать

Решение  ОДУ  2 порядка  в Python

Решение задачи Коши для уравнения теплопроводности (Часть 1)Скачать

Решение задачи Коши для уравнения теплопроводности (Часть 1)

Замыкания в Python. Closure PythonСкачать

Замыкания в Python. Closure Python

44 Функция enumerate PythonСкачать

44 Функция enumerate Python

6-1. Уравнение теплопроводностиСкачать

6-1. Уравнение теплопроводности

Уравнение в частных производных Уравнение теплопроводностиСкачать

Уравнение в частных производных  Уравнение теплопроводности

Решение уравнения теплопроводности в одномерной постановке в ExcelСкачать

Решение уравнения теплопроводности в одномерной постановке в Excel
Поделиться или сохранить к себе: