>   

Ominaisarvot.mws

Tampere06/ominaisarvot.mws, Heikki Apiola, TKK

Alustukset

>    restart:

>    with(LinearAlgebra):
with(linalg):

Warning, the previous binding of the name GramSchmidt has been removed and it now has an assigned value

Warning, the protected names norm and trace have been redefined and unprotected

>    with(plots):setoptions(scaling=constrained):setoptions3d(axes=boxed,orientation=[-30,50]):

Warning, the name changecoords has been redefined

>    alias(Inv=MatrixInverse,Id=IdentityMatrix,Diag=DiagonalMatrix,Tr=Transpose):

>    alias(rref=ReducedRowEchelonForm):alias(ref=GaussianElimination):
alias(Id=IdentityMatrix):

Määritellään apufunktioita.  

Ovat kertakäyttöluonteisia, helposti lennossa modifioitavia.

 1.  Muotoa   [xdata ]

                     [ydata ]

 olevan matriisin määräämien pisteiden polygonipiirto  Vastaa Matlabin plot(xdata,ydata) - komentoa.

>    piirraM:=dataM->plot(convert(Transpose(dataM),listlist),axes=box,scaling=constrained):

>    piirraMb:=dataM->plot(convert(Transpose(dataM),listlist),color=blue,axes=box): # Sama sinisellä (värin olis voinut laittaa lisäargumentiksi, mutta näin on vähemmän koodia.)

>    piirraMr:=dataM->plot(convert(Transpose(dataM),listlist),color=red,axes=box): # Varmuudeksi vielä punaisella, vaikka onkin oletus.

Yllä olevat sopivat erilaisten alueiden kuvautumistehtäviin .

Seuraavaksi katsotaan yksittäisten vektorien kuvautumista, erityisesti ominaisvektorihavainnollistuksiin.

Funktio plots[arrow]  mahdollistaa hyvin mainion helpon tavan nuolikuvioon, jossa sinisellä  annetaan lähtönuoli ja punaisella  sen kuvanuoli , kas näin:

>    kuvakulma:=(A,u)->display(arrow(u,shape=arrow,color=blue),arrow(A.u,shape=arrow,color=red),scaling=constrained,title="Lahto:sininen, kuva:punainen"):

Haluamme katsoa kuvauksen dynamiikkaa animaationa, se käy taas kuin unelma. Jaetaan täyskulma n:ään osaan ja jokaista kohti piirretään sininen yksikkövektori ja sen punainen kuva. Ajetaan animaationa ( insequence=true ).

>    nuoletAni:=(A,n)->display(seq(kuvakulma(A,<cos(Theta),sin(Theta)>),Theta=[seq(kkk*2*Pi/n,kkk=0..n)]),insequence=true,scaling=constrained):

Joskus on mukavaa (ainakin esteettisesti) katsoa kuvaa staattisesti jättäen kaikki nuolet kuvaan mukaan. Muuten sama, mutta " insequence=false "

>    nuolikimppu:=(A,n)->display(seq(kuvakulma(A,<cos(Theta),sin(Theta)>),Theta=[seq(kkk*2*Pi/n,kkk=0..n)]),insequence=false,scaling=constrained):

Lineaarikuvaukset tasossa ja niiden havannollistaminen

Monikulmion kuvautuminen

Kokeillaan määrittelemiämme funktioita:

>    A:=<<3,1>|<-2,0>>;

A := Matrix(%id = 3122284)

>    kolmio:=<<-1,0>|<1,0>|<0,1>|<-1,0>>;

kolmio := Matrix(%id = 18743564)

>    S:=A.kolmio;

S := Matrix(%id = 21168764)

>    display(array([[piirraMb(kolmio),piirraMr(S)]]));

[Maple Plot]

>   

>    nelio:=<<0,0>|<1,0>|<1,1>|<0,1>|<0,0>>;

nelio := Matrix(%id = 21653148)

>    display(array([[piirraMb(nelio),piirraMr(A.nelio)]]));

[Maple Plot]

>    piirraMb(nelio);piirraM(A.nelio); # Yksitellen piirto antaa isomman ja muokattavan kuvan (tehdään tilanteen mukaan).

[Maple Plot]

[Maple Plot]

