Привет, Хабр! Некоторое время назад увлекся глубоким обучением и стал потихоньку изучать tensorflow. Пока копался в tensorflow вспомнил про свою курсовую по параллельному программированию, которую делал в том году на 4 курсе университета. Задание там формулировалось так:
Линейная начально-краевая задача для двумерного уравнения теплопроводности:
![\frac{\partial u}{\partial t} = \sum \limits_{\alpha=1}^{2} \frac{\partial}{\partial x_\alpha} \left (k_\alpha \frac{\partial u}{\partial x_\alpha} \right ) -u, \quad x_\alpha \in [0,1] \quad (\alpha=1,2), \ t>0;][1]
![k_\alpha =
\begin{cases}
50, (x_1, x_2) \in \Delta ABC\\
1, (x_1, x_2) \notin \Delta ABC
\end{cases}][2]
![(\alpha = 1,2), \ A(0.2,0.5), \ B(0.7,0.2), \ C(0.5,0.8);][3]
![u(x_1, x_2, 0) = 0,\ u(0,x_2,t) = 1 - e^{-\omega t},\ u(1, x_2, t) = 0,][4]
![u(x_1,0,t) = 1 - e^{-\omega t},\ u(0, x_2, t) = 0,\ \omega = 20.][5]
Хотя правильнее было бы назвать это уравнением диффузии.
Задачу тогда требовалось решить методом конечных разностей по неявной схеме, используя MPI для распараллеливания и метод сопряженных градиентов.
Я не специалист в численных методах, пока не специалист в tensorflow, но опыт у меня уже появился. И я загорелся желанием попробовать вычислять урматы на фреймворке для глубокого обучения. Метод сопряженных градиентов реализовывать второй раз уже не интересно, зато интересно посмотреть как с вычислением справится tensorflow и какие сложности при этом возникнут. Этот пост про то, что из этого вышло.
[Читать дальше →][6]
[1]: //tex.s2cms.ru/svg/%0A%5Cfrac%7B%5Cpartial%20u%7D%7B%5Cpartial%20t%7D%20%3D%20%5Csum%20%5Climits_%7B%5Calpha%3D1%7D%5E%7B2%7D%20%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%20x_%5Calpha%7D%20%5Cleft%20(k_%5Calpha%20%5Cfrac%7B%5Cpartial%20u%7D%7B%5Cpartial%20x_%5Calpha%7D%20%5Cright%20)%20-u%2C%20%5Cquad%20x_%5Calpha%20%5Cin%20%5B0%2C1%5D%20%5Cquad%20(%5Calpha%3D1%2C2)%2C%20%5C%20t%3E0%3B%0A
[2]: //tex.s2cms.ru/svg/%0Ak_%5Calpha%20%3D%0A%5Cbegin%7Bcases%7D%0A%20%20%20%2050%2C%20(x_1%2C%20x_2)%20%5Cin%20%5CDelta%20ABC%5C%5C%0A%20%20%20%201%2C%20(x_1%2C%20x_2)%20%5Cnotin%20%5CDelta%20ABC%0A%5Cend%7Bcases%7D%0A
[3]: //tex.s2cms.ru/svg/%0A(%5Calpha%20%3D%201%2C2)%2C%20%5C%20A(0.2%2C0.5)%2C%20%5C%20B(0.7%2C0.2)%2C%20%5C%20C(0.5%2C0.8)%3B%0A
[4]: //tex.s2cms.ru/svg/%0Au(x_1%2C%20x_2%2C%200)%20%3D%200%2C%5C%20u(0%2Cx_2%2Ct)%20%3D%201%20-%20e%5E%7B-%5Comega%20t%7D%2C%5C%20%20u(1%2C%20x_2%2C%20t)%20%3D%200%2C%0A
[5]: //tex.s2cms.ru/svg/%0Au(x_1%2C0%2Ct)%20%3D%201%20-%20e%5E%7B-%5Comega%20t%7D%2C%5C%20u(0%2C%20x_2%2C%20t)%20%3D%200%2C%5C%20%20%5Comega%20%3D%2020.%0A
[6]:
https://habrahabr.ru/post/321734/?utm_source=habrahabr&utm_medium=rss&utm_campaign=feed_posts#habracut