5. peatükk. NÄITED

5.1 Kuidas alustada

Programmipaketi þÿ kohta on olemas palju kirjandust. Kõige kättesaadavam on tõenäoliselt programmi profesionaalse versiooniga kaasas olev inglisekeelne käsiraamat [26]. Käsiraamatu sisu on elektroonilisel kujul dubleeritud þÿ  abiinfo failides. Mõningaid materjale on olemas ka eesti keeles [22, 25]. Viimane on kättesaadav ka interneti aadressil
 http://www.tpu.ee/~maris/sisukord.

Neile, kes ei ole varem þÿ-ga tuttavad, anname siinkohal mõned hädavajalikud õpetused.

Rea (avalidise) arvutamiseks tuleb vajutada klahvikombinatsiooni [shift]+[enter].  Lihtsalt [enter]-klahvi vajutus viib kursori järgmisele reale, kuid ei arvuta midagi.

Suurtel ja väikestel tähtedel tehakse vahet: x ja X on erinevad sümbolid.

Erinevad avaldised eraldakse semikooloniga. Semikoolon avalise järel tähendab ka seda, et tulemust ei kuvata ekraanile.

Kui mingi arvutus kestab kahtlaselt pikka aega, siis klahvikombinatsiooniga [alt] + . (punkt) saab arvutuse katkestada. Kui see ei aita, tuleb valida menüüst Kernel->Quit Kernel->Local.  See lõpetab Kerneli töö, mille tulemusena lähevad kaotsi kõik defineeritud muutujad.

Mõned kasulikud klahvikombinatsioonid:
[ctrl]+ [shift] + 7 – murrujoon,
[ctrl] + 6	    – astendaja, ülaindeks,
[ctrl] + - 	    – alaindeks,
[esc] a [esc]	    – α,
[esc] D [esc]	    – Δ.

Ühekordne võrdusmärk tähendab omistamist  (näiteks a = 3), kahekordne võrdusmärk tähendab võrrandit (näiteks 3 x + 5 == 4).

Töö alustamiseks programmiga Realization tuleb fail Realization.m kopeerida þÿ  alamkataloogi  ...\AddOns\Applications  ja seejärel arvutada alljärgnev rida:

Needs["Realization`"]

Sellega on programm Realization mälusse loetud. Programmi kõigi funktsioonide nimekirja saab küsida nii:

?Realization`*

Küsimärk koos funktsiooniga trükib üksikasjalisema info. Näiteks:

?ForwardShift

Allpool toodud näited on tehtud arvutil protsessoriga AMD K6 II taktsagedusega 300 MHz. Mälu oli 64 MB.

5.2 Taandamine ja ekvivalents

Vaatleme teist järku sisend-väljund võrrandit, mis on võetud artiklist [18].

ioEq  =  
        y[t + 2] == 
          y[t + 1] u[t + 1] - y[t + 1]^2 + 
            2  y[t + 1] u[t] y[t] - y[t]^2 u[t]^2;

Arvutused

Kontrollime,  kas võrrand on taandumatu:

Irreducibility[ioEq, {y, u}, t]

Kuna Irreducibility annab väärtuseks False, siis on võrrand taanduv. Funktsiooniga Reduction saame leida sisend-väljund võrrandi taandatud kuju:

ioEqRed = Reduction[ioEq, {y, u}, t]

Funktsiooniga Equivalence saab samuti kontrollida, kas kaks võrrandit on ekvivalentsed:

Equivalence[ioEq, ioEqRed, {y, u}, t]

Vastus on jaatav. Kontrollime,  kas taandatud võrrand on teisendatav klassikalsele olekukujule.

Realizability[ioEqRed, {y, u}, t]

Osutub, et on küll. Leiame klassikalised olekuvõrrandid.

Realization[ioEqRed, {y, u}, t]

5.3 Sisend-väljund võrrandi realiseerimine

Vaatleme sisend-väljund võrrandit, mis kirjleldab ühendatud anumate süsteemi. Näide on võetud artiklist [7].

ioEq = 
        y[t + 3] == 
          0.43  y[t + 2] + 0.681  y[t + 1] - 0.149  y[t] + 0.396  u[t + 2] + 
            0.014  u[t + 1] - 0.071  u[t] - 0.351  y[t + 2] u[t + 2] - 
            0.03  y[t + 1]^2 - 0.135  y[t + 1] u[t + 1] - 
            0.027  y[t + 1]^3 - 0.108  y[t + 1]^2 u[t + 1] - 
            0.099  u[t + 1]^3;

Arvutused

Kontrollime, kas võrrand on taandumatu:

Irreducibility[ioEq, {y, u}, t]

Kuna süsteem on taandumatu, siis taandatud diferentsiaalvormi pole mõtet arvutama hakata. Kontrollime, kas süsteem on esitatav klassikaliste olekuvõrranditega.

Realizability[ioEq, {y, u}, t]

Vastus on jaatav. Leiame süsteemi esituse klassikalsel olekukujul. Parameeter ShowInfo->True trükib teate selle kohta, millist meetodit realiseerimisel kasutati. Parameetriga NewVariables määrame olekuvõrrandi olekumuutujateks  (Subscript[x, 1]), (Subscript[x, 2]) ja (Subscript[x, 3]), et saada tulemust võimalikult harjumuspärasel kujul. Kui parameetrile NewVariables ei ole väärtust omistatud, siis vaikimisi võetakse olekmuutujateks x1, x2, ... . Sellistel muutujanimedel on kaks head omadust: nad vajavad kõige vähem mälu ja tulemust on mugav lihttekstiks konvertida.

X = {(Subscript[x, 1]), (Subscript[x, 2]), (Subscript[x, 3])};
Realization[ioEq, {y, u}, t, ShowInfo -> True, 
      NewVariables -> {X}]

Teade Realization uses simple model method tähendab, et antud mudel kuulub lihtsate mudelite klassi. Selle näite korral saab olekuvõrrandid leida ka lineaaralgebralise meetodi abil, kuid siis on olekuvõrrandid keerukamad.

Realization[ioEq, {y, u}, t, ShowInfo -> True, 
      Method -> LinearAlgebraic, NewVariables -> {X}]

5.4 Mitterealiseeritav sisend-väljund võrrand

Vaatleme sisend-väljund võrrandit, mis modelleerib pärmi käärimisprotsessi,  [10].

ioEq = 
        y[t + 1] == 
          0.9106 y[t] + 2.072 u[t + 1] - 1.903  u[t] + 
            120.7 y[t] u[t + 1] - 107.3  y[t] u[t] + 299.6  u[t + 1]^2 - 
            232.8  u[t + 1] u[t] - 84.17  u[t]^2;

Arvutused

Kontrollime, kas süsteem on taandumatu:

Irreducibility[ioEq, {y, u}, t]

Kontrollime, kas süsteem on teisendatav klassikalsele olekukujule:

Realizability[ioEq, {y, u}, t]

Vastus on eitav. Kui me sellest hoolimata üritame kasutada funktsiooni Realization, siis trükitakse veateade selle kohta, et mingi alamruum ei ole täielikult integreeruv.

Realization[ioEq, {y, u}, t]

Vaatame, mis juhtub funktsiooni Realization täitmise käigus. Kõigepealt leiame süsteemi laiendatud olekuvõrrandid:

Z = {(Subscript[z, 1]), (Subscript[z, 2]), (Subscript[z, 3])};
{extEq, repl} = 
        IOToExtendedState[ioEq, {y, u}, t, 
          NewVariables -> {Z, {v}}];
extEq

Siin on näha, kuidas on defineeritud uued olekumuutujad (Subscript[z, 1]), (Subscript[z, 2]) ja (Subscript[z, 3]):

TableForm[repl]

Arvutame alamruumide jada {(Subscript[ℋ, k])}:

Hk=SequenceH[extEq, {Z, v}, t]

Alamruume võib kuvada ka diferentsiaalvormidena:

DifferentialForm[Hk]

Kontrollime alamruumide integreervust. Märk /@ tähendab, et funktsiooni Integrability rakendatakse loendi Hk igale elemendile.

Integrability  /@  Hk

Ootuspärselt on (Subscript[ℋ, 1]) ja  (Subscript[ℋ, 2]) integreeruvad, kui (Subscript[ℋ, 3]) ei ole. Arvutame ka jada {(Subscript[ℐ, k])} ja kuvame tulemuse diferentsiaalvormidena:

Ik = SequenceI[extEq, {Z, v}, t];
DifferentialForm[Ik]

Nagu näha, on  (Subscript[ℐ, 3])  baasi ainsa vektori koordinaadid palju keerulisemad avaldised kui  (Subscript[ℋ, 3]) omad.   Integreeruvuse konrtoll annab ootuspäraselt samasuguse tulemuse kui jada {(Subscript[ℋ, k])} korral.

Integrability  /@  Ik

5.5 Üldistatud olekuvõrrandi järgu alandamine

Vaatleme sisend-väljund võrrandit

ioEq  =  
        y[t  +  3]  ==  
          2 y[t  +  2] y[t  +  1]  +  
            3 u[t]^2 u[t  +  2] u[t  +  1];

Arvutused

Kontrollime,  kas võrrand on taandumatu:

Irreducibility[ioEq, {y, u}, t]

Kontrollime,  kas antud võrrand on realiseeritav klassikalisele olekukujule.

Realizability[ioEq, {y, u}, t]

Vastus on eitav. Läheme üle üldistatud olekuvõrranditele ja vaatame, kas saab alandada sisendi nihke järku:

{genstEq, repl} = IOToGeneralizedState[ioEq, {y, u}, t];
TableForm[genstEq]
TableForm[repl]

X = {x1, x2, x3};
\(TableForm[
	clsEq = Lower[genstEq, {X, u}, t]
]\)

Sisendi nihke järku õnnestus alandada kahelt ühele.

5.6 Üldistatud olekuteisendus

Vaatleme üldistatud olekuvõrrandit, mis modelleerib binaarse destillatsiooni kolonni, [5].

\(\(stEq\  = \ {			
		x\_1[t + 1] == x\_2[t], \ 
		x\_2[t + 1] == 
            x\_3[t], \ 
	\ \ x\_3[
              t + 1] == \((0.898\ x\_3[t]\  + \ 0.248\ u[t + 2] - 
                  0.106*10\^\(-2\)\ u[t + 1]\ x\_1[t]
	\ \  - 
                  0.159*10\^\(-10\)\ u[t]^3\ u[t + 1]\^2\ u[t + 2]\ x\_1[
                      t])\)*
	\ \ 1\/\(1 - 0.173*10\^\(-5\)\ u[t]\^2\ u[t + 1]\)};\)\)
X  =  {(Subscript[x, 1]), (Subscript[x, 2]), (Subscript[x, 3])};

Arvutused

Kontrollime, kas võrrand on teisendatav klassikalisele olekukujule:

ClassicTransformability[stEq, {X, u}, t]

Vaatame, kas saab alandada sisendi nihke järku:

Lower[stEq, {X, u}, t]

Süsteemi paremal poolel esineb ikka liige u(t + 2), mis tähendab, et järgu alandamine ebaõnnestus.

5.7 Integreeruva baasi leidmine

Vaatleme üldisatud olekuvõrrandeid, mis väikese modifikatsiooniga on võetud artiklist [17].

\(\(genstEq = {
		x1[1 + t] == x2[t], 
		x2[1 + t] == 
            x3[t], 
		x3[1 + t] == 
            u[2 + t]\^3\ \((\(-\(\(u[1 + t]\ x1[t]\ x2[
                            t]\)\/u[t]\^3\)\) + \(\((u[1 + t] + x2[t])\)\ x3[t]\)\/u[1 + t]\^3)\)};\)\)
X =  {x1, x2, x3};

Arvutused

Kontrollime,  kas süsteem on teisendatav klassikalsele olekukujule:

ClassicTransformability[genstEq, {X, u}, t]

Vastus on jaatav.

ClassicTransform[genstEq, {X, u}, t]

Funktsioon ClassicTransform aga ei andnud meile tulemust, kuna funktsioon IntegratePfaff ei suuda leida antud alamruumile integreeruvat baasi. Uurime probleemi lähemalt. Leiame sisend-väljund võrrandile laiendatud süsteemi:

{extEq, repl} = 
        GeneralizedStateToExtendedState[genstEq, {X, u}, t];

TableForm[extEq]

Siin on näha, kuidas on defineeritud uued muutujad z1, z2, ... , z6:

TableForm[repl]

Arvutame alamruumide jada {(Subscript[ℋ, k])} esimesed neli elementi:

Z = {z1, z2, z3, z4, z5, z6};
Hk = SequenceH[extEq, {Z, v1}, t, 4];
DifferentialForm[Hk]

Kontrollime, kas alamruum (Subscript[ℋ, 4])= Hk[[4]] on täielikult integreeruv:

Integrability [Hk[[4]] ]

(Subscript[ℋ, 4]) on täielikult integreeruv, kuid programm ei suuda leida ingreeruvat baasi. Kuna baasidiferentsiaalvormid ei ole väga keerulised, saame neid käsitsi teisendada nii, et saaksime eksaktsed diferentsiaalvormid. Teisendame Hk neljanda elemendi diferentsiaalkujule ja tähistame ta sümboliga H4. Baasi elemendid tähistame vastavalt ω1, ω2 ja ω3.
siis saab

H4 = {ω1, ω2, ω3} = 
        ToDifferential[Hk[[4]]]

Diferentsiaalvorme võib ekraanile kuvada ka traditsioonilisemal moel:

TraditionalForm[H4]

Kahjuks ei ole võimalik vabaneda sellest, et diferentsiaal trükitakse kordaja ette. Põhjus on selles, et muutujad on kujul zi[0]. Kui muutujad on lihtsalt sümbolid nt. z1, z2, ... , siis trükitakse diferentsiaalid  õigesti. Uurime lähemalt, milles seisnevad integreeruva baasi leidmise raskused. Moodustame kõigi muutujate loendi:

coords = #[0] &  /@  Join[Z, {v1}]

Arvutame avaldise d ω2 ⋀ ω2 = 0.

Wedge[De[ω2, Coordinates -> coords], ω2]

Kuna avaldise võrdub nulliga, siis ω2 saab täisdiferentsiaaliks teisendada, korrutades teda mingi integreeruvuskonstandiga. Kahe muutuja korral suudab programm integreeruvuskonstandi leida ja seega ω2 integreerimine probleemiks ei kujune. Kontrollime analoogilist tingimust ka ω3 jaoks:

Wedge[De[ω3, Coordinates -> coords], ω3]

Tulemus on nullist erinev. Kasutades artikilis [17] saadud tulemusi, defineerime uue 1-vormi järgmiselt:

ω3new  =  
      Expand[ω3/(z4[0]^5 z5[0]^4) - ω2 z1[0]/
              z4[0]^5 - ω1 z2[0]/z4[0]^4]

Kontrollime, kas tulemus on eksaktne diferentsiaalvorm:

De[ω3new, Coordinates -> coords]

On küll. Integreerime leitud baasi.

transf = 
      IntegratePfaff[{ω1, ω2, ω3new}, coords]

Läheme tagasi vanadele muutujatele.

transf = transf /. (#[0]  ->  #[t] &  /@  Z)  /.  
        Reverse  /@  repl

Leiame klassikalised olekuvõrrandid. Parameetriga Method saab programmile ette anda eespool leitud üldistatud olekuteisenduse.

clsEq = 
      ClassicTransform[genstEq, {X, u}, t, Method -> transf]

TableForm[clsEq]