>    N:=50: h:=2*Pi/N:t:=seq(k*h, k=1..N+1):x:=map(cos,[t]): y:=map(sin,[t]):

>    ympyra:=Matrix([x,y]):

>    piirraMb(ympyra); piirraM(A.ympyra);

[Maple Plot]

[Maple Plot]

Ympyrän kuva näyttää ellipsiltä, onkohan näin aina?

Strangin talo

Gilbert Strang: An Introduction to Linear Algebra, kts, myös MIT-luentoja)

Ympyröiden, kolmioiden, neliöiden ym. lisäksi "Strangin talo" on hyvä esimerkkikuvio linaarikuvausten havainnollistamisessa. (Muita kuuluisia on mm.

"Arnoldin kissa".)

>    talo:=Tr(<<0,0,-1,6,13,12,12,3,3,6,6,0>|<0,9,8,15,8,9,0,0,5,5,0,0>>):

>    #piirraMb(talo);

>    display(array([[piirraMb(talo),piirraMr(A.talo)]]));

[Maple Plot]

Geometrisin kuvauksin annettuja lineaarikuvauksia

1. Heijastus x-akselin suhteen:

>    Hx:=<<1,0>|<0,-1>>;

Hx := Matrix(%id = 16451692)

>    piirraMb(Hx.talo);

[Maple Plot]

2. Heijastus suoran y=x suhteen

>    Hyy_on_x:=<<0,1>|<1,0>>;

Hyy_on_x := Matrix(%id = 2869124)

>    kolmio:=<<0,0>|<1,1>|<0,1>|<0,0>>:

>    #piirraMb(kolmio);piirraM(Hyy_on_x.kolmio);#piirraM(Hy.(Hy.kolmio));

>    display(array([[piirraMb(talo),piirraMr(Hyy_on_x.talo)]]));

[Maple Plot]

3. Heijastus O:n suhteen

>    Ho:=<<-1,0>|<0,-1>>;

Ho := Matrix(%id = 2732720)

>    display(array([[piirraMb(talo),piirraMr(Ho.talo)]]));

[Maple Plot]

4. Vaakasuora skaalaus

>    d:='d':Svaaka:=<<d,0>|<0,1>>;

Svaaka := Matrix(%id = 17320868)

>    d:=0.3:piirraMr(Svaaka.talo);

[Maple Plot]

>    d:=3:piirraMr(Svaaka.talo);

[Maple Plot]

Horizontal shear

>    Shearx:=k-><<1,0>|<k,1>>;

Shearx := proc (k) options operator, arrow; `<|>`(`<,>`(1,0),`<,>`(k,1)) end proc

>    piirraM(Shearx(2).talo);

[Maple Plot]

Projektio x-akselille

>    Projx:=<<1,0>|<0,0>>;

Projx := Matrix(%id = 17809980)

>    piirraM(Projx.talo);

[Maple Plot]

Kierto

>    Kierto:=alpha-><<cos(alpha),sin(alpha)>|<-sin(alpha),cos(alpha)>>;

Kierto := proc (alpha) options operator, arrow; `<|>`(`<,>`(cos(alpha),sin(alpha)),`<,>`(-sin(alpha),cos(alpha))) end proc

>    piirraM(Kierto(Pi/6).talo);

[Maple Plot]

>    display(seq(piirraM(Kierto(Pi/6)^k.talo),k=1..10),insequence=true);

[Maple Plot]

Yhdistelmiä

a)  Iteroidaan "shear"-kuvausta

>    display(seq(piirraM(Shearx(1.2)^k.talo),k=0..6),insequence=true);

[Maple Plot]

>    A:='A':

>    A[1]:=talo: A[2]:=Shearx(1.5).talo: A[3]:=Hyy_on_x.A[2]:

>    #A[1];piirraM(A[1]);

>    display(seq(piirraM(A[k]),k=1..3),insequence=true); # Tehdään sama toisessa järjestyksessä.

[Maple Plot]

>   

>    display(seq(piirraM(A[k]),k=[1,3,2]),insequence=true);

[Maple Plot]

Samat lineaarikuvaukset eri järjestyksessä tuottavat eri tuloksen.

 Ominaisvektoreiden (ja -arvojen) havainnollistusta nuolikuvin

