%%html
<style type="text/css">
input.good:checked + label {color: green}
input.bad:checked + label {color: red}
input.good:checked + label::after {color: green; content: ' Õige vastus!'}
input.bad:checked + label::after {color: red; content: ' Vale vastus!'}
</style>
Käesolev tööleht näitab kuidas määrata üldise $N$-mõõtmelise lineaarse süsteemi püsipunkti stabiilsust, ja kuidas lahendada liikumisvõrrandeid, et leida süsteemi trajektoore.
Üldisel lineaarsel süsteemil $\underline{\dot{x}} = \underline{\underline{M}} \cdot \underline{x}$ on alati püsipunkt $\underline{x} = (0, \ldots, 0)$. Püsipunkti stabiilsus sõltub maatriksi $\underline{\underline{M}}$ omaväärtustest, täpsemalt nende reaalosadest. Lineaarse süsteemi püsipunkti stabiilsuse määramisel kehtivad sellised reeglid:
Kui kõikide omaväärtuste reaalosad on nullist erinevad, siis nimetatakse püsipunkti hüperboolseks.
Lineaarse dünaamilise süsteemi lahendeid saab leida maatriksi eksponendi abil. Kui algtingimus on $\underline{x}(0) = \underline{x}_0$, siis on algtingimusele vastav lahend
$$\underline{x}(t) = e^{\underline{\underline{M}}t} \cdot \underline{x}_0$$Maatriksi eksponent on defineeritud Taylori reana:
$$e^{\underline{\underline{M}}t} = \sum_{k = 0}^{\infty}\frac{(\underline{\underline{M}}t)^k}{k!}$$Eksponendi saab kõige paremini arvutada baasil, milles maatriks $\underline{\underline{M}}$ on Jordani normaalkujul.
Igat maatriksit $\underline{\underline{M}}$ võib viia Jordani normaalkujju lineaarse teisenduse abil, see tähendab et on olemas (mitteunikaalne) pööratav maatriks $\underline{\underline{P}}$ nii, et kehtib $\underline{\underline{M}} = \underline{\underline{P}} \cdot \underline{\underline{J}} \cdot \underline{\underline{P}}^{-1}$, ja $\underline{\underline{J}}$ on kujul
$$\underline{\underline{J}} = \begin{pmatrix} \lambda_1 & 1 & & & & & & & & & & & \\ & \ddots & \ddots & & & & & & & & & & \\ & & \ddots & 1 & & & & & & & & & \\ & & & \lambda_1 & & & & & & & & & \\ & & & & \lambda_2 & 1 & & & & & & & \\ & & & & & \ddots & \ddots & & & & & & \\ & & & & & & \ddots & 1 & & & & & \\ & & & & & & & \lambda_2 & & & & & \\ & & & & & & & & \ddots & & & & & \\ & & & & & & & & & \lambda_k & 1 & & \\ & & & & & & & & & & \ddots & \ddots & \\ & & & & & & & & & & & \ddots & 1 \\ & & & & & & & & & & & & \lambda_k \\ \end{pmatrix}.$$Siin $\lambda_1, \ldots, \lambda_k$ on maatriksi $\underline{\underline{M}}$ omaväärtused. Jordani normaalkuju koosneb plokidest
$$\underline{\underline{J}}_i = \begin{pmatrix} \lambda_i & 1 & & \\ & \ddots & \ddots & \\ & & \ddots & 1 \\ & & & \lambda_i \end{pmatrix},$$mille suurus vastab omaväärtuse $\lambda_i$ kordsusele. Jordani maatriksi eksponent on samuti plokikujuline, ja iga plokk on vastava Jordani ploki eksponent. Selle eksponendi leidmiseks kirjutame Jordani ploki kujul $\underline{\underline{J}}_i = \underline{\underline{D}}_i + \underline{\underline{N}}_i$, kus
$$\underline{\underline{D}}_i = \begin{pmatrix} \lambda_i & & \\ & \ddots & \\ & & \lambda_i \end{pmatrix}, \quad \underline{\underline{N}}_i = \begin{pmatrix} 0 & 1 & & \\ & \ddots & \ddots & \\ & & \ddots & 1 \\ & & & 0 \end{pmatrix}.$$Kuna need maatriksid kommuteeruvad, $\underline{\underline{D}}_i\underline{\underline{N}}_i = \underline{\underline{N}}_i\underline{\underline{D}}_i$, kehtib valem
$$e^{(\underline{\underline{D}}_i + \underline{\underline{N}}_i)t} = e^{\underline{\underline{D}}_it}e^{\underline{\underline{N}}_it}.$$Nende maatriksi eksponendid on antud valemitega
$$e^{\underline{\underline{D}}_it} = \begin{pmatrix} e^{\lambda_it} & & \\ & \ddots & \\ & & e^{\lambda_it} \end{pmatrix}, \quad e^{\underline{\underline{N}}_it} = \begin{pmatrix} 1 & t & \cdots & \frac{t^{p_i - 1}}{(p_i - 1)!}\\ & \ddots & \ddots & \vdots \\ & & \ddots & t \\ & & & 1 \end{pmatrix},$$kus $p_i$ on Jordani ploki $\underline{\underline{J}}_i$ suurus. Sellest järeldub, et Jordani maatriksi eksponendi kohta kehtib valem
$$e^{\underline{\underline{J}}t} = \begin{pmatrix} e^{\lambda_1t} & e^{\lambda_1t}t & \cdots & \frac{e^{\lambda_1t}t^{p_1 - 1}}{(p_1 - 1)!} & & & & & & & & & \\ & \ddots & \ddots & \vdots & & & & & & & & & \\ & & \ddots & e^{\lambda_1t}t & & & & & & & & & \\ & & & e^{\lambda_1t} & & & & & & & & & \\ & & & & e^{\lambda_2} & e^{\lambda_2}t & \cdots & \frac{e^{\lambda_2t}t^{p_2 - 1}}{(p_2 - 1)!} & & & & & \\ & & & & & \ddots & \ddots & \vdots & & & & & \\ & & & & & & \ddots & e^{\lambda_2}t & & & & & \\ & & & & & & & e^{\lambda_2} & & & & & \\ & & & & & & & & \ddots & & & & & \\ & & & & & & & & & e^{\lambda_k} & e^{\lambda_k}t & \cdots & \frac{e^{\lambda_kt}t^{p_k - 1}}{(p_k - 1)!} \\ & & & & & & & & & & \ddots & \ddots & \vdots \\ & & & & & & & & & & & \ddots & e^{\lambda_k}t \\ & & & & & & & & & & & & e^{\lambda_k} \\ \end{pmatrix}.$$Lõpuks leiame, et maatriksi $\underline{\underline{M}}$ on
$$\begin{split} e^{\underline{\underline{M}}t} &= \sum_{j = 0}^{\infty}\frac{(\underline{\underline{M}}t)^j}{j!}\\ &= \sum_{j = 0}^{\infty}\frac{(\underline{\underline{P}} \cdot \underline{\underline{J}} \cdot \underline{\underline{P}}^{-1}t)^j}{j!}\\ &= \sum_{j = 0}^{\infty}\underline{\underline{P}} \cdot \frac{(\underline{\underline{J}}t)^j}{j!} \cdot \underline{\underline{P}}^{-1}\\ &= \underline{\underline{P}} \cdot \left(\sum_{j = 0}^{\infty}\frac{(\underline{\underline{J}}t)^j}{j!}\right) \cdot \underline{\underline{P}}^{-1}\\ &=\underline{\underline{P}} \cdot e^{\underline{\underline{J}}t} \cdot \underline{\underline{P}}^{-1}. \end{split}$$Järgmisena rakendame oma teadmisi praktikale. Alljärgnev kood näitab, kuidas saab maatriksi eksponendi leida SymPy abil, ja sellega ka lineaarse süsteemi trajektoore leida. Kõigepealt on meil selleks SymPy paketti vaja.
import sympy as sp
from sympy.interactive.printing import init_printing
init_printing(use_unicode=True)
Siis defineerime sümboleid: aega tähistame $t$-ga, ja algtingimus on $(x_{10}, x_{20}, x_{30})$.
t = sp.symbols('t', real=True)
x0 = sp.Matrix(3, 1, sp.symbols('x_10 x_20 x_30', real=True))
Esimene näide on süsteem, mida kirjeldab dünaamika
$$\begin{pmatrix} \dot{x}_1\\ \dot{x}_2\\ \dot{x}_3 \end{pmatrix} = \begin{pmatrix} 1 & -\frac{2}{3} & 0\\ 2 & 3 & 1\\ 0 & -\frac{2}{3} & 1\\ \end{pmatrix} \cdot \begin{pmatrix} x_1\\ x_2\\ x_3 \end{pmatrix}.$$Maatriks $\underline{\underline{M}}$ on seega selline:
M = sp.Matrix([[1, -sp.Rational(2, 3), 0], [2, 3, 1], [0, -sp.Rational(2, 3), 1]])
M
Vaatame, millised on maatriksi omaväärtused.
ev = M.eigenvals()
ev
Maatriksil on üks reaalne omaväärtus $\lambda_1 = 1$ ja kaaskompleksne paar $\lambda_{2,3} = 2 \pm i$. Reaalosad on positiivsed, seega on püsipunkt $(0, 0, 0)$ repeller. Iga omaväärtuse kordsus on 1, seega kaasneb iga omaväärtusega üks omavektor.
[(M - y * sp.eye(3)).nullspace()[0].applyfunc(sp.nsimplify) for y in ev]
Omavektorid moodustavad teisendusmaatriksi $\underline{\underline{P}}$.
P, jc = M.jordan_cells()
P = P.applyfunc(sp.nsimplify)
P
Selle abil leiame ka Jordani normaalkuju $\underline{\underline{J}}$.
J = (P.inv() * M * P).applyfunc(sp.nsimplify)
J
Nüüd on ka lihtne leida selle maatriksi eksponenti $e^{\underline{\underline{J}}t}$.
eJ = (t * J).exp()
eJ
Lõpuks kasutame lineaarset teisendust, et leida maatriksi eksponenti $e^{\underline{\underline{M}}t}$.
eM = (P * eJ * P.inv()).applyfunc(lambda y: sp.expand(sp.expand_trig(sp.simplify(sp.simplify(y).as_real_imag()[0]))))
eM
Algtingimusele $(x_{10}, x_{20}, x_{30})$ vastav lahend on siis selline.
x = (eM * x0).applyfunc(sp.simplify)
x
Igaks juhuks kontrollime, kas dünaamiline võrrand an rahuldatud.
(x.applyfunc(lambda y: sp.diff(y, t)) - M * x).applyfunc(sp.simplify)
Teine näide on süsteem, mida kirjeldab dünaamika
$$\begin{pmatrix} \dot{x}_1\\ \dot{x}_2\\ \dot{x}_3 \end{pmatrix} = \begin{pmatrix} 1 & 2 & 0\\ 1 & 1 & 2\\ 0 & -1 & 1\\ \end{pmatrix} \cdot \begin{pmatrix} x_1\\ x_2\\ x_3 \end{pmatrix}.$$Maatriks $\underline{\underline{M}}$ on seega selline:
M = sp.Matrix([[1, 2, 0], [1, 1, 2], [0, -1, 1]])
M
Vaatame, millised on maatriksi omaväärtused.
ev = M.eigenvals()
ev
Maatriksil on üks reaalne omaväärtus $\lambda_1 = 1$, mille kordsus on 3. Reaalosa on positiivne, seega on püsipunkt $(0, 0, 0)$ repeller. Sellega kaasneb üks omavektor.
[(M - y * sp.eye(3)).nullspace()[0].applyfunc(sp.nsimplify) for y in ev]
Omavektor ja üldistatud omavektorid moodustavad teisendusmaatriksi $\underline{\underline{P}}$.
P, jc = M.jordan_cells()
P = P.applyfunc(sp.nsimplify)
P
Selle abil leiame ka Jordani normaalkuju $\underline{\underline{J}}$.
J = (P.inv() * M * P).applyfunc(sp.nsimplify)
J
Nüüd on ka lihtne leida selle maatriksi eksponenti $e^{\underline{\underline{J}}t}$.
eJ = (t * J).exp()
eJ
Lõpuks kasutame lineaarset teisendust, et leida maatriksi eksponenti $e^{\underline{\underline{M}}t}$.
eM = (P * eJ * P.inv()).applyfunc(sp.simplify)
eM
Algtingimusele $(x_{10}, x_{20}, x_{30})$ vastav lahend on siis selline.
x = eM * x0
x
Igaks juhuks kontrollime, kas dünaamiline võrrand an rahuldatud.
(x.applyfunc(lambda y: sp.diff(y, t)) - M * x).applyfunc(sp.simplify)
Millised on Jacobi maatriksi omaväärtuste reaalosad hüperboolse püsipunkti juures?
Millisel juhul sisaldab maatriksi eksponent $e^{\underline{\underline{M}}t}$ polünoome ($t, t^2, \ldots$)?
Milline on järgneva süsteemi püsipunkt $\underline{x}_* = (0, 0, 0)$?
$$\begin{pmatrix} \dot{x}_1\\ \dot{x}_2\\ \dot{x}_3 \end{pmatrix} = \begin{pmatrix} -5 & -4 & 9 \\ 3 & 2 & -3 \\ -4 & -4 & 8 \end{pmatrix} \cdot \begin{pmatrix} x_1\\ x_2\\ x_3 \end{pmatrix}$$