\underline{Solmu 1/2007}

Vektorit, matriisit, Händel ja vaalit

Heikki Apiola Dosentti Matematiikan laitos, Teknillinen korkeakoulu

Lineaarialgebran maistiaiset

Lineaarialgebra on matematiikan ala, joka on sekä teorian että sovellusten kannalta hyvin keskeinen. Se yleistää havainnollisen vektorikäsitteen mitä moninaisimpiin ja yllättävimpiin tilanteisiin. Matriisit ovat lukutaulukoita, joille määritellään laskutoimitukset. Taulukkoon koottua tietoa käsitellään yhtenä objektina samankaltaisin laskusäännöin kuin lukuja. Kun matriisia sovelletaan vektoriin, syntyy liikettä, dynamiikkaa. Lineaarialgebran merkitys matematiikan sovelluksille on kasvanut käsi kädessä tietotekniikan kehityksen kanssa. Niinpä alan ohjelmisto on varsin kypsässä ja kattavassa tilassa, toki kaiken aikaa kehittyen. ”Lineaarialgebran kieltä” puhuvia laadukkaita ohjelmistoja on saatavilla. Kirjoituksessa esittelemme esimerkkien valossa vapaasti saatavissa olevaa ohjelmaa Scilab, joka noudattaa varsin uskollisesti tunnetun ja maailmalla hyvin suositun Matlab-ohjelman syntaksia.

Kirjoituksessa pyrimme valottamaan mm. vektorikäsitteen moninaisia ja kenties yllättäviä ilmentymiä havainnollisista tason suuntanuolista aina digitaalisiin musiikkivektoreihin. Matriisien alalla korostamme tässä dynamiikkaa ja prosessia aina eduskuntavaaleihin saakka. Kyseessä ei ole yritys opettaa varsinaista lineaarialgebran kieltä yhden kirjoituksen puitteissa, vaan pikemminkin antaa maistiaisia ja ruokahalua sekä näyttää kenties yllättäviäkin näiden käsitteiden käyttöalueita ja -tapoja.

Geometriset ja fysiikan vektorit

Geometriset vektorit tasossa ja avaruudessa lienevät koulumatematiikasta ja fysiikasta tuttuja olioita . Tyypillinen fysiikan ensituttavuus on voima, jolla on suuruus ja suunta. Tällaista suuretta sanotaan vektorisuureeksi. Sitä voidaan geometrisesti kuvata voiman suuntaa osoittavalla nuolella, jonka pituus kuvaa voiman suuruutta.

Kuva 1. Vektorisumma u + v Vektorien u ja v summa u+v määritellään kuvan osoittamalla tavalla. On syytä panna merkille, että vektorin määrää suunta ja pituus, ts. sanoen kaikki samansuuntaiset ja yhtä pitkät suuntajanat alkupisteestä riippumatta edustavat samaa vektoria. Kuvassa se ilmenee kahtena u :lla merkittynä suuntajanana.

Tason vektoreita voidaan toisaalta käsitellä puhtaasti algebrallisesti lukupareina p = (x, y). Geometrisena taustana on tällöin tason pisteen koordinaattiesitys. Yhteys edelliseen nuoliajatukseen saadaan piirtämällä vektorinuoli, jonka alkupiste asetetaan koordinaatiston origoon O. Pisteiden p_{1} = (x_{1}, y_{1}) ja p_{2} = (x_{2}, y_{2}) summa määritellään luontevasti: p_{1}+p_{2} = (x_{1}+x_{2}, y_{1}+y_{2}), ts. lasketaan vastinkoordinaatit yhteen. Geometrisesti tulos saadaan laskemalla vektorien v = \overline{0 p_{1}} ja u = \overline{p_{1} p_{2}} summavektori, jonka kärjen koordinaatit antavat juuri edellä määritellyn summapisteen p_{1} + p_{2}.

Vektoreille määritellään myös toinen laskutoimitus, luvulla eli skalaarilla ^{1} kertominen.

Vektorin v kertominen skalaarilla c tarkoittaa geometrisessa mallissa vektorin pituuden kertomista |c| :lla ja lisäksi suunnan vaihtoa, jos c < 0. Algebrallisessa mallissa vektorin komponentit kerrotaan c :llä, ts. jos v = (x, y), niin

c v = (c x, c y).

Edellä oleva yleistyy suoraan 3−ulotteiseen avaruuteen, algebrallisessa vektorimallissa otetaan mukaan kolmas koordinaatti: v = (x, y, z), geometrisessa suuntajanat leijailevat avaruudessa.

Järjestettyjen lukuparien joukkoa kutsutaan (vektori)tasoksi ja merkitään symbolilla ℝ^{2}. Vastaavasti lukukolmikoiden joukkoa kutsutaan (3−ulotteiseksi) vektoriavaruudeksi ja käytetään merkintää ℝ^{3}.

Geometriaan viittaavassa puheessamme nimitämme samaa oliota vuoroin ”pisteeksi” ja vuoroin ”vektoriksi”. Jälkimäisessä tapauksessa meillä on takaraivossamme ajatus origosta pisteeseen piirretystä paikkavektorista. Esimerkiksi laskiessamme ”pisteitä” yhteen, laskemme geometrisesti ajatellen yhteen vastaavia paikkavektoreita.

Lisää ulottuvuuksia

Algebrallisen vektorimallin etu on, että se voidaan suoraan yleistää mielivaltaisen korkeaan dimensioon n yksinkertaisesti kutsumalla vektoreiksi lukujonoja u = (x_{1}, x_{2}, …, x_{n}) ja määrittelemällä laskutoimitukset vektoreille u = (x_{1}, x_{2}, …, x_{n}) ja v = (y_{1}, y_{2}, …, y_{n}) sekä skalaarille c asettamalla:

\begin{cases}u + v = (x_{1} + y_{1}, x_{2} + y_{2}, …, x_{n} + y_{n}) \\ c u = (c x_{1}, c x_{2}, …, c x_{n}) \end{cases}

Vektorien vähennyslasku suoritetaan vähentämällä toisistaan vastinkoordinaatit, nollavektori on vektori

0 = (0, 0, …, 0) .