Yllä määritelty kuvakulma  ja siihen pohjautuva nuoletAni   (ja nuolikimppu ) ovat nyt onnen omiaan.

Esim 1.

>    A:=<<3,1>|<-2,0>>;

A := Matrix(%id = 18888324)

>    u:=<-1,1>; 'A.u'=A.u;

u := Vector(%id = 18874668)

A.u = Vector(%id = 19031372)

>    kuvakulma(A,u);

[Maple Plot]

Valitaan toinen lähtöpiste

>    v:=<2,1>; 'A.v'=A.v;

v := Vector(%id = 19267476)

A.v = Vector(%id = 19405876)

>    kuvakulma(A,v);

[Maple Plot]

>    kuvakulma(A,-v);

[Maple Plot]

No kävipä ihmeellinen sattuman oikku! Lähtö ja kuva osuivat samalle suoralle!!  

Jos näin ihmeellisesti käy, sanotaan, että kyseessä on A:n ominaisvektori . Kuvan mukaan näyttäisi siltä, että punainen nuoli on n. 2 kertaa sinisen

pituinen.  Siinä tapauksessa sanotaan, että vastaava ominaisarvo  = 2 .

Miten hakisimme yleisemmin? Otetaan (sinisiä) yksikkövektoreita sopivan tiheästi  ja kuvataan A:lla. Toisin sanoen jaetaan yksikköympyrän kehä

tasavälisesti riittävän hienolla jaolla.

Tässä koodi, jonka kokosimme yllä funktioksi nuoletAni

>    #n:=80:display(seq(kuvakulma(A,<cos(Theta),sin(Theta)>),Theta=[seq(k*2*Pi/n,k=0..n)]),insequence=true,scaling=constrained);

>    nuoletAni(A,80);

[Maple Plot]

>    nuolikimppu(A,80);

[Maple Plot]

Tässä näkyy kummankin nuolen rata, mutta ei se, mikä sininen kuvautuu millekin punaiselle. Siispä ominaisvektorit eivät tästä staattisesta kuvasta paljastu. (Mutta esteettistä mielihyvää se voi tuottaa, ja sitäpaitsi ehkä selventää edellisen funktion toimintaperiaatetta.)

Esim 2.

>    A:=<<1,5>|<6,2>>;

A := Matrix(%id = 18777988)

>    nuoletAni(A,80);

[Maple Plot]

>    piirraM(A.Talo); piirraM(A.ympyra);

Plotting error, empty plot

[Maple Plot]

Nuolet pyörivät nyt vastakkaisiin suuntiin, Toinen ominaissuunta on siinä, missä vektorit ovat päällekkäin, toinen siinä, missä ne ovat vastakkaissuuntaiset.

No lasketaan:

>    karpoly:=det(A-lambda*Id(2));Lambda:=solve(karpoly=0,lambda);

>   

karpoly := lambda^2-3*lambda-28

Lambda := 7, -4

>    Eigenvectors(A); # Katsotaan valmiilla funktiolla.

Vector(%id = 17724476), Matrix(%id = 17800228)

Ominaisvektoria [1,1] matriisi A venyttää kertoimella 7 ja vektoria [-6,5] kertoimella 4, miinus-merkki tarkoittaa, että vektorit ovat vastakkaissuuntaiset.

Tarkistetaan vielä:

>    v1:=<1,1>; v2:=<-6,5>;

v1 := Vector(%id = 18002876)

v2 := Vector(%id = 18002916)

>    A.v1=7*v1;A.v2=-4*v2;

Vector(%id = 18184292) = Vector(%id = 18002956)

Vector(%id = 18531904) = Vector(%id = 18395860)

Niinpä on!

>    N:=50: h:=2*Pi/N:t:=seq(k*h, k=1..N+1):x:=map(cos,[t]): y:=map(sin,[t]):

>    ympyra:=Matrix([x,y]):

>    display(piirraM(A.ympyra),piirraMb(ympyra),arrow([7*v1/norm(v1,2),4*v2/norm(v2,2)],scaling=constrained,shape=arrow));

[Maple Plot]

Sininen yksikköympyrä, punainen kuvaellipsi, yksikköominaisvektorien kärjet ovat nuolien ja sinisen ympyrän leikkauspisteissä, ominaisarvoilla kerrottuna ne

