v202/L/Lineaarialgebra.mws
1.3.2002 HA
Warning, the name changecoords has been redefined
> restart:
Warning, the name changecoords has been redefined
Alustukset, aliakset, konversiot
>
with(LinearAlgebra):
with(linalg): # vanha kunnon 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
> #?LinearAlgebra # Poista kommentti, jos haluat nähdä pakkauksen funktiolistan.
Nimet ovat pitkiä. Lisää usein tarvitsemasi aliakset alla olevaan listaan.
> alias(Inv=MatrixInverse,IdM=IdentityMatrix,Diag=DiagonalMatrix):
> V2L:=vek->convert(vek,list):L2V:=lis->convert(lis,Vector):
LinearAlgebra vai linalg
Ryhdymme käyttämään ensisijaisesti LinearAlgebra-tyyliä.
[HAM]-kirjassa puhutaan vain linalg:sta (LinearAlgebra keksittiin vasta sen jälkeen.)
> 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,3>|<2,4>>;
Toisinaan on tietysti luonnollisempaa ajatella riveittäin. Sama matriisi tehtäisiin (luontevammin) siis näin:
> A:=<<1|2>,<3|4>>;
Matriiseja voi myös rakentaa komennolla Matrix , jolle annetaan argumentiksi vaakavektorien (listojen) lista. Matrix :lla on varsin kätevä funktiomuoto myös.
> A:=Matrix([[1,2],[3,4]]);
> A:=Matrix((i,j)->i-j,3,4);
Tässä jälkimmäisessä tavassa 1. argumenttina on indeksien funktio ja muina matriisin koko. Erittäin kätevä ja vahva funktio!
> Transpose(Vector([$1..5]));
Matriisin osien poiminen
> A:=Matrix((i,j)->j^i,3,5);
> A[1..2,3..5]; # Varsin "matlabmaista".
> A[1..3,[2,1,2,1,5,4,3,3,3]]; # Lisää matlabmaisuuksia:
>
Konversiotarpeita
Lista/vektorikonversiot. Kts. [HAM]. Näiden helpottamiseksi on yllä funktiot V2Lja L2V. Huomaa: [HAM]:ssa konvertoidaan ("to" vector) ja uudessa tyylissä ("to" Vector).
Konversiot linalg <-> LinearAlgebra-rakenteiden välillä käyvät helposti:
> A:=Transpose(<<seq(i,i=1..4)>|<4,3,2,1>>);
> Matrix([[$1..4],[4,3,2,1]]);
Jostain syystä edellisessä tavassa $1..4 ei kelpaa, vaan on tehtävä hieman kömpelömmin seq :lla.
> A.Transpose(A);
> a:=convert(A,matrix);
> B:=Matrix(a);
> a.Transpose(a);
Error, Transpose expects its 1st argument, MV, to be of type {scalar, Vector, Matrix}, but received a
Maple saattaa loukkaantua, jos uutta funktiota sovelletaan vanhaan tietorakenteeseen. Vanhan linalgin transpose alkaa pienellä.
> a.transpose(a);
> evalm(a&*transpose(a));
Konversio vanhaan matrix:iin on hiukan hankalampaa, tosin johdonmukaista, tarvitaan convert-funktiota. Uuteen Matrix:iin konversioon rittää soveltaa Matrix-funktiota.
Matriisialgebra
> A:=Matrix((i,j)->j^i,3,5);
> B:=Vector([1$5]);
> A.B;
> A:=<<1,1>|<1,0>>;
> A^2;
> seq(A^p,p=0..10);
Laskutoimitukset ovat nyt hyvin käteviä. (vanha linalg-tyyli on tähän verrattuna tuskaa.)