Vektorien yleiset laskusäännöt ovat aivan samat kuin vastaavat reaalilukujen laskusäännöt, jos ajattelemme skaarilla kertomista tulona. Näitä sääntöjä ovat liitäntä- vaihdanta- ja osittelulait. Kaikki palautuvat suoraan koordinaateilla suoritettaviin lukujen vastaaviin sääntöihin.

Toinen yleistysmahdollisuus on sallia kompleksiset komponentit ja skalaarit. Pitäydymme tässä kirjoituksessa ”turvallisuussyistä” reaalisissa vektorikäsitteissä, vaikka lopussa mainitussa ominaisarvoteoriassa kompleksisilta ei voida välttyä.

Sisätulo, pituus, kulma

Geometrisessa vektorimallissa vektorin u pituus on tunnettu peruskäsite, jota merkittäköön ||u||. Jos u = (x, y) , niin Pythagoraan lauseen mukaan ||u|| = \sqrt{x^{2} + y^{2}}. Jos kyseessä on 3−ulotteisen avaruuden vektori u = (x, y, z) , niin ||u|| = \sqrt{x^{2} + y^{2} + z^{2}}.

Tässä on selvä malli yleiseen tilanteeseen, määritellään siis vektorin u = (x_{1}, x_{2}, …, x_{n}) ∈ ℝ^{n} pituus eli normi kaavalla

||u|| = \sqrt{x_{1}^{2} + x_{2}^{2} + … + x_{n}^{2}}.

Määritellään nyt suoraan yleisessä tilanteessa vektorien u ja v sisätulo (skalaaritulo, pistetulo) kaavalla

u · v = x_{1} y_{1} + x_{2} y_{2} + … + x_{n} y_{n}.

Geometrisessa vektorimallissa sisätulo voidaan määritellä kordinaattivapaasti kaavalla u · v = ||u|| ||v|| cos γ, missä γ on vektorien u ja v välinen kulma. Määritelmien yhtäpitävyys voidaan osoittaa esimerkiksi kosinilauseella.

Yleisessä n−ulotteisessa vektorimallissa ei luonnostaan ole käsitettä ”vektorien välinen kulma”. Nyt voimme halutessamme määritellä tuon kulman yllä olevalla sisätulokaavalla. Yleisen vektorikulman tärkein merkitys liittyy kohtisuoruuden eli ortogonaalisuuden käsitteen yleistykseen, ehtona on u · v = 0 Olemme irrottaneet vektoriopin geometrisesta taustastaan ja antaneet täsmällisen sisällön n−ulotteisen avaruuden vektoreille. Tämä on pohjana alkujohdannossa kuvatulle tärkeälle matematiikan alalle, lineaarialgebralle. Erityisen viehättävää lineaarialgebrassa on, että pohjana on koko ajan geometrinen intuitio 2- ja 3-ulotteisten geometristen vektorien parissa, joka auttaa koko perusteorian ymmärtämisessä ja todistusten ideoinnissa olennaisella tavalla. Se toimii yleisen teorian ”mallikuvana” kaiken aikaa.

1Skalaari, ”scalar” – sellainen, jolla skaalataan

Vektorilaskentaa tietokoneella

Sovelluksissa suoritamme vektorilaskentaa usein hyvin moniulotteisilla vektoreilla. Laskut muodostuvat pitkiksi ja tuloksen jälkikäsittely saattaa sisältää vaikkapa vektorin muuntamisen kuvaksi tai ääneksi.

Ohjelmat, joiden perustietorakenteisiin kuuluvat vektorit, ja laskuoperaatiot kattavat vektorialgebran, ovat korvaamattomia työvälineitä.

Olen aiemmin esitellyt symbolilaskentaohjelmistoa Maple

http://solmu.math.helsinki.fi/1999/5/apiola/

ja numeerista vektori/matriisiohjelmistoa Matlab.

solmu.math.helsinki.fi/2004/3/apiola.pdf

Ongelmana lukijoille on ohjelmien maksullisuus. Esittelen tällä kertaa vapaasti saatavaa ohjelmaa Scilab, joka on perusperiaatteiltaan aivan samanlainen kuin Matlab. Ohjelmassa on avoimesti pyritty varsin pitkälle menevään yhteensopivuuteen Matlab’n kanssa. (Toinen vastaava vapaasti saatava ohjelmisto on Octave.)

Ohjelman voit ladata itsellesi osoitteesta http://www.scilab.org/ . Käyttöohjeita on ranskan, saksan ja englanninkin kielellä saatavissa:

http://www.scilab.org/publications/

Lyhyt Scilab/Matlab-käyttöohje

Scilab-ohjelman opiskelun voit aloittaa jostakin Matlab-oppaasta, suomenkielinen Matlabkäyttöohje on viitteissä.

Kun Scilab käynnistetään, avautuu komentoikkuna. Tähän voidaan kirjoittaa ohjelman tuntemia komentoja, jotka ohjelma tulkitsee ja toteuttaa samantien (tai antaa virheilmoituksen). Tarkoituksena on antaa pieniä maistiaisia ohjelman käytöstä senverran, että esittämämme esimerkit voidaan suorittaa ja ymmärtää. Tarkoitus on innostaa lukijaa omiin kokeiluihin ohjelmien avustus- ja dokumentointijärjestelmien ja viitteissä mainittujen lähteiden avulla. Voit aloittaa kirjoittamalla jotain tämäntyylistä Scilab- (tai Matlab-) komenoikkunaan:

                                                // Ensimmäinen Scilab/Matlab-istunto
                                                // Scilab-kommentti: //  Matlab-kommentti: %
                                                u=[1 2 3 4]    // Luodaan vektori u
                                                v=[-2 2 -1 5 ]  // samoin toinen vektori v
                                                w=-u+2*v // Lineaarikombinaatio sijoitetaan
                                                        // muuttujaan w
                                                u.*v   // Kerrotaan vektorin vastinkomponentit
                                                u*v'   // u:n ja v:n sisätulo.

Selityksiä:

1. Lineaarikombinaatio tarkoittaa muotoa c_{1} v_{1} + c_{2} v_{2} + … + c_{k} v_{k} olevaa summaa.

