Lineární algebra

Poslední kapitolou, které se v tomto rychlém "kurzu symbolické matematiky MAPLE" budeme věnovat, je lineární algebra. Základní příkazy pro vytvoření vektorů a matic byly sice již ukázány, ale pro další (netriviální) práci s nimi je nezbytné načíst potřebné knihovní funkce (linalg). Tento balík je však značně rozsáhlý, a proto se v našem výkladu omezíme pouze na jeho základní rysy.

> with(linalg);

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

[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...

K vytvoření matice složí příkazy vector a matrix , popsané v minulém výkladu. Mimo nich lze ještě pouřívat různé příkazy na vytvoření "specifických" matic.

> m1:=array(1..2,1..2,[[1,2],[3,4]]); # známé
m:=array(symmetric,1..2,1..2); m[1,2]:=a; print(m); # nebo lze specifikovat

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

m := array(symmetric,1 .. 2,1 .. 2,[])

m[1,2] := a

matrix([[m[1,1], a], [a, m[2,2]]])

Lze použít samozřejmě i jiné názvy typů, např. antisymmetric, diagonal, ... viz indexing functions .

> m2:=matrix(3,3,(i,j)->i+j); # "klasický" příkaz matrix, s indexací

m2 := matrix([[2, 3, 4], [3, 4, 5], [4, 5, 6]])

> T:=toeplitz( [1,2,3] ); # vytvoření Toeplitzovy matice z prvního řádku

T := matrix([[1, 2, 3], [2, 1, 2], [3, 2, 1]])

Další specifiké matice, lze vytvořit příkazy: JordanBlosk, bezout, companion, fibonacci, grad, hessian, hilbert, jacobian, sylvester, vandermonde, wronskian, podobně jako toeplitz.

Základní početní operace s maticemi.

> m2+T; # nedá očekávaný výsledek
evalm(%); # použití "maticového" vyčíslení pomůže
evalm(2*m-1);

m2+T

matrix([[3, 5, 7], [5, 5, 7], [7, 7, 7]])

matrix([[2*m[1,1]-1, 2*a], [2*a, 2*m[2,2]-1]])

> evalm(m2*T); # pozor na maticové násobení
evalm(m2&*T); # zde je uveden správný znak &* pro maticové násobení

Error, (in evalm/evaluate) use the &* operator for matrix/vector multiplication

matrix([[20, 15, 16], [26, 20, 22], [32, 25, 28]])

> evalm(T&*1/T^2); # ale pozor, nelze násobit T*1 maticově
evalm(T&*(1/T^2)); # tady už je vše v pořádku

Error, (in evalm/amperstar) &* is reserved for matrix multiplication

matrix([[-3/8, 1/2, 1/8], [1/2, -1, 1/2], [1/8, 1/2...

Základní maticové funkce.

> det(m); # výpočet determinantu matice

m[1,1]*m[2,2]-a^2

> map(x -> 2*x,T);
det(%);

matrix([[2, 4, 6], [4, 2, 4], [6, 4, 2]])

64

Funkce map je zde velmi užitečná. Provádí uvedenou operaci postupně na všechny prvky. Lze ji aplikovat prakticky na všechny datové strukrury a lze v ní používat téměř všechny funkce MAPLE.

> inverse(m); # výpočet inverzní matice

matrix([[m[2,2]/(m[1,1]*m[2,2]-a^2), -a/(m[1,1]*m[2...

> char_polynom:=charpoly(T,lambda); # výpočet charakterístického (vlastního) polynomu matice
evalm(subs(lambda=T,char_polynom)); # kontrola správnosti předchozího výsledku
solve(char_polynom); # výpočet charakteristických čísel matice (kořenů char. rovnice)
eigenvalues(T); # na předchozí operaci už v MAPLE existuje speciální funkce

char_polynom := lambda^3-3*lambda^2-14*lambda-8

matrix([[0, 0, 0], [0, 0, 0], [0, 0, 0]])

-2, 5/2+1/2*sqrt(41), 5/2-1/2*sqrt(41)

-2, 5/2+1/2*sqrt(41), 5/2-1/2*sqrt(41)

> eigenvectors(T); # výpočet charakterístického vektoru matice
eigenvectors(T,`implicit`); # to samé, ale jinak (spíše pro ilustraci)
map(allvalues,[%],`dependent`);

[-2, 1, {vector([-1, 0, 1])}], [5/2+1/2*sqrt(41), 1...

[RootOf(_Z^2-5*_Z-4), 1, {vector([1, 1/2*RootOf(_Z^...

[[5/2+1/2*sqrt(41), 1, {vector([1, -3/4+1/4*sqrt(41...

> evalm(map(x -> sqrt(x),T)-alpha);
T2:=map(evalf,%);
eigenvectors(T2); # char. vektor matice nelze počítat z matice, obsahující čísla v pohyblivé řád. čárce a zároveň symbolické výrazy

matrix([[1-alpha, sqrt(2), sqrt(3)], [sqrt(2), 1-al...

T2 := matrix([[1.-1.*alpha, 1.4142, 1.7320], [1.414...

Error, (in linalg/evalf) matrix entries must all evaluate to float

> T2:=map(convert,T2,rational); # je nutno převést tyto čísla na racionální
eigenvectors(T2); # a pak je vše v pořádku

T2 := matrix([[1-alpha, 99/70, 97/56], [99/70, 1-al...

[-41/56-alpha, 1, {vector([-1, 0, 1])}], [209/112+1...
[-41/56-alpha, 1, {vector([-1, 0, 1])}], [209/112+1...

Mimo zde uvedenývh příkazů existuje celá řada dalších, které překračují rámec tohoto dokumentu, např.: adj, charmat, cond, hadamard, htranspose,kernel, minor, minpoly, permanent, rank, singularvals, trace, trancpose.

Následují některé další potřenbé úpravy matic.

> print(m2);

matrix([[2, 3, 4], [3, 4, 5], [4, 5, 6]])

> submatrix(m2, 1..2, 2..3); # vytvoření submatice
det(%); # nyní subdeterminant matice m2

matrix([[3, 4], [4, 5]])

-1

> submatrix(m2, [2,1], [2,1]); # jiný vytvoření submatice - výčtem všech řádků a sloupců

matrix([[4, 3], [3, 2]])

> c:=col(m2,2); # jeden sloupec z matice

c := vector([3, 4, 5])

> stackmatrix(c,m2); # přidání řádku k matici

matrix([[3, 4, 5], [2, 3, 4], [3, 4, 5], [4, 5, 6]]...

> augment(m2,c,c); # přidání sloupce k matici
swaprow(%,1,2); # výměna 1. a 2. řádku matice

matrix([[2, 3, 4, 3, 3], [3, 4, 5, 4, 4], [4, 5, 6,...

matrix([[3, 4, 5, 4, 4], [2, 3, 4, 3, 3], [4, 5, 6,...

Na podobné úpravy existuje opět celá škála příkazů: addcol, addrow, blockmatrix, coldim, copyinto, delcols. delrows, extend, mulcol, row, rowdim, scalarmul, swapcol, ...
Dále lze matice různě testovat, jako ostatne vše v MAPLE.

> orthog(m2); # atd ...

false

Podobné příkazy jako pro matice existují i pro vektory. Toto studium však ponecháme na čtenáři.