.. _stap:
Једнодимензиони директни проблем
==================================
Танак штап од хомогеног материјала је окружен изолацијом, тако да се промене температуре у штапу дешавају само као последица размене топлоте ка крајевима штапа и провођења топлоте дуж штапа. Штап је јединичне дужине. Оба краја су изложена мешавини воде и леда температуре 0. Почетна температура на растојању :math:`x` од левог краја штапа је :math:`sin{(\pi x)}`, као што се види на :numref:`fdheat`.
.. _fdheat:
.. figure:: fdheat.png
:width: 80%
Експериментална поставка проблема провођења топлоте дуж штапа. На крајевима штапа налази се мешавина воде и леда. Штап је изолован од утицаја спољашње средине.
Ради поређења, показаћемо сада како се овај релативно једноставан проблем формулише помоћу класичне методе коначних разлика, а затим ћемо решити директни и инверзни проблем описане поставке НМПФЗ методом.
Решавање методом коначних разлика (МКР)
-----------------------------------------
Парцијална диференцијална једначина :math:numref:`eq:toplota1` моделује температуру у било којој тачки штапа у било ком временском тренутку према :cite:t:`recktenwald2004finite`. Ова једначина се решава методом коначних разлика, која даје апроксимацију решења за распоред температуре, примењујући просторну и временску дискретизацију. Програмска имплементација решења чува температуру сваке тачке дискретизације у дводимензионој матрици. Сваки ред садржи температурну дистрибуцију штапа у неком тренутку времена. Штап је подељен на :math:`n` делова дужине :math:`h`, па стога сваки ред има :math:`n+1` елемената. Начелно, што је веће :math:`n`, мања је грешка апроксимације. Време од 0 до :math:`T` је подељено у :math:`m` дискретних интервала дужине :math:`k`, па стога матрица има :math:`m+1` редова, као што је приказано на :numref:`fdheat2`.
.. _fdheat1:
.. figure:: fdheat1.png
:width: 80%
Како време тече, штап се хлади. Метода коначних разлика омогућава израчунавање температуре у фиксном броју тачака у равномерним временским интервалима. Смањење просторног и временског корака углавном доводи до прецизнијег решења.
.. _fdheat2:
.. figure:: fdheat2.png
:width: 60%
Дискретизација једначине провођења топлоте методом коначних разлика
Свака тачка :math:`u_{i,j}` представља елемент матрице који садржи температуру на позицији :math:`i \cdot h`, у тренутку :math:`j \cdot k`. На крајевима штапа је температура увек нула. У почетном тренутку, температура у тачки :math:`x` је, као што је већ речено, :math:`sin{(\pi x)}`. Алгоритам иде корак по корак кроз време, користи вредности из тренутка :math:`j` да би израчунао вредности у тренутку :math:`j+1`. Формула која репрезентује варијанту апроксимације FTCS (*Forward Time Centered Space*) као у :cite:t:`recktenwald2004finite` се овде даје без извођења и гласи:
.. math::
:label: eq:diskretna
u_{i,j+1} = R \cdot u_{i-1,j}+(1-2R) \cdot u_{i,j} + R \cdot u_{i+1,j},
где је
.. math::
R = \alpha \frac{k}{h^2}.
Целокупна анализа различитих експлицитних и имплицитних метода дата је у поменутој референци, а кључни део кода у програмском језику Пајтон имплементиран је на следећи начин:
.. code-block:: python
:linenos:
def heatFTCS(nt=10, nx=20, alpha=0.3, L=1, tmax=0.1):
h = L / (nx - 1)
k = tmax / (nt - 1)
r = alpha * k / h**2
x = np.linspace(0, L, nx)
t = np.linspace(0, tmax, nt)
U = np.zeros((nx, nt))
# Почетни услов
U[:, 0] = np.sin(np.pi * x / L)
# Главна петља за МКР
for m in range(1, nt):
for i in range(1, nx-1):
U[i, m] = r * U[i - 1, m - 1] + (1-2*r) * U[i, m-1] + r * U[i+1, m-1]
# Егзактно решење за поређење
ue = np.sin(np.pi * x / L) * \
np.exp(-t[nt - 1] * alpha * (np.pi / L) * (np.pi / L))
Као што детаљно објашњава :cite:t:`recktenwald2004finite`, ако се МКР петља формулише експлицитно као што је то случај код FTCS технике, мора се пажљиво изабрати временски и просторни корак, како би нумеричка пропагација била "бржа" од физичке. Решење које се добија помоћу МКР шеме се може видети на :numref:`ftcs`.
.. _ftcs:
.. figure:: ftcs.png
:width: 60%
Решење које се добија МКР методом користећи експлицитну FTCS технику у тренутку :math:`t=0.1s`
Овај проблем има и аналитичко решење, па је погодан за тестирање различитих нумеричких метода. То решење гласи:
.. math::
:label: eq:analiticko1
u(x,t) = \sin\left(\frac{\pi x}{L}\right) \cdot e^{-\frac{\alpha\pi^2}{L^2}t}.
или у нашем случају, када је :math:`L=1`:
.. math::
u(x,t) = \sin(\pi x) \cdot e^{-\alpha \pi^2 t}.
Експлицитне технике попут FTCS не гарантују конзистентност решења коју гарантују имплицитне технике као што је BTCS (*Backward Time Centered Space*). МКР је устаљени приступ који за већину правилно дефинисаних просторних домена ради веома добро. За овако једноставну поставку као што је једнодимензионо провођење топлоте и када су сви параметри проблема познати (овде је то :math:`\alpha`), МКР је често оптимална метода. Међутим, код већине проблема из праксе то није случај. Хајде да размотримо како да овај проблем решимо користећи НМПФЗ и директно упоредимо са МКР.
Решавање помоћу НМПФЗ
------------------------
Решење једначине :numref:`fdheat` са већ постављеним граничним и почетним условима:
.. math::
:label: eq:granicni1
u(x=0,t)=u(x=1,t)=0, \, \forall t \\
u(x,t=0) = sin{(\pi x)}
потражићемо помоћу НМПФЗ приступа. Иако је могуће да методе имплементирамо директно као :cite:t:`raissi2019physics` користећи оквир за дубоко учење као што је `Tensorflow `_, ипак ћемо искористити помоћ библиотека које додатно апстрахују НМПФЗ ентитете и омогућавају кориснику да се фокусира на проблем који решава. Овај пример решићемо користећи библиотеку `SCIANN `_ аутора :cite:t:`haghighat2021sciann`. Поступак решавања објаснићемо директно кроз програмски код:
.. code-block:: python
:caption: НМПФЗ - провођење топлоте
:linenos:
import numpy as np
import sciann as sn
from sciann.utils.math import diff, sign, sin, sqrt, exp
from numpy import pi
x = sn.Variable('x')
t = sn.Variable('t')
u = sn.Functional('u', [x,t], 3*[20], 'tanh')
alpha = 0.3
L1 = diff(u, t) - alpha * diff(u, x, order=2)
TOLX = 0.011
TOLT = 0.0011
C1 = (1-sign(t - TOLT)) * (u - sin(pi*x))
C2 = (1-sign(x - (0+TOLX))) * (u)
C3 = (1+sign(x - (1-TOLX))) * (u)
m = sn.SciModel([x, t], [L1, C1, C2, C3], 'mse', 'Adam')
x_data, t_data = np.meshgrid(
np.linspace(0, 1, 101),
np.linspace(0, 0.1, 101)
)
h = m.train([x_data, t_data], 4*['zero'], learning_rate=0.002, batch_size=256, epochs=500)
# Test
nx, nt = 20, 10
x_test, t_test = np.meshgrid(
np.linspace(0.01, 0.99, nx+1),
np.linspace(0.01, 0.1, nt+1)
)
u_pred = u.eval(m, [x_test, t_test])
Варијабле :math:`x` и :math:`t` се на почетку дефинишу на прописани начин. Основни појам који се користи у SCIANN библиотеци за апстракцију НМПФЗ је функционал, који је овде означен са :math:`u`, који као улаз узима :math:`x` и :math:`t`, има 3 скривена слоја са по 20 неурона и као активацију свих тих неурона узима функцију хиперболичког тангенса. Први сабирак композитне функције губитка произилази из саме диференцијалне једначине :math:numref:`eq:toplota1`. Као што се види, за диференцирање се користи специјални оператор ``diff()`` из библиотеке:
.. code-block:: python
L1 = diff(u, t) - alpha * diff(u, x, order=2)
Најзанимљивији и не баш тако очигледан је начин дефинисања почетног услова ``C1`` и граничних услова ``C2`` и ``C3``:
.. code-block:: python
C1 = (1-sign(t - TOLT)) * (u - sin(pi*x))
C2 = (1-sign(x - (0+TOLX))) * (u)
C3 = (1+sign(x - (1-TOLX))) * (u)
Овде је ``C1`` једнак нули у свим тачкама узорковања осим за :math:`t \le TOLT`. Толеранције *TOLX* и *TOLT* су постављене тако да "хватају" прву/последњу врсту или колону колокационих тачака, у зависности шта је потребно. Уместо функције знака ``sign()``, могу се користити и глаткије функције, као што је хиперболички тангенс. НМПФЗ модел се формира помоћу ``SciModel`` конструктора који дефинише и тип функције губитка и алгоритам оптимизације, тј. обучавања:
.. code-block:: python
m = sn.SciModel([x, t], [L1, C1, C2, C3], 'mse', 'Adam')
Обучавање модела се покреће методом ``train()``, при чему се наводе следећи параметри:
#. **Скуп колокационих тачака за тренирање**. Овде је то правилна еквидистантна мрежа тачака по обе варијабле. Хоризонтала је простор, а вертикала време.
#. **Почетне вредности компоненти функције губитка**. Уобичајено је да се на почетку поставе на нуле.
#. **Стопа учења**,
#. **Величина batch-a**. Треба имати на уму да ако је број тачака домена у којима се намећу гранични услови значајно мањи у односу на укупан број колокационих тачака, параметар оптимизације ``batch_size`` треба да буде подешен на велики број који гарантује доследну оптимизацију мини *batch*-a. У супротном, може да се деси да неки мини *batch*-еви не добију ниједну колокациону тачку која припада граничним условима и стога не генеришу тачан градијент за ажурирање методом градијентног спуста.
#. **Број епоха**.
.. _loss1:
.. figure:: loss1.png
:width: 80%
Историја обуке једнодимензионог модела провођења топлоте.
Ток обуке можемо да испратимо кроз стандардне *Tensorflow* објекте, као што је ``h.history['loss']``, као што се види на :numref:`loss1`. Пошто се заврши обука НМПФЗ-а, можемо формирати тестни скуп тачака слично као што смо то учинили и са колокационим тачкама и проверити резултате предикције позивом методе ``eval()`` на објекту истренираног модела. Резултат поља температуре дуж штапа у тренутку :math:`t=0,1` и његово поређење са аналитичким решењем види се на :numref:`heat1`.
.. _heat1:
.. figure:: heat-pinn1.png
:width: 80%
Поље температуре дуж штапа у тренутку :math:`t=0,1` добијено методом НМПФЗ.
Чисто практично гледано, **НМПФЗ решење једноставног директног проблема као што је овај и не пружа никакве посебне предности у односу на класичну МКР методу**. Прво, решавање дуже траје и захтева упошљавање више рачунарских ресурса и зависности у виду додатних библиотека за тензорски рачун. Даље, спецификација почетних и граничних услова код НМПФЗ има своје специфичности. Треће, неопходно је методом пробе и грешке подесити хипер-параметре модела, као што су: број скривених слојева, број неурона по слоју, активациона функција, брзина учења (*Learning Rate*) итд. Од избора хипер-параметара конвергенција решења може значајно да зависи.
Са друге стране, за разлику од МКР и МКЕ (*Метода Коначних Елемената*), НМПФЗ нам дозвољава да проблем дефинишемо чистим диференцијалним једначинама и произвољним граничним условима (Дирихлеови, Нојманови, периодични, скуп тачака). **Нема потребе за специфицирањем алгебарске везе између чворова** (тј. колокационих тачака у НМПФЗ) и решавањем тако постављеног система једначина. Захваљујући овој чињеници, било која нова физика у виду новог граничног услова или промена у самој диференцијалној једначини може да се изведе веома лако, омогућавајући брзу проверу хипотеза и израду прототипова.
Друго, док све класичне методе прорачун морају да изведу кроз временске кораке (*time stepping*), **НМПФЗ омогућава брзу инференцију** на већ обученој мрежи за било који временски тренутак :math:`t` постављен на улазу мреже. За неке примене у реалном времену где је брзина од кључног значаја, ово може да буде пресудно.
Треће, НМПФЗ методолошки не разликује **директне проблеме** (у којима се решава позната диференцијална једначина) од **инверзних проблема**, код којих су неки од параметара непознати, али постоје додатни услови из којих се непознати параметри могу добити процесом тренинга. У наредној теми :ref:`stap_inverzni` демонстрираћемо један такав проблем.