2. Viimeistä edellinen rivi: u.*v on pisteittäin eli vastinalkioittain tapahtuva kertolasku. Se ei siis ole varsinainen vektorilaskutoimitus, mutta monessa yhteydessä, erityisesti vektorilausekkeissa tuiki tarpeellinen.

3. Viimeinen rivi on erikoistapaus matriisikertolaskusta, siitä enemmän tuonnempana.

Ohjelman käytön käytännön vihjeitä

Yllä olevia ja muutamia vastaavia kirjoitettuasi ei kannata jatkaa työskentelyä suoraan komentoikkunassa, koska työsi häviää taivaan tuuliin. Ainoa, mitä siinä voit tehdä, on selata komentopuskuria nuoli-ylös-näppäimellä ja editoida komentoriviä.

Sensijaan kannattaa avata otsikkopalkista Editor ja kirjoittaa komentoja kommentteineen editoriikkunaan. Scilab tarjoaa varsin kätevän toimintatavan: Maalataan halutut komentorivit ja painetan CTR-Y tai valitaan otsikkoriviltä Execute. Kyseiset rivit siirtyvät välittömästi tulkille suoritettaviksi. Toinen mahdollisuus on käyttää omaa mielieditoria, kuten Emacs, Notepad, Wordpad, ym. ja leikata/liimata editorista komentoja Scilab-komentoikkunaan. Tämä vaatii yhden näppäinpainalluksen enemmän, mutta on ehkä tutumpana turvallisempaa.

Kuvia ja musiikkia vektoreilla

Siirrytään nyt katsomaan vektorikäsitteen erilaisia ilmenemismuotoja. Nähdään, että yleistys uusiin ulottuvuuksiin ei ole pelkkää matemaatikkojen harjoittamaa esteettistä, maailmalle vierasta abstrahointihöpinää, vaan se avaa niin silmiä kuin korviakin näkemään ja kuulemaan uusilla tavoilla. Viimemainitusta olkoon esimerkkinä digitaalinen äänenen käsittely, josta itse kukin voi nauttia cd-levyjä ja äänitiedostoja kuunnellessaan. Ensinmainitusta voitaisiin vastaavasti ottaa digitaalinen kuvankäsittely, mutta asiaa harkittuani valitsin tällä kertaa äänen. Toki kuviakin sentään katsellaan funktioiden kuvaajien muodossa.

Funktion f kuvaajan piirto käsipelillä tapahtuisi yksinkertaisimmillaan niin, että laskettaisiin tasavälisessä pisteistössä x_{1}, x_{2}, …, x_{n} funktion arvot y_{i} = f(x_{i}), i = 1, …, n, pyöräyteltäisiin kynällä pisteet koordinaatistoon ja yhdistettäsiin peräkkäiset pisteet jananpätkillä.

Juuri näin tekee plot-funktio Matlab/Scilab:ssa. Peruskutsu on plot(x,y), missä x ja y ovat samanpituisia vektoreita. Ohjelmissamme on funktio linspace, jolla saadaan aikaan tasavälinen x−pisteistö. Seuraavassa esimerkissä muodostetaan x−vektori jakamalla väli [−π, π] 15 :een osaan, ja sitten y−vektori laskemalla sin −funkion arvot x−pisteissä. Kaikki matemaattiset funktiot näissä vektoriohjelmissa toimivat niin, että sovellettaessa funktiota (x−)vektoriin, tuloksena saadaan (y−)vektori, joka koostuu vastaavista funktion arvoista. Tämä tekee käytön hyvin vaivattomaksi. Pari pientä, hyödyllistä yksityiskohtaa:

1. Puolipiste (;) komennon perässä estää tulostuksen ruudulle.

2. Kummassakin ohjelmassa on erikoissymboleja joillekin vakioille, π on Matlab:ssa pi ja Scilab:ssa %pi. Toimimme tähän tapaan:

pi=%pi   // Matlab-yhteensopivuuden vuoksi
x=linspace(-pi,pi,15); y=sin(x);
[x' y'] // xy-arvojen taulukko
clf()   // Grafiikkaruudun pyyhkiminen
plot(x,y); // Pisteet ja murtoviiva
plot(x,y,'o') // Pelkät pisteet

Piirretään tarkemmin jakamalla väli 50 :een osaan. Piirretään samaan kuvaan punaisella värillä. Nähdään, että tässä on riittävä määrä ”näytteitä” sini-funktiosta ao. välillä, jotta silmä näkee kuvaajan kauniisti kaartuvana sinikäyränä.

x=linspace(-pi,pi,50); y=sin(x);
plot(x,y,'r') // 'r' viittaa väriin "red"

Sinin kuvaaja, näytteitä 15 ja 50

Musiikkia vektoreilla

Edellä näimme, miten vektoreilla voidaan saada aikaan silmänruokaa vaikkapa sini-funktion kuvaajan ihastelemiseksi. Saataisiinko myös korvin kuultavaa? Jatkakaamme sini-funktion parissa.

Perussävelenä tarkastelkaamme yksiviivaista a-säveltä. Kyseessä on siniaalto, jonka värähtelytaajuus on 440 Hz, ts. 440 värähdystä sekunissa. Värähtelyn kulmataajuus on tällöin 2 π 440 radiaania sekunnissa ja sitä esittää siniaalto y(t) = sin(2 π 440 t).

Kun tällaista siniaaltoa digitoidaan, täytyy näyttenottotaajuuden olla mielellään selvästi enemmän kuin 2 · 440. Otetaan varman päälle: 10 000. Seuraavassa istunnossa jaetaan ensin 1 sekunnin aikaväli (0, 1) 10 000 :een osaan, piirretään 100 ensimmäistä kuvaajan pistettä vastaten 1/100 sekunnin aikaa ja sitten kuunnellaan. Funktio sound on samaa korvalle kuin plot on silmälle.

a1=2*%pi*440;  // Scilab
t=linspace(0,1,10000);y2=sin(a1*2*%pi*t);
clf();plot(t(1:100),y2(1:100))
sound(y2,10000);