yltävät ellipsin kehälle puoliakselien kohdalla.

Esim 3  Onko kiertokuvauksella ominaisarvoja/vektoreita?

>    A:=<<cos(phi),sin(phi)>|<-sin(phi),cos(phi)>>;

A := Matrix(%id = 17623380)

>    phi:=Pi/4:nuoletAni(A,40);

[Maple Plot]

No ei sitten millään voi olla ominaisarvoja, nuolet pyörivät samaa vauhtia, eivätkä missään mene päällekkäin.

Mutta mutta ... mehän sallimme myös kompleksiset skalaarit. Kompleksikertlaskuhan on tason kiertoa!

Lasketaanpa!

>    karpoly:=det(A-lambda*Id(2));
   

karpoly := lambda^2-lambda*2^(1/2)+1

>    lam:=solve(karpoly=0,lambda);

lam := 1/2*2^(1/2)+1/2*I*2^(1/2), 1/2*2^(1/2)-1/2*I*2^(1/2)

>    #Eigenvectors(A);

>    M1:=A-lam[1]*Id(2);rM1:=ref(M1);

M1 := Matrix(%id = 17710732)

rM1 := Matrix(%id = 21374272)

>    x:='x';t:='t';

x := 'x'

t := 't'

>    x2:=t: x1:=solve(rM1[1,1]*x+rM1[1,2]*x2=0,x);

x1 := t*I

>    v:=subs(t=1,<x1,x2>);

v := Vector(%id = 17954492)

>    lam[1];

1/2*2^(1/2)+1/2*I*2^(1/2)

>    v;A;

Vector(%id = 17954492)

Matrix(%id = 17623380)

>    A.v,map(evalc,lam[1].v);

Vector(%id = 21817144), Vector(%id = 17678896)

Samoja ovat, joten oikein laskettiin. Toinen ominaisarvo/vektori saadaan kompleksikonjugoimalla.

Kysymys : Onko nyt niin, että joko nuolet menevät jossain päällekkäin (reaaliset ominaisarvot) tai kyseessä on kierto.

Vastaus:   Kyllä, paitsi kiertoon voi yhdistyä venytys/kutistus (kertominen reaalisella skalaarilla).

Onko tässä siis kaikki , mitä 2 x 2-matriisesita voidaan yleisesti sanoa? Eipä olekaan!

Kukaan ei ole sanonut, että ominaisvektoreita on aina kaksi lineaarisesti riippumatonta. No onko vai ei?

>    A1:=<<1,0>|<1,1>>; #A2:=<<1,1>|<-1,-1>>; A3:=<<0,0>|<1,0>>;

A1 := Matrix(%id = 2418256)

>    karpoly1:=det(A1-lambda*Id(2));#karpoly2:=det(A2-lambda*Id(2));karpoly3:=det(A3-lambda*Id(2));

karpoly1 := (-lambda+1)^2

>    eigenvectors(A1);

[1, 2, {vector([1, 0])}]

Tämä tarkoittaa, että A1:n ominaisrvo 1 on kaksinkertainen (senhän jo näimme edellä), ja sillä on vain yksi LRT ominaisvektori [1,0]. Tutkitaanpa:

>    nuoletAni(A1,80);

[Maple Plot]

Huomataan, että nuolet menevät kaksi kertaa samalle suoralle, mutta kyseessä on sama x-akseli kummallakin kertaa. Sillä perusteella on vain yksi LRT ominaisvektori. Tässä tapauksessa mistään kompleksikosmoksesta ei voi tipahtaa ylimääräisiä ominaisvektoreita, sillä kompleksitapauksessa kaksinkertainen ominaisarvo ei ole mahdollinen. (Miksi?)

>    piirraM(A1.ympyra); # Vertaa tätä edelliseen animaatioon, niin ymmärrät. Nyt ei max venymä/kutistuma edustakaan ominaisarvoa.

[Maple Plot]

Kysymys: Ovatko ellipsin puoliakselivektorit hyödyllisiä, miten ne liittyvät yleisiin lineaarialgebrakäsitteisin?

>    nuolikimppu(A1,80);

[Maple Plot]

>   

>   

>   

Tämä kuva on kaunis, mutta siitä ei näe, mikä sininen kuvautuu millekin punaiselle.