>
../L/ominaisarvot.mws
pe 1.3.02
> restart:
Warning, the name changecoords has been redefined
>
Alustukset
>
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]):
with(plottools):
> alias(Inv=MatrixInverse,IdM=IdentityMatrix,Diag=DiagonalMatrix):
>
V2L:=vek->convert(vek,list):
v2l:=vek->convert(vek,list):
L2V:=lis->convert(lis,Vector):
l2v:=lis->convert(lis,vector):
>
#read("c:\\opetus\\maple\\v202.mpl"):
#read("/home/apiola/opetus/peruskurssi/v2-3/maple/v202.mpl");
#read("/p/edu/mat-1.414/maple/v202.mpl"):
LinearAlgebra vs. linalg
Kerrataanpa tässä osin samoja asioita, joita on L/Lineaarialgebra.mws:ssä .
> rivi:=<1 | 2 | 3>;sarake:=<1,2,3>;M1:=<sarake | sarake>; M2:=<rivi,rivi>;M3:=<M2,rivi>;M4:=<M3 | sarake>;
Tämä on kätevää ja havainnollista. Pidämme sarakkeittain latomista ensisijaisena tapana, se esiintyy hyvin usein oikeasti. Siis sovitaan perustyyliksi:
> A:=<<1,2>|<3,4>>;
Toisinaan on tietysti luonnollista ajatella riveittäin. Sama matriisi tehtäisiin siis näin:
> A:=<<1|3>,<2|4>>;
Alla on käytetty myös linalg-tyyylin muunnelmaa uuteen kirjoittamalla matrix :n sijasta Matrix .
>
M4[1,[1,2,3,2,2,2,2]]; # 1. rivin sarakkeet 1,2,3,2,2,2,2
M4[1..3,3]; # 3. sarakkeen kaikki rivit (1..3), eli koko 3. sarake
> M4[1..2,1..2]; # Osamatriisi.
Ominaisarvojen laskentaa Maplella
>
Käsinlaskutyyli vs. eigenvectors/Eigenvectors
>
A:=<<2,0,4> | <0,6,0> | <4,0,2>>; Id:=IdM(3); # IdM on alias.
> p:=det(A-lambda*Id);factor(p);# Karakteristinen polynomi
>
lam:=solve(%=0,lambda);
Ominaisarvon 6 algebrallinen kartaluku on 2.
>
M1:=A-lam[1]*Id;
M2:=A-lam[2]*Id;
>
gaussjord(M1),gaussjord(M2);
lam[1]=-2, M1: x2=0, x3=t, x1=-t, eli v1=[-1,0,1]
lam[2]=6, M2: x2=s, x3=t, x1=x3=t, v2=[1,0,1], v3=[0,1,0].
Ominaisarvoon liittyy kaksi LRT ominaisvektoria, joten tämän ominaisarvon geometrinen kertaluku = 2. (Algebrallinen kertalukuhan on myös 2.)
Katsotaan vielä valmiilla funktioilla:
> Eigenvectors(A);
Ominaisarvosarake ja samassa järjestyksessä ominaisvektorisarakkeet.
Tästä on kätevää poimia.
Katsotaan vanhalla kunnon linalg-tyylillä:
>
eigenvectors(A); # eigenvectors ei pane pahakseen, vaikka matriisirakenne on uudenaikainen.
[Ominaisarvo, alg. kertaluku,{ominaiskanta}], [Ominaisarvo, alg. kertaluku,{ominaiskanta}]
Tämä on havainnollinen katsoa, mutta hieman hankalampi poimia.
Kannattaa kokeilla kumpaakin.
Esim: Lausuttava annettu vektori matriisin ominaisvektorikannassa
> A:=<<9/10,1/10>|<3/10,7/10>>;
>
om:=Eigenvectors(A);
>
lam:=om[1];
>
ov:=om[2];
> v1:=ov[1..2,1];v2:=ov[1..2,2];
Tarkistetaan ominaisarvo/vektoriominaisuus:
>
A.v1 = lam[1]*v1;
A.v2 = lam[2]*v2;
Ladotaan ominaisvektorit vierekkäin matriisiksi. Koska vektorit liittyvät eri ominaisarvoon, tiedämme jo suoraan, että ne ovat LRT. Siten niiden muodostama matriisi on kääntyvä.
>
V:=<v1 | v2>;
Olkoon u annettu mieleivaltainen vektori.
> u:=<-1,2>;
>
c:=LinearSolve(V,u);
Tässä ovat vektorin u koordinaatit kannassa {v1,v2}.
Tarkistetaan vielä:
> c[1]*v1+c[2]*v2;
Kyllä vaan!
Esimerkkejä defektiivisistä matriiseista
Kyse on matriiseista, joilla ei ole tarpeeksi ominaisvektoreita.
> A1:=<<1,0>|<1,1>>; A2:=<<1,1>|<-1,-1>>; A3:=<<0,0>|<1,0>>;
A3 on Strangin mukaan (s. 252) paras esimerkki testaamaan ominaisarvoväittämiä. Monissa tosi/epätosi-kysymyksissä tämä antaa vastauksen "epätosi".
> map(eigenvectors,[A1,A2,A3]);
Asia selvisi kerralla. Kaikissa kaksinkertainen ominaisarvo (A1:ssä 1, muissa 0). Jokaisessa vain 1-ulotteinen ominaisavaruus.
(Jopa kolmen eri matriisin voimin). Katsotaan vielä uutta tyyliä:
> map(Eigenvectors,[A1,A2,A3]);
Tämä tulos on hiukan hämmentävän näköinen. Ominaisvektorimatriisn nolla-sarakkeet täytyy tulkita tyhjiksi.
> p:=det(A3-lambda*IdM(2));
> M:=A3-0*IdM(2);
x2=0, x1=t, eli t*[1,0] on ominaisavaruus, kuten valmiit eigenvectors- ja Eigenvectors-funktiot jo laskivat.
Lineaarikuvaukset tasossa ja niiden havannollistaminen.
Seuraavilla komennoilla voidaan havainnollistaa minkä tahansa tason lineaarikuvakusen käyttäytymistä. Kun halutaan vaihtaa kuvausta, niin vaihdetaan alla oleva A-matriisi. Suorita alla olevat rivit ja tee itsellesi selväksi, mistä on kyse. Kokeile eri kulmia Theta . Voit rakentaa myös animaation tallettamalla useita kuvia varastoon ja tulostamalla ne komennolla: display([kuva1, kuva2, kuva3,...],insequenze=true);
Tässä sitten tehtävä: Selvittele matriisien A1, B1, C1 kuvausominaisuuksia. Löydätkö suuntia, joissa lähtö (sininen) ja kuva (punainen) ovat samansuuntaiset (suunnilleen). Kuvaile myös sanallisesti, mitä kukin kuvaus tekee. (KRE p. 420)
> A1:=Matrix([[0,1],[1,0]]); B1:=Matrix([[1,0],[2,1]]); C1:=Matrix([[0,1],[-1,0]]); D1:=Matrix([[1,0],[0,-1]]); E1:=Matrix([[-1,0],[0,-1]]);
Tarvitsemme usein funktiota v2l, joka on v202.mpl-tiedostossa ja yllä. Koodi on kaikessa koruttomuudessaan vain tämä:
> print(V2L);
>
A:=A1:
o:=<0,0>;
Theta:='Theta': u:=<cos(Theta),sin(Theta)>;
v:=A.u;
Theta:=Pi/3:
>
lahto:=arrow(V2L(o), V2L(u), 0.01, 0.05, 0.02, color=blue):
kuva:=arrow(V2L(o), V2L(v), 0.01, 0.05, 0.02, color=red):
display([lahto,kuva]);
Idea on, että sininen nuoli edustaa yksikkövektoria, joka kuvataan A:lla kertomalla punaiseksi nuoleksi. Tässä voidaan kulmaa Theta vaihtelemalla nähdä eri
lähtövektoreiden kuvat. Kohta alkavat paineet kasvaa animaation tekemiseen.
Animaatio
>
#A:=0.5*<<1,1>|<1,1>>;
A:=<<1,0>|<1,1>>;
o:=<0,0>:
Theta:='Theta': u:=<cos(Theta),sin(Theta)>:
v:=A.u:
n:=35: h:=2*Pi/n: Theta:=seq(i*h,i=0..n):
uut:=seq(Vector([evalf(cos(Theta[i])),evalf(sin(Theta[i]))]),i=1..n+1):
veet:=map(u->A.u,[uut]):
snuoli:=u->arrow(v2l(o),v2l(u),0.01,0.05,0.02,color=blue):
pnuoli:=u->arrow(v2l(o),v2l(u),0.01,0.05,0.02,color=red):
>
kuvajono:=seq(display([snuoli(uut[i]),pnuoli(veet[i])]),i=1..n+1):
siniset:=seq(display([snuoli(uut[i])]),i=1..n+1):
> display([siniset],scaling=constrained);
> display([kuvajono],insequence=true,axes=none);
> eigenvectors(A);
> display([snuoli(uut[10]),pnuoli(veet[10])]);
> Eigenvectors(A);
> Theta:='Theta':u;v;
> useq:=op(v2l(u));vseq:=op(v2l(v));
> plot([[useq,Theta=0..2*Pi],[vseq,Theta=0..2*Pi]],color=[blue,red]);
Pääakseliprobleema
>
snuoli:=u->arrow([0,0],v2l(u),0.01,0.05,0.02,color=blue):
pnuoli:=u->arrow([0,0],v2l(u),0.01,0.05,0.02,color=red):
mnuoli:=u->arrow([0,0],v2l(u),0.01,0.05,0.02,color=black):
> #A:=<<5,2>|<2,2>>;#A:=<<3,2*sqrt(3)>|<2*sqrt(3),7>>;
> #A:=<<0,1>|<1,0>>;
> A:=<<17,-15>|<-15,17>>; # KRE:n esimerkki
> Eigenvectors(A);X:=%[2]/sqrt(2);
>
> Q:=<x1|x2>.A.<x1,x2>;qyht:=expand(Q)=128;
> a:=8: b:=2: # Laskettiin käsin.
> y1:=a*cos(t): y2:=b*sin(t):
> plot([y1,y2,t=0..2*Pi],scaling=constrained);
> x12:=X.<y1,y2>;display([plot([op(v2l(x12)),t=0..2*Pi]),mnuoli(X[1..2,1]),mnuoli(X[1..2,2])]);
> implicitplot(qyht,x1=-6..6,x2=-6..6,color=black);