http://math.tkk.fi/~apiola/08opemate/ominaisarvot.mw ja .html 

Heikki Apiola

Updated: Wed Oct 6 13:59:40 EEST 2010

 

 

Abstract 

The purpose is to teach linear mappins, their geometric meaning in the plane and especially the geometric idea of eigenvalues/eigenvectors. The worksheet contains several animations. They should be run by clicking the plot (the initial frame), which gives the user an animation toolbar. The most useful tool is perhaps the slider. This requires you to have Maple (or at least Maple reader (?)).  

There is an html-export: ominaisarvot.html (this file).  In this case no user interaction is possible, animations are running continuously, but nevertheless these examples might be useful in aquiring a geometric view for the basics of eigenvector theory. 

The rest of the explanations and comments are in Finnish (for the time being).

Alustukset 

     
> restart:
> with(LinearAlgebra):
with(linalg):
> with(plots):setoptions(scaling=constrained):setoptions3d(axes=boxed,orientation=[-30,50]):
> 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>>;
 

Matrix(%id = 405341660) (3.1.1)
 

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

Matrix(%id = 405653028) (3.1.2)
 

> S:=A.kolmio; # Kolmion kuva kuvauksessa A.
 

Matrix(%id = 405202436) (3.1.3)
 

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

Plot_2d Plot_2d

 

>
 

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

Matrix(%id = 405952504) (3.1.4)
 

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

Plot_2d Plot_2d

 

     
> #piirraMb(nelio);piirraM(A.nelio); # Yksitellen piirto antaa isomman ja muokattavan kuvan (tehdään tilanteen mukaan).
> 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]): # Matlab-tyylinen ympyrä
 > piirraMb(ympyra);
>piirraM(A.ympyra);
 

 

Plot_2d
Plot_2d
 

> ympyra[1..2,1..10];
 

Matrix(%id = 416540240)
Matrix(%id = 416540240)
Matrix(%id = 416540240)
Matrix(%id = 416540240)
(3.1.5)
 

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.  

> 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);  
Plot_2d
 

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

Plot_2d Plot_2d

 

Geometrisin kuvauksin annettuja lineaarikuvauksia 

1. Peilaus x-akselin suhteen: 

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

Matrix(%id = 403803864) (3.3.1)
 

> piirraMb(Hx.talo);
 

Plot_2d
 

2. Peilaus suoran y=x suhteen 

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

Matrix(%id = 417062472) (3.3.2)
 

> 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)]]));
 

Plot_2d Plot_2d

 

3. Peilaus O:n suhteen 

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

Matrix(%id = 405072164) (3.3.3)
 

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

Plot_2d Plot_2d

 

4. Vaakasuora skaalaus 

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

Matrix(%id = 405444220) (3.3.4)
 

 

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

Plot_2d
 

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

Plot_2d
 

Horizontal shear 

 

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

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

> piirraM(Shearx(2).talo);
 

Plot_2d
 

Projektio x-akselille 

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

Matrix(%id = 404876756) (3.3.6)
 

> piirraM(Projx.talo);
 

Plot_2d
 

Kierto 

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

proc (alpha) options operator, arrow; `<|>`(`<,>`(cos(alpha), sin(alpha)), `<,>`(`+`(`-`(sin(alpha))), cos(alpha))) end proc (3.3.7)
 

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

Plot_2d
 

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

Plot_2d
 

Yhdistelmiä 

a)  Iteroidaan "shear"-kuvausta 

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

Plot_2d
 

> 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ä
 

Plot_2d
 

>
 

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

Plot_2d
 

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>>;
 

Matrix(%id = 418585864) (4.1)
 

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

 

Vector[column](%id = 405426892)
`.`(A, u) = Vector[column](%id = 418648652) (4.2)
 

> kuvakulma(A,u);
 

Plot_2d
 

Valitaan toinen lähtöpiste  

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

 

Vector[column](%id = 416447716)
`.`(A, v) = Vector[column](%id = 418906516) (4.3)
 

> kuvakulma(A,v);
 

Plot_2d
 

> kuvakulma(A,-v);
 

Plot_2d
 

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); # Klikkaa kuvaa => saat animaatiovalikon. Aja kehys kerrallaan tai jatkuvasti. Valikon saat kuvasta myös hiiren oikeaa painamalla, mutta edellinen on helpompi ja monipuolisempi. Tässa on ehkä opettavaisinta k"yttaa liukuluikuria.
 

Plot_2d
 

> nuolikimppu(A,80);
 

Plot_2d
 

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 ja n"yttää vektorien ratakäyrat.) 

Esim 2. 

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

Matrix(%id = 405423620) (4.4)
 

> nuoletAni(A,80); #Klikkaa animaatiovalikko.
 

Plot_2d
 

>
 

> #piirraM(A.talo); piirraM(A.ympyra);
 

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:=Determinant(A-lambda*Id(2));Lambda:=solve(karpoly=0,lambda);
 

>
 

 

`+`(`-`(28), `-`(`*`(3, `*`(lambda))), `*`(`^`(lambda, 2)))
7, -4 (4.5)
 

> Eigenvectors(A); # Katsotaan valmiilla funktiolla.
 

Vector[column](%id = 418648156), Matrix(%id = 418363688) (4.6)
 

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>;
 

 

Vector[column](%id = 417267700)
Vector[column](%id = 416886080) (4.7)
 

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

 

Vector[column](%id = 418512520) = Vector[column](%id = 419197880)
Vector[column](%id = 417090320) = Vector[column](%id = 418838308) (4.8)
 

Niinpä on! 

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

>
 

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

Plot_2d
 

> Norm(v1,2);
 

`*`(`^`(2, `/`(1, 2))) (4.9)
 

>
 

>
 

>
 

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)>>;
 

Matrix(%id = 419535404) (4.10)
 

> phi:=Pi/4:nuoletAni(A,40); # Animaatio, klikkaa kuvaa.
 

Plot_2d
 

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:=Determinant(A-lambda*Id(2));
  
 

`+`(1, `-`(`*`(`^`(2, `/`(1, 2)), `*`(lambda))), `*`(`^`(lambda, 2))) (4.11)
 

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

`+`(`*`(`/`(1, 2), `*`(`^`(2, `/`(1, 2)))), `*`(`*`(`/`(1, 2), `*`(I)), `*`(`^`(2, `/`(1, 2))))), `+`(`*`(`/`(1, 2), `*`(`^`(2, `/`(1, 2)))), `-`(`*`(`+`(`*`(`/`(1, 2), `*`(I))), `*`(`^`(2, `/`(1, 2))... (4.12)
 

> #Eigenvectors(A);
 

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

 

Matrix(%id = 416556980)
Matrix(%id = 405266272) (4.13)
 

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

 

x
t (4.14)
 

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

`*`(I, `*`(t)) (4.15)
 

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

Vector[column](%id = 416421284) (4.16)
 

> lam[1];
 

`+`(`*`(`/`(1, 2), `*`(`^`(2, `/`(1, 2)))), `*`(`*`(`/`(1, 2), `*`(I)), `*`(`^`(2, `/`(1, 2))))) (4.17)
 

> v;A;
 

 

Vector[column](%id = 416421284)
Matrix(%id = 419535404) (4.18)
 

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

Vector[column](%id = 416911104), Vector[column](%id = 419417204) (4.19)
 

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>>;
 

Matrix(%id = 418281684) (4.20)
 

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

`*`(`^`(`+`(1, `-`(lambda)), 2)) (4.21)
 

> eigenvectors(A1);
 

[1, 2, {array( 1 .. 2, [( 1 ) = 1, ( 2 ) = 0 ] )}] (4.22)
 

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);
 

Plot_2d
 

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.
 

Plot_2d
 

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

> nuolikimppu(A1,80);
 

Plot_2d