Koska lukija ei lehden sivulta saa ääntä kuuluviin, niin jätettäköön kuvakin tulostamatta.

Sointuja

Esittelemme muutaman perusidean ja työkalun digitaalisen äänenkäsittelyn alalla. Muodostetaan yksiviivaisen oktaavin nuottien taajuudet ja sijoitetaan muuttujiin

  c=261.6;d=293.7;e=329.6;f=349.2;
  g=392;a=440;h=493.9;

Jospa soittaisimme sekunnin verran intervallia kvintti, joka voidaan toteuttaa vaikkapa viulun d- ja a-kieliä yhtäaikaa soittamalla. Käytetään näytteenottotaajutta nt=8192. Intervalli saadaan laskemalla värähtelyjen summa, ts. laskemme näytevektorit yhteen. Skaalataan jakamalla 2 :lla, koska sound-funktio haluaa värähtelyn arvoalueen (y−arvot) välille [−1, 1] .

nt=8192; pi=%pi; t=linspace(0,1,nt);
kvintti=0.5*sin(2*pi*d*t)+0.5*sin(2*pi*a*t);
sound(kvintti,nt);
clf();plot(t(1:200),kvintti(1:200))

Kvintti: Viulun d- ja a-kielet soivat.

Raottaaksemme ovea hiukan signaalinkäsittelyn matemaattisten perustyökalujen suhteen, otamme esimerkin ns. nopeasta Fourier-muunnoksesta, FFT (”Fast Fourier Transform”). Kyseessä on väline, joka on mainittu joissain arvioissa 1900-luvun merkittävimpiin matemaattisiin algoritmeihin kuuluvaksi. Paino on sanalla ”nopea”, joka on mahdollistanut reaaliaikaiset digitaalisen signaalinkäsittelyn sovellukset.

Tässä yhteydessä emme selitä, mitä Fourier-muunnos tarkoittaa. Katsomme edellistä esimerkkiä jatkaen, minkälaiseen maailmaan tuo munnos meidät vie.

Matlab/Scilab:ssa on funkio fft, jota käytämme ”mustana laatikkona”. Tämä muunnos toimii kaikkein tehokkaimmin vektoreille, joiden pituus on jokin 2 :n potenssi. Näytteenottotaajuutemme valittiin siitä syystä luvuksi 8192, kun tämä sattuu olemaan 2^{13}. Mainittakoon, että cd-levyn musiikin näytteenottotaajuus on 44 100 näytettä sekunnissa. (Tämä ei ole 2 :n potenssi, syy on se, että 2^{15} = 32768 on liian pieni, jotta korkeimmat ylä-äänet eivät vääristyisi ja 2^{16} = 65 536 on aivan turhan suuri.)

Suoritetaanpa nyt kvintti-vektorillemme Fouriermuunnos Scilab:n fft-funktiota käyttäen.

Fkvintti=fft(kvintti);
clf();plot(Fkvintti(1:500))

Kvintin Fourier-muunnos Viulun d- ja a-taajuudet erottuvat.

Kahden sinivärähtelyn kuva on muunnettu ”taajuustasoon”. Vaaka-akselilla on taajuudet ja pystyakseli edustaa kunkin taajuuden tehoon viittaavaa arvoa. Nähdään, että kvintin taajuuskuvassa kaikki muut taajuudet ovat nolla-tehoisia, paitsi ∼ 293 Hz ja ∼ 440 Hz.

Käänteismuunnoksella päästään takaisin. Se on niinikään suoraan saatavilla ohjemissamme nimellä ifft. Jos haluaisimme viulun kieliä vaikka vähän virittää, se tapahtuisi helposti taajuustasossa, sitten palaisimme käänteismuunnoksella aikatasoon soittamaan puhdasta kvinttiä.

Tuiki tuiki tähtönen – Halleluja

Tehdään pieni viihteellinen/taiteellinen sivuhyppäys, kun meillä nyt on koko nuotisto näpeissämme. Kirjoitetaan vektori tuiki, jossa on laulun nuotit. Oletetaan, että edellä olevat nuottien taajuusarvot on sijoitettu muuttujiin c, d, …

tuiki=[c,c,g,g,a,a g f f e e d d];
tuiki=[tuiki c g g f f e e d];//loistat vaan..

Yksinkertaisella ohjelmasilmukalla voimme nyt soittaa suositun lastenlaulun. Komento halt() pysäyttää ohjelman siihen saakka, kunnes painetaan jotain näppäintä.

   t=linspace(0,1,8192);
   for k=1:length(tuiki)
     halt()
     y=sin(tuiki(k)*t);sound(y,8192)
   end;

Jos laulat kuorossa, etkä soita sujuvasti mitään instrumenttia, voit tällä menetelmällä harjoitella helposti omaa stemmaasi, otin sen itse käyttöön näiden kehittelyjen seurauksena.

Jotta pääsisimme käsiksi hiukan vaativampaan taidenautintoon, mainittakoon, että Matlab:ssa on digitoituna Ote Händelin Messias-oratorioon kuuluvasta Halleluja-kuorosta. Kas näin:

>> load handel
>> sound(y)  % Halleluja halleluja ...
% Ei Hard Rock!

Katsotaan hiukan tuota Halleluja-vektoria:

>> length(y)  % Vektorin pituus
ans =
73113
>> y(1:5)    % 5 ensimmäistä komponenttia
ans =
0
-0.0062
-0.0750
-0.0312
0.0062  % Ihan totta, pelkistä tylsistä
% numeroista koostuva vektori!
>> plot(y)

Händelin Messias: Halleluja-kuoro

Lineaarisia yhtälöryhmiä

Matriisilaskennan ensimmäinen ja tärkeä käyttöaälue on lineaaristen yhtälöryhmien teoria ja ratkaisumenetelmät.

En tällä kertaa paneudu tähän aiheeseen muuten kuin selittämällä aivan lyhyesti ratkaisutekniikan pääperiaatteet samalla johdatellen matriiseihin.

Katsotaanpa esimerkkiä:

\begin{cases}x_{1} − 2 x_{2} + x_{3} = 0 \\ 2 x_{2} − 8 x_{3} = 8 \\ −4 x_{1} + 5 x_{2} + 9 x_{3} = −9 \end{cases}

Tällaisia yhtälöryhmiähän ratkaistaan niin, että yhtälöitä muokataan operaatioilla, joissa yhtälöryhmän ratkaisujoukko pysyy samana. Näitä operaatioita ovat yhtälöiden yhteenlasku, vakiolla kertominen ja yhtälöiden järjestyksen vaihtaminen.

Koulussahan eliminointitekniikkaa harjoitellaan, mutta tietääkseni ei esitetä systemaattista tapaa, Gaussin eliminaatiomenetelmää. Siinä päädytään aina ”yläkolmiomuotoon”, josta yhtälöryhmän ratkaisujen olemassaolo- ja lukumääräkysymykset voidaan selvittää ja samalla saada ratkaisut lasketuksi silloin, kun niitä on.

Huomataan, että yhtälöryhmä on annettu, kun kaikki tuntemattomien kertoimet ja tunnetut oikean puolen luvut on annettu. Niinpä kaikki yhtälöryhmää koskeva informaatio sisältyy vasemmanpuoleiseen ”matriisiin”, eli lukutaulukkoon. Merkitään symbolilla (∼) yhtälöryhmiä edustavien matriisien ekvivalenssia, eli ratkaisujoukkojen samuutta.

[ \begin{matrix}1 & −2 & 1 & 0 \\ 0 & 2 & −8 & 8 \\ −4 & 5 & 9 & −9 \end{matrix} ] ∼ [ \begin{matrix}1 & −2 & 1 & 0 \\ 0 & 2 & −8 & 8 \\ 0 & −3 & 13 & −9 \end{matrix} ]

Kirjoitusvaivoja voidaan hiukan säästää kohdistamalla sallitut muokkausoperaatiot (”Gaussin rivioperaatiot”) suoraan tähän matriisiin ja mikä tärkeämpää, tällöin menettelyn muuntaminen tietokoneohjelmaksi käy vaivattomasti.

Tavoitteena on saada nollat päälävistäjän alapuolelle. Ensimmäisessä sarakkeessa on jo yksi 0, toinen saadaan näin: Kerrotaan 1. rivi 4 :llä ja lisätään kolmanteen, vain kolmas rivi muuttuu. Näin päädytään oikeanpuoleiseen matriisiin. Nyt voidaan 2. rivi (yhtälö) jakaa 2 :lla ja sen jälkeen kertoa 3 :lla ja lisätä kolmanteen. Näin päädytään matriisiin

[ \begin{matrix}1 & −2 & 1 & 0 \\ 0 & 1 & −4 & 4 \\ 0 & 0 & 1 & 3 \end{matrix} ] ↔ \begin{cases}x_{1} − 2 x_{2} + x_{3} = 0 \\ x_{2} − 4 x_{3} = 4 \\ x_{3} = 3 \end{cases}

Eliminaatiovaihe on valmis, päädyimme yläkolmiomuotoon. Koska x_{3} :n kerroin ≠ 0, saamme yksikäsitteisen ratkaisun ratkaisemalla alhaalta ylöspäin edeten kolme erillistä ensimmäisen asteen yhtälöä. Näemme, että saadaan yksikäsitteinen ratkaisu, olipa oikean puolen ”pystyvektori” valittu miten hyvänsä. Tässä tapauksessa saadaan alimmasta: x_{3} = 3, sitten toisesta: x_{2} = 16 ja vihdoin ensimmäisestä: x_{1} = 29.

Gaussin eliminaatiomenettely voidaan nähdä kaksivaiheisena prosessina: 1) Eteenpäin eliminointi (”forward elimination”) ja takaisinsijoitus (”backsubstitution”), jälkimmäinen siinä tapauksessa, että 1. vaihe lupaa ratkaisuja olevan.

Laskentaa matriiseilla

Matriisilla tarkoitetaan yksinkertaisesti suorakulmion muotoista lukutaulukkoa. Jos rivejä on m ja sarakkeita n kappaletta, puhutaan m × n−matriisista.

Merkitään edellä olevassa esimerkissä A :lla yhtälöryhmän kertoimien muodostamaa 3 × 3−matriisia, joka siis koostuu edellä olevan matriisin 3 :sta ensimmäisestä sarakkeesta.

A = [ \begin{matrix}1 & −2 & 1 \\ 0 & 2 & −8 \\ −4 & 5 & 9 \end{matrix} ]

Otetaan myös käyttöön vektorit x = [x_{1}, x_{2}, x_{3}]^{T} ja b = [0, 4, 3]^{T}. Yläindeksi ^{T} viittaa ns. transposiin, joka tarkoittaa tässä, että vektorit ajatellaan ”pystyvektoreiksi”, eli kyseessä on oikeastaan 3 × 1−matriisi. ^{2}

Määrittelemme matriisi kertaa vektori- tulon niin, että yhtälöryhmämme voidaan kirjoittaa muotoon A x = b. Siten A x =

[ \begin{matrix}1 & −2 & 1 \\ 0 & 2 & −8 \\ −4 & 5 & 9 \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \end{matrix} ] = [ \begin{matrix}x_{1} − 2 x_{2} + x_{3} \\ 2 x_{2} − 8 x_{3} \\ −4 x_{1} + 5 x_{2} + 9 x_{3} \end{matrix} ]

Toisin sanoen: tulo A x on (pysty)vektori, jonka komponentit saadaan sisätuloina a_{1} · x, a_{2} · x, a_{3} · x, kun matriisin A vaakavektoreita merkitään: a_{1}, a_{2}, a_{3}. Matriisin rivin on oltava yhtä pitkä kuin kerrottava sarakevektori, ts. matriisin sarakkeiden lukumäärän ja kerrottavan vektorin pituuden on oltava samoja. Tulosvektorin pituus on sama kuin matriisin sarakkeen pituus (= rivien lukumäärä).

Tähän saakka esittämämme määritelmät näyttävät antavan meille ainakin esteettistä nautintoa, yhtälöryhmämme saa muodollisesti hyvin yksinkertaisen asun: A x = b.

Mikään ei estäisi käyttämästä analogiaa tavallisen ensimmäisen asteen yhtälön ratkaisulle ja merkitsemästä yhtälöryhmän ratkaisua jakolaskuun viittaavilla tavoilla:

x = \frac{b}{A} = A^{−1}b.

Jakolaskumuoto ei ole yleisessä käytössä matemaattisena merkintätapana, sensijaan jälkimmäinen muoto, jossa ratkaisu esitetään ”käänteismatriisilla” kertomisena, on matriisilaskennan arkipäivää. Mikään ei toki estä käyttämästä jakolaskuasymboliikkaa ainakaan tietokoneohjelmassa. Näin onkin tehty mm. Matlab/Scilab:ssa:

Esimerkkiyhtälöryhmämme ratkaistaisiin näin:

                                                -->A=[1 -2 1; 0 2 -8;-4 5 9]
                                                 A  =
                                                    1.  - 2.    1.
                                                    0.    2.  - 8.
                                                  - 4.    5.    9.
                                                -->b=[0;8;-9]
                                                 b  =
                                                    0.
                                                    8.
                                                  - 9.
                                                -->x=A\b // "matriisilla A jako"
                                                 x  =
                                                    29.
                                                    16.
                                                    3.
                                                // Tarkista kertomalla: A*x, antaako b:n ?

Jos kyseessä olisi lukuja (1 × 1-matriiseja) koskeva yhtälö, olisi yhtälön ratkaisun eli jakolaskun onnistumisen ehtona A ≠ 0. Yhtälöryhmän tapauksessa matriisia A koskeva ehto on juuri se, johon Gaussin eliminaatiomenettely johtaa. Ehto voidaan lausua monessa muodossa, joiden esittelyyn emme tässä ryhdy.

Matriisitulo yleisesti

Osaamme muodostaa tulon A b, kun b on vektori, jonka pituus ^{3} on sama kuin matriisin rivin pituus (ts. sarakkeiden lukumäärä). Jos vaikka A on 2 × 3−matriisi ja b on ℝ^{3} :n vektori, niin

A b = [\begin{matrix}a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \end{matrix}] [\begin{matrix}b_{1} \\ b_{2} \\ b_{3} \end{matrix}] = [\begin{matrix}a_{1} · b \\ a_{2} · b \\ a_{3} · b \end{matrix}] ,

missä a_{i} tarkoittaa A−matriisin rivivektoria numero i.

2Vektorikäsitteen kannalta on yhdentekevää, kirjoitetaanko koordinaatit pysty- tai vaakasuoraan (tai vaikka S:n muotoon tms.), kunhan komponenttien järjestys on selvä. Matriisilaskennan kannalta on huomattavaa laskentateknistä hyötyä apukäsitteistä pystyja vaakavektori.

3Matriisilaskennassa puhutaan usein vektorin ”pituudesta”, kun oikeasti tarkoitetaan dimensiota.

Matriisitulo A B voidaan nyt määritellä soveltamalla tuloa A b kuhunkin B−matriisin sarakkeseen ja latomalla näin saadut sarakevektorit vierekkäin. Matriisin A rivin on oltava samanpituinen kuin B :n sarake. Jos A on m × n ja B on n × p, niin C = A B on m × p. Erityisesti neliömatriiseja voidaan aina kertoa keskenään ja tuloksena on samankokoinen neliömatriisi.

Matriisialgebraa

Samankokoisille matriiseille voidaan määritellä yhteenlasku vastinalkioittain aivan samoin kuin vektoreilla. Samoin määritellään luvun c ja matriisin tulo kertomalla kukin matriisin alkio c :llä. Samat laskusäännöt ovat voimassa. (Itse asiassa (m × n)-matriiseja voidaan näitä laskutoimituksia ajatellen pitää m n−ulotteisina vektoreina.)

Kun otamme kertolaskun mukaan, puhumme jatkossa yksinkertaisuuden vuoksi vain neliömatriiseista, jolloin matriisit ovat aina kertomiskelpoisia.

Kaikki vektorilaskennasta tutut laskusäännöt pätevät, mutta miten toimivat laskusäännöt, kun mukaan otetaan matriisikertolasku. Osoittautuu, että yhtä poikkeusta lukuunotamatta kaikki tutut algebran säännöt ovat voimassa. Niinpä liitännäisyys ja osittelulait pätevät. Siis A(B C) = (A B)C, A(B+C) = A B+A C, jne. Todistukset seuraavat matriisitulon määritelmästä suoraviivaisesti, mutta eivät ole samalla tavoin itsestäänselvyyksiä kuin vektorien laskuominaisuudet.

Entä päteekö vaihdannaisuus, eli onko A B = B A?

Tämä voidaan heti osoittaa vastaesimerkillä vääräksi. Voit ottaa melkein mitkä tahansa, vaikkapa 2×2− matriisit ja kertoa ne keskenään molemminpäin. Huomaat, että saat eri tulokset. Kokeile vaikka:

A = [ \begin{matrix}1 & 3 \\ −2 & 5 \end{matrix} ] , B = [ \begin{matrix}1 & −1 \\ 1 & −1 \end{matrix} ] .

A B = [ \begin{matrix}4 & −4 \\ 3 & −3 \end{matrix} ] , B A = [ \begin{matrix}3 & −2 \\ 3 & −2 \end{matrix} ] .

Suorita laskut käsin! Kokeile myös Scilab:lla, siinä kertomerkki (*) tarkoittaa juuri matriisikertolaskua. kuten edellä jo näimme.

Kenties elämäsi ensimmäisen kerran olet tekemisissä sellaisen laskentajärjestelmän kanssa, jossa kertolasku ei ole vaihdannainen.

Neliömatriisille A voidaan määritellä potenssi aivan kuten luvuille:

A^{p} = \underbrace{A A ⋯ A}_{p kertaa} .

Tehtävä: Päteekö neliömatriiseille binomin neliön kaava? Ellei, niin mihin muotoon on kirjoitettava: (A + B)^{2} = A^{2} + B^{2} + ?

Dynaamisia systeemejä, Markovin prosesseja

Monilla sovellusalueilla, kuten ekologiassa, kansantaloudessa, erilaisissa insinööritieteissä mallinnetaan ajan mukana muuttuvaa systeemiä. Systeemin tilaa ajanhetkellä t_{k} kuvatkoon vektori x_{k}. Puhutaan diskreetistä dynaamisesta systeemistä. Yksinkertaisinta tyyppiä on lineaarinen systeemi, jossa lähdetään alkutilasta x_{0} ja seuraavaan tilaan päästään kertomalla neliömatrisiilla A. Tällöin x_{1} = A x_{0}, x_{2} = A x_{1}, …, yleisesti:

x_{k+1} = A x_{k}, k = 0, 1, 2, …

Kuten heti nähdään, tehtävälle voidaan kirjoittaa ratkaisukaava: x_{k} = A^{k}x_{0}. Tässä yksi syy tarpeeseen oppia keinot, joilla matriisipotensseja voidaan tehokkaasti laskea.

Tarkastelemme erityistä tyyppiä olevia matriiseja, ns. stokastisia matriiseja, joita myös Markovin matriiseiksi kutsutaan. Näissä kaikki alkiot ovat ei-negatiivisia (a_{ij} ≥ 0) ja sarakesummat ovat = 1. Tällaisen matriisin määräämää dynaamista systeemiä kutsutaan Markovin prosessiksi.

Eduskuntavaalit

Aiheen ajankohtaisuuden vuoksi valitsen esimerkin, jossa joudun sotkeutumaan puoluepolitiikkaan. Aineistona käytän HS:n sunnuntaina 25.2.07 s. A4 julkaisemia, Suomen Gallupin keräämiä puolueiden kannatuslukemia. Lehdessä on julkaistu 9 × 9−matriisi, jossa riveillä on puolueiden kannatusprosentit. Matriisin sarakkeet edustavat kannatusmittauksia keskimäärin noin 2 : n kuukauden välein alkaen helmi-maaliskuusta 2006. (Sarake 1, Eduskuntavaalien 2003 tulos, jätetään pois.) Tehtävän yksinkertaistamiseksi tarkastelen vain kolmen suurimman puolueen keskinäisiä kannatusosuuksia. Annetusta matriisista valitaan siten 3 ensimmäistä riviä ja kukin sarake jaetaan sarakesummalla. (Voidaan tehdä hyvin elegantilla matriisilausekkeella Matlab/Scilab:ssa.)

Näin meillä on Gallup-matriisi G:

[ \begin{matrix}0.320 & 0.325 & 0.325 & 0.324 & 0.317 & 0.314 & 0.311 \\ 0.313 & 0.316 & 0.327 & 0.331 & 0.337 & 0.341 & 0.343 \\ 0.367 & 0.359 & 0.348 & 0.344 & 0.346 & 0.344 & 0.346 \end{matrix} ] .

Rivit ovat järjestyksessä (Kok, Ke, Sd) ja ajat 2/2006− −2/2007.

Kysymykset 1. Voidaanko prosessia kuvata Markovin matriisilla A ?

2. Jos voidaan, niin mistä tuo matriisi saadaan? Ohitetaan toistaiseksi nämä kysymykset ja tempaistaan ns. ”hatusta” tällainen Markovin matriisi:

A = [ \begin{matrix}0.93 & 0.02 & 0.04 \\ 0.03 & 0.93 & 0.04 \\ 0.04 & 0.05 & 0.92 \end{matrix} ]

Olkoon x_{0} = [k_{0}, c_{0}, d_{0}]^{T}, k=Kokoomus, c=Keskusta (”center”), d=Demarit. Nyt

A x_{0} = [ \begin{matrix}0.93 k_{0} + 0.02 c_{0} + 0.04 d_{0} \\ 0.03 k_{0} + 0.93 c_{0} + 0.04 d_{0} \\ 0.04 k_{0} + 0.05 c_{0} + 0.92 d_{0} \end{matrix} ] = x_{1} = [ \begin{matrix}k_{1} \\ c_{1} \\ d_{1} \end{matrix} ]

Rivi 1 sanoo: 93% Kok-kannattajista pysyy, 2% Ke-kannattjista ja 4% Sd-kannatajista siirtyy Kok-kannattajaksi. Aivan vastaavasti muut. Siten A−matriisin sarakkeet ilmaisevat sijamuotoa elatiivi (sta/stä) ja rivit illatiivia (een,uun,hin). Huomaa, että sarakesummat ovat 1 (Jokaisesta siirrytään jonnekin, mahdollisesti samaan.), mutta rivisummien ei tarvitse olla 1, voisihan joku puolue ääritapauksessa vaikka romahtaa totaalisesti ja päätyä 0−kannatukseen. Tämä näkyisi matriisissa ao. puolueen kohdalla nollarivinä. Matriisimme on varsin ”lävistäjävaltainen”, mikä merkitsee voimakasta puolueuskollisuutta.

Näin jatkaen johdumme Markovin prosessiin

x_{k+1} = A x_{k}, k = 0, 1, 2, …

Matriisin A ”tempaamisesta” todettakoon, että siinä on otettu huomioon lävistäjävaltaisuus ja lisäksi tehty kokeiluja ja säätöjä aineistoon nojautuen. Matriisia ei voida ratkaista aineiston perusteella saatavissa olevasta 9 × 9- yhtälöryhmästä, tämä ei yleensä tuottaisi Markovin matriisia.

Vektoria x_{0} voimme kutsua todennäköisyysvektoriksi: alkiot ovat ei-negatiivisia ja niiden summa = 1.

Todetaanpa tärkeä perusominaisuus yleiselle (n × n) Markovin matriisille: Jos x_{0} on todennäköisyysvektori, niin samoin ovat x_{1}, x_{2}, . . .. Perustelu:

1. Koska kukin a_{ij} ≥ 0, ja kukin x_{i} ≥ 0, lasketaan matriisi kertaa vektori-tulossa ei-negatiivisia termejä yhteen ja tulos ≥ 0.

2. Vektorin v alkioiden summa on sama kuin sisätulo (eli matriisitulo) [1, 1, …, 1] v (Ajatellaan v pystyvektorina, kuten yleensäkin.) Markovin matriisin sarakesummat = 1, joten [1, 1, …, 1] A = [1, 1, …, 1] , ja niinpä x_{1} :n alkioiden summa = [1, 1, …, 1] (A x_{0}) = ([1, 1, …, 1] A) x_{0} = [1, 1, …, 1] x_{0} = 1. Tässä käytimme matriisitulon liitännäisyyttä.

Mitäpä tapahtuu kelpo puolueillemme, saavatko selvää toisistaan?

Lähdetään iteroimaan helmikuusta 2006, ts. valitaan x_{0} = G-matriisin ensimmäinen sarake: Iteroidaan ihan vaan käsin kirjoitellen ohjelmallemme:

                                                --> A=[.93 .02 .04;.03 .93 .04;.04 .05 .92];
                                                --> x0=G(:,1)  // G:n 1. sarake
                                                --> x1=A*x0; x2=A*x1; x3=A*x2; x4=A*x3;
                                                --> x5=A*x4;x6=A*x5;x7=A*x6;
                                                --> [x0 x2 x4 x7]
                                                    '2/06'   '6/06   '10/06'  '2/07'
                                                   0.320    0.317    0.315    0.312  'Kok'
                                                   0.313    0.317    0.321    0.325  'Kepu'
                                                   0.367    0.365    0.364    0.363  'Sdp'

Kun verrataan viimeistä saraketta yllä annetun G−matriisin viimeiseen sarakkeeseen, nähdään, että Kokoomus on varsin tarkkaan kohdallaan, Kepu:n ja Sdp:n välillä mallinnuksemme on hiukan liikaa kallellaan jälkimmäiseen päin, tosin ajan kuluessa tuo näyttäisi hitaasti korjaantuvan. No, koska matrisiimme näinkin hyvin ennustaa ”oikeita” ennusteita, jatkamme eteenpäin mallia (A-matriisia) muuttamatta.

Miten sitten käy vaaleissa? Tällä mallilla ja aineistolla on turha toivoa saatavan mitään parempaa kuin G−matriisin viimeinen sarake. Joudun tässä suhteessa tuottamaan lukijalle pettymyksen, nuo mainiot matriisitkaan eivät auta meitä ennustamaan tulosta. Sensijaan voidaan kysyä, mitä tapahtuu pitkällä aikavälillä. Jatketaanpa iterointia, itse asiassa se on hyvin helppoa, koska x_{n} = A^{n}x_{0} ja matriisipotenssi ohjelmissamme on

                                                A^n

                                                -->[x0 (A^50)*x0 (A^70)*x0 (A^80)*x0]
                                                 ans  =
                                                    0.3201    0.3027    0.3025    0.3025
                                                    0.3129    0.3360    0.3361    0.3361
                                                    0.367     0.3613    0.3613    0.3613

Huomataan, että viimeistään 70 :n aikajakson jälkeen, eli n. 10 vuoden kuluttua prosessi on päätynyt kiintopisteeseen, josta se ei enää etene. Entä mitä vaikuttaa alkujakauma. Kokeillaan vaikka x0=[.6 .3 .1]';

                                                -->[x0 (A^10)*x0 (A^30)*x0 (A^50)*x0 (A^80)*x0]
                                                 ans =
                                                    0.6    0.3989    0.3133    0.3038    0.3026
                                                    0.3    0.3143    0.3318    0.3355    0.3361
                                                    0.1    0.2868    0.3549    0.3607    0.3613

->[x0 (A^10)*x0 (A^30)*x0 (A^50)*x0 (A^100)*x0]
 ans =
  0.6    0.3989    0.3133    0.3038    0.3025
  0.3    0.3143    0.3318    0.3355    0.3361
  0.1    0.2868    0.3549    0.3607    0.3613

Huomataan, että aivan ”vinossa olevasta” alkujakaumasta päädytään rajalla samaan tasapainojakaumaan. Toden totta, Markovin prosessi johtaa (tietyin yleisin lisäehdoin) samaan kiintopisteeseen, olipa alkujakauma mikä tahansa. Mutta miksi? Perustelu voidaan esittää hyvin tyylipuhtaasti ominaisarvoteorian sovelluksena. Sen esittely on pakko jättää johonkin myöhempään yhteyteen. Aihetta voit opiskella alla mainituista lähteistä sekä Googlella hakusanoilla ominaisarvot, eigenvalues, eigenvectors. Kerromme kuitenkin tuloksen: Rajajakauma on suurinta ominaisarvoa (1) vastaava ominaisvektori todennäköisyysvektoriksi normeerattuna. Annan lopuksi vaihteeksi aidon Matlab-ajon, jossa on tätä matriisiamme koskevat ominaisarvo/-vektoriloitsut, jotka paljastavat taikuuden:

>>  A=[.93 .02 .04;.03 .93 .04;.04 .05 .92];
>> [V,D]=eig(A);
>> lambda1=D(1,1);v1=V(:,1);
>> lambda1
lambda1 =
    1.0000
>> v1/sum(v1) % ominaisvektorin normeeraus.
    0.3025
    0.3361
    0.3613

Viitteet

1. David C. Lay Linear Algebra and its applications, 3^{rd} ed., Addison Wesley, 2003.

2. Gilbert Strang Introduction to Linear Algebra, 3^{rd} ed., Wellesley-Cambridge Press, 2003. Luentovideot MIT:n sivulla:

                                                  http://ocw.mit.edu/OcwWeb/Mathematics/
                                                  18-06Spring-2005/VideoLectures/index.htm

3. Wikipedia: Historiaa ja yleiskatsaus runsaine viitteineen

                                                  http://en.wikipedia.org/wiki/Linear_algebra

4. Heikki Apiola Luentoja TKK:lla syksyllä 2006

                                                  http://math.tkk.fi/opetus/kp3-ii/06/L/

5. Matlab/Scilab-kotisivut

                                                  http://www.mathworks.com/
                                                  http://www.scilab.org/

5. Heikki Apiola–Marko Laine Lyhyt Matlab-opas

                                                  http://math.tkk.fi/~apiola/matlab/opas/lyhyt/

6. Google-hakusanoja:

matriisi, matrix, vector, lineaarialgebra, linear algebra.