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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заменив на нашу оценку , запишем функционал ошибки:

где — ошибка в узлах сетки.

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

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

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

Кратко о tensorflow

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

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

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

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

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

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

Запуск:

Результаты


Условие как и оригинальное, но без в уравнении:

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

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


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


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


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


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

Функция рисования 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 станет еще проще.

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

Я пытаюсь решить дифференциальное уравнение теплопроводности, используя алгоритм Томаса.

Физическая проблема: У нас есть штекер, температура на левой стороне 0 температура правой стороны 1 ,

Для алгоритма Томаса я написал функцию, которая принимает три QVector а также int значение суммы уравнений.

Моя проблема:
когда я компилирую и запускаю его, я получаю это:

Снова и снова в цикле.
Я понятия не имею, почему я получаю это.

Может быть, моя ошибка в назначении Tn результат моего Thomas-метода-функции?
или в реализации метода Томаса? или в граничных условиях?

Решение

Граничные условия должны действовать на векторы

так что T [0] должно быть 0, а T [N-1] должно быть 1. Мы можем сделать это следующим образом:

и благодаря этому T [0] всегда будет равно нулю, а T [N-1] будет равно 1;

И в статье, где я читал о методе Томаса, первым шагом было отрицание главной диагонали, я сделал это, но затем в конце функции я должен сделать обратное, так:

и мы можем использовать эту функцию снова, это не совсем оптимально, но работает стабильно.

Тогда весь код будет выглядеть так:

и на последнем шаге мы собираемся получить абсолютно «физические» результаты:

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

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

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

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

В этом разделе нельзя создавать новые темы.

Если Вы хотите задать новый вопрос, то не дописывайте его в существующую тему, а создайте новую в корневом разделе «Помогите решить/разобраться (М)».

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

Не ищите на этом форуме халяву , правила запрещают участникам публиковать готовые решения стандартных учебных задач. Автор вопроса обязан привести свои попытки решения и указать конкретные затруднения.

Обязательно просмотрите тему Правила данного раздела, иначе Ваша тема может быть удалена или перемещена в Карантин, а Вы так и не узнаете, почему.

Одномерное уравнение теплопроводности. Численное решение.

Доброго дня суток!

Хотелось бы подробно описать интересующую меня проблему и найти такой же подробный ответ на него. Некоторые вещи мне удалось понять самостоятельно благодаря большому количеству имеющейся в моем запасе литературы:

Теперь, непосредственно само задание(ссылка на скан листа, если что-то не понятно), которое я перепишу в формате

Здесь можно увидеть в самом верху, в рамке находится уравнение теплопроводности:
далее приводится рисунок, отображающий начальное условие системы при t=0:

Заранее оговаривается метод, с помощью которого мы будем численно решать это уравнение:
Сеточные методы на Эйлеровых схемах (явная схема).

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

Далее приводится 3 уравнения, назначение которых мне не совсем ясно, но имеются догадки:

Видимо, нужно еще варьировать коэффициент — коэффициент теплопроводности в зависимости от этой системы уравнений, описанной выше.

Суть всего этого задания — реализовать в виде приложения на языке Си/С++, которое показывает зависимость точности решения от шага интегрирования на примере этого самого уравнения теплопроводности , что не составляет труда, если задание понятно и чётко сформулировано. Однако мои текущие познания в области вычислительной математики довольно скудны, поэтому мне довольно проблематично связать текущие соотношения в единую систему.

Во-первых, нужно задать граничные условия для нашего уравнения теплопроводности(исходя из рисунка):
Допустим где (здесь подразумевается, что a и b — концы стержня)

Во-вторых, нужно ввести пространственно-временную сетку, которая будет представлять из себя матрицу, причем каждая строка её[матрицы] характеризует значения уравнения при каком-либо времени . (здесь поправьте меня, если я не правильно понял смысл всех этих сеток)

В-третьих, мы переписываем уравнение теплопроводности в виде разностной схемы: откуда мы можем найти при условии, что нам известно начальное распределение температуры на предыдущем временном слое(например на ).

В-четвертых, следует учитывать еще эти три уравнения, связанные с самим коэффициентом теплопроводности. Таким образом задача усложняется — требуется понять, каким именно образом следует организовать эту связь и как мы можем вообще их применить либо хотя бы выразить. Я предполагаю, что начальный коэффициент теплопроводности (та самая ) должен задаваться в начале, а затем уже выводятся и находятся остальные значения уравнений.

Возникает некоторое количество логичных вопросов:
1. На графике нарисован «стержень» — с равномерной начальной температурой по всей его длине. Что будет означать профиль графика в последующие моменты времени — нагрев окружающей среды и остужение самого стержня?
2. Достаточно ли я описал задачу(для описания её непосредственно в дискретной форме, в ЭВМ) и нет ли где «подводных» камней, либо неопределенности касаемо условий задачи?
3. Каким образом проще и понятнее ввести дополнительные условия для коэффициента теплопроводности(имеются в виду 3 вышеприведенных уравнения)?
4. Мелкие, но необходимые для целостной картины вопросы, описанные выше, в тексте.
5. Правильность моих рассуждений.

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


источники:

http://web-answers.ru/c/reshenie-uravnenija-teploprovodnosti-po-algoritmu.html

http://dxdy.ru/post385923.html