.. _stap:
Jednodimenzioni direktni problem
==================================
Tanak štap od homogenog materijala je okružen izolacijom, tako da se promene temperature u štapu dešavaju samo kao posledica razmene toplote ka krajevima štapa i provođenja toplote duž štapa. Štap je jedinične dužine. Oba kraja su izložena mešavini vode i leda temperature 0. Početna temperatura na rastojanju :math:`x` od levog kraja štapa je :math:`sin{(\pi x)}`, kao što se vidi na :numref:`fdheat`.
.. _fdheat:
.. figure:: fdheat.png
:width: 80%
Eksperimentalna postavka problema provođenja toplote duž štapa. Na krajevima štapa nalazi se mešavina vode i leda. Štap je izolovan od uticaja spoljašnje sredine.
Radi poređenja, pokazaćemo sada kako se ovaj relativno jednostavan problem formuliše pomoću klasične metode konačnih razlika, a zatim ćemo rešiti direktni i inverzni problem opisane postavke NMPFZ metodom.
Rešavanje metodom konačnih razlika (MKR)
-----------------------------------------
Parcijalna diferencijalna jednačina :math:numref:`eq:toplota1` modeluje temperaturu u bilo kojoj tački štapa u bilo kom vremenskom trenutku prema :cite:t:`recktenwald2004finite`. Ova jednačina se rešava metodom konačnih razlika, koja daje aproksimaciju rešenja za raspored temperature, primenjujući prostornu i vremensku diskretizaciju. Programska implementacija rešenja čuva temperaturu svake tačke diskretizacije u dvodimenzionoj matrici. Svaki red sadrži temperaturnu distribuciju štapa u nekom trenutku vremena. Štap je podeljen na :math:`n` delova dužine :math:`h`, pa stoga svaki red ima :math:`n+1` elemenata. Načelno, što je veće :math:`n`, manja je greška aproksimacije. Vreme od 0 do :math:`T` je podeljeno u :math:`m` diskretnih intervala dužine :math:`k`, pa stoga matrica ima :math:`m+1` redova, kao što je prikazano na :numref:`fdheat2`.
.. _fdheat1:
.. figure:: fdheat1.png
:width: 80%
Kako vreme teče, štap se hladi. Metoda konačnih razlika omogućava izračunavanje temperature u fiksnom broju tačaka u ravnomernim vremenskim intervalima. Smanjenje prostornog i vremenskog koraka uglavnom dovodi do preciznijeg rešenja.
.. _fdheat2:
.. figure:: fdheat2.png
:width: 60%
Diskretizacija jednačine provođenja toplote metodom konačnih razlika
Svaka tačka :math:`u_{i,j}` predstavlja element matrice koji sadrži temperaturu na poziciji :math:`i \cdot h`, u trenutku :math:`j \cdot k`. Na krajevima štapa je temperatura uvek nula. U početnom trenutku, temperatura u tački :math:`x` je, kao što je već rečeno, :math:`sin{(\pi x)}`. Algoritam ide korak po korak kroz vreme, koristi vrednosti iz trenutka :math:`j` da bi izračunao vrednosti u trenutku :math:`j+1`. Formula koja reprezentuje varijantu aproksimacije FTCS (*Forward Time Centered Space*) kao u :cite:t:`recktenwald2004finite` se ovde daje bez izvođenja i glasi:
.. 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},
gde je
.. math::
R = \alpha \frac{k}{h^2}.
Celokupna analiza različitih eksplicitnih i implicitnih metoda data je u pomenutoj referenci, a ključni deo koda u programskom jeziku Pajton implementiran je na sledeći način:
.. 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))
# Početni uslov
U[:, 0] = np.sin(np.pi * x / L)
# Glavna petlja za MKR
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]
# Egzaktno rešenje za poređenje
ue = np.sin(np.pi * x / L) * \
np.exp(-t[nt - 1] * alpha * (np.pi / L) * (np.pi / L))
Kao što detaljno objašnjava :cite:t:`recktenwald2004finite`, ako se MKR petlja formuliše eksplicitno kao što je to slučaj kod FTCS tehnike, mora se pažljivo izabrati vremenski i prostorni korak, kako bi numerička propagacija bila "brža" od fizičke. Rešenje koje se dobija pomoću MKR šeme se može videti na :numref:`ftcs`.
.. _ftcs:
.. figure:: ftcs.png
:width: 60%
Rešenje koje se dobija MKR metodom koristeći eksplicitnu FTCS tehniku u trenutku :math:`t=0.1s`
Ovaj problem ima i analitičko rešenje, pa je pogodan za testiranje različitih numeričkih metoda. To rešenje glasi:
.. math::
:label: eq:analiticko1
u(x,t) = \sin\left(\frac{\pi x}{L}\right) \cdot e^{-\frac{\alpha\pi^2}{L^2}t}.
ili u našem slučaju, kada je :math:`L=1`:
.. math::
u(x,t) = \sin(\pi x) \cdot e^{-\alpha \pi^2 t}.
Eksplicitne tehnike poput FTCS ne garantuju konzistentnost rešenja koju garantuju implicitne tehnike kao što je BTCS (*Backward Time Centered Space*). MKR je ustaljeni pristup koji za većinu pravilno definisanih prostornih domena radi veoma dobro. Za ovako jednostavnu postavku kao što je jednodimenziono provođenje toplote i kada su svi parametri problema poznati (ovde je to :math:`\alpha`), MKR je često optimalna metoda. Međutim, kod većine problema iz prakse to nije slučaj. Hajde da razmotrimo kako da ovaj problem rešimo koristeći NMPFZ i direktno uporedimo sa MKR.
Rešavanje pomoću NMPFZ
------------------------
Rešenje jednačine :numref:`fdheat` sa već postavljenim graničnim i početnim uslovima:
.. math::
:label: eq:granicni1
u(x=0,t)=u(x=1,t)=0, \, \forall t \\
u(x,t=0) = sin{(\pi x)}
potražićemo pomoću NMPFZ pristupa. Iako je moguće da metode implementiramo direktno kao :cite:t:`raissi2019physics` koristeći okvir za duboko učenje kao što je `Tensorflow `_, ipak ćemo iskoristiti pomoć biblioteka koje dodatno apstrahuju NMPFZ entitete i omogućavaju korisniku da se fokusira na problem koji rešava. Ovaj primer rešićemo koristeći biblioteku `SCIANN `_ autora :cite:t:`haghighat2021sciann`. Postupak rešavanja objasnićemo direktno kroz programski kod:
.. code-block:: python
:caption: NMPFZ - provođenje toplote
: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])
Varijable :math:`x` i :math:`t` se na početku definišu na propisani način. Osnovni pojam koji se koristi u SCIANN biblioteci za apstrakciju NMPFZ je funkcional, koji je ovde označen sa :math:`u`, koji kao ulaz uzima :math:`x` i :math:`t`, ima 3 skrivena sloja sa po 20 neurona i kao aktivaciju svih tih neurona uzima funkciju hiperboličkog tangensa. Prvi sabirak kompozitne funkcije gubitka proizilazi iz same diferencijalne jednačine :math:numref:`eq:toplota1`. Kao što se vidi, za diferenciranje se koristi specijalni operator ``diff()`` iz biblioteke:
.. code-block:: python
L1 = diff(u, t) - alpha * diff(u, x, order=2)
Najzanimljiviji i ne baš tako očigledan je način definisanja početnog uslova ``C1`` i graničnih uslova ``C2`` i ``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)
Ovde je ``C1`` jednak nuli u svim tačkama uzorkovanja osim za :math:`t \le TOLT`. Tolerancije *TOLX* i *TOLT* su postavljene tako da "hvataju" prvu/poslednju vrstu ili kolonu kolokacionih tačaka, u zavisnosti šta je potrebno. Umesto funkcije znaka ``sign()``, mogu se koristiti i glatkije funkcije, kao što je hiperbolički tangens. NMPFZ model se formira pomoću ``SciModel`` konstruktora koji definiše i tip funkcije gubitka i algoritam optimizacije, tj. obučavanja:
.. code-block:: python
m = sn.SciModel([x, t], [L1, C1, C2, C3], 'mse', 'Adam')
Obučavanje modela se pokreće metodom ``train()``, pri čemu se navode sledeći parametri:
#. **Skup kolokacionih tačaka za treniranje**. Ovde je to pravilna ekvidistantna mreža tačaka po obe varijable. Horizontala je prostor, a vertikala vreme.
#. **Početne vrednosti komponenti funkcije gubitka**. Uobičajeno je da se na početku postave na nule.
#. **Stopa učenja**,
#. **Veličina batch-a**. Treba imati na umu da ako je broj tačaka domena u kojima se nameću granični uslovi značajno manji u odnosu na ukupan broj kolokacionih tačaka, parametar optimizacije ``batch_size`` treba da bude podešen na veliki broj koji garantuje doslednu optimizaciju mini *batch*-a. U suprotnom, može da se desi da neki mini *batch*-evi ne dobiju nijednu kolokacionu tačku koja pripada graničnim uslovima i stoga ne generišu tačan gradijent za ažuriranje metodom gradijentnog spusta.
#. **Broj epoha**.
.. _loss1:
.. figure:: loss1.png
:width: 80%
Istorija obuke jednodimenzionog modela provođenja toplote.
Tok obuke možemo da ispratimo kroz standardne *Tensorflow* objekte, kao što je ``h.history['loss']``, kao što se vidi na :numref:`loss1`. Pošto se završi obuka NMPFZ-a, možemo formirati testni skup tačaka slično kao što smo to učinili i sa kolokacionim tačkama i proveriti rezultate predikcije pozivom metode ``eval()`` na objektu istreniranog modela. Rezultat polja temperature duž štapa u trenutku :math:`t=0,1` i njegovo poređenje sa analitičkim rešenjem vidi se na :numref:`heat1`.
.. _heat1:
.. figure:: heat-pinn1.png
:width: 80%
Polje temperature duž štapa u trenutku :math:`t=0,1` dobijeno metodom NMPFZ.
Čisto praktično gledano, **NMPFZ rešenje jednostavnog direktnog problema kao što je ovaj i ne pruža nikakve posebne prednosti u odnosu na klasičnu MKR metodu**. Prvo, rešavanje duže traje i zahteva upošljavanje više računarskih resursa i zavisnosti u vidu dodatnih biblioteka za tenzorski račun. Dalje, specifikacija početnih i graničnih uslova kod NMPFZ ima svoje specifičnosti. Treće, neophodno je metodom probe i greške podesiti hiper-parametre modela, kao što su: broj skrivenih slojeva, broj neurona po sloju, aktivaciona funkcija, brzina učenja (*Learning Rate*) itd. Od izbora hiper-parametara konvergencija rešenja može značajno da zavisi.
Sa druge strane, za razliku od MKR i MKE (*Metoda Konačnih Elemenata*), NMPFZ nam dozvoljava da problem definišemo čistim diferencijalnim jednačinama i proizvoljnim graničnim uslovima (Dirihleovi, Nojmanovi, periodični, skup tačaka). **Nema potrebe za specificiranjem algebarske veze između čvorova** (tj. kolokacionih tačaka u NMPFZ) i rešavanjem tako postavljenog sistema jednačina. Zahvaljujući ovoj činjenici, bilo koja nova fizika u vidu novog graničnog uslova ili promena u samoj diferencijalnoj jednačini može da se izvede veoma lako, omogućavajući brzu proveru hipoteza i izradu prototipova.
Drugo, dok sve klasične metode proračun moraju da izvedu kroz vremenske korake (*time stepping*), **NMPFZ omogućava brzu inferenciju** na već obučenoj mreži za bilo koji vremenski trenutak :math:`t` postavljen na ulazu mreže. Za neke primene u realnom vremenu gde je brzina od ključnog značaja, ovo može da bude presudno.
Treće, NMPFZ metodološki ne razlikuje **direktne probleme** (u kojima se rešava poznata diferencijalna jednačina) od **inverznih problema**, kod kojih su neki od parametara nepoznati, ali postoje dodatni uslovi iz kojih se nepoznati parametri mogu dobiti procesom treninga. U narednoj temi :ref:`stap_inverzni` demonstriraćemo jedan takav problem.