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

rivi := _rtable[134733768]

sarake := _rtable[134666684]

> M1:=<sarake | sarake>; M2:=<rivi,rivi>;

M1 := _rtable[137152596]

M2 := _rtable[137154380]

> M3:=<M2,rivi>;M4:=<M3 | sarake>;

M3 := _rtable[137310016]

M4 := _rtable[137312024]

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

A := _rtable[137290784]

Toisinaan on tietysti luonnollisempaa ajatella riveittäin. Sama matriisi tehtäisiin (luontevammin) siis näin:

> A:=<<1|2>,<3|4>>;

A := _rtable[137292848]

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 := _rtable[137300328]

> A:=Matrix((i,j)->i-j,3,4);

A := _rtable[135434588]

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

_rtable[137295088]

Matriisin osien poiminen

> A:=Matrix((i,j)->j^i,3,5);

A := _rtable[137370036]

> A[1..2,3..5]; # Varsin "matlabmaista".

_rtable[135482616]

> A[1..3,[2,1,2,1,5,4,3,3,3]]; # Lisää matlabmaisuuksia:

_rtable[135092816]

>

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

A := _rtable[137351148]

> Matrix([[$1..4],[4,3,2,1]]);

_rtable[137353484]

Jostain syystä edellisessä tavassa $1..4 ei kelpaa, vaan on tehtävä hieman kömpelömmin seq :lla.

> A.Transpose(A);

_rtable[137333868]

> a:=convert(A,matrix);

a := matrix([[1, 2, 3, 4], [4, 3, 2, 1]])

> B:=Matrix(a);

B := _rtable[137338180]

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

a.matrix([[1, 4], [2, 3], [3, 2], [4, 1]])

> evalm(a&*transpose(a));

matrix([[30, 20], [20, 30]])

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

A := _rtable[135335136]

> B:=Vector([1$5]);

B := _rtable[137295408]

> A.B;

_rtable[137295448]

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

A := _rtable[137324628]

> A^2;

_rtable[137514356]

> seq(A^p,p=0..10);

_rtable[136278452], _rtable[137324628], _rtable[137...

Laskutoimitukset ovat nyt hyvin käteviä. (vanha linalg-tyyli on tähän verrattuna tuskaa.)