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
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
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í
> T:=toeplitz( [1,2,3] ); # vytvoření Toeplitzovy matice z prvního řádku
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);
>
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
>
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
Základní maticové funkce.
> det(m); # výpočet determinantu matice
>
map(x -> 2*x,T);
det(%);
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
>
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
>
eigenvectors(T); # výpočet charakterístického vektoru matice
eigenvectors(T,`implicit`); # to samé, ale jinak (spíše pro ilustraci)
map(allvalues,[%],`dependent`);
>
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
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
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);
>
submatrix(m2, 1..2, 2..3); # vytvoření submatice
det(%); # nyní subdeterminant matice m2
> submatrix(m2, [2,1], [2,1]); # jiný vytvoření submatice - výčtem všech řádků a sloupců
> c:=col(m2,2); # jeden sloupec z matice
> stackmatrix(c,m2); # přidání řádku k matici
>
augment(m2,c,c); # přidání sloupce k matici
swaprow(%,1,2); # výměna 1. a 2. řádku matice
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 ...
Podobné příkazy jako pro matice existují i pro vektory. Toto studium však ponecháme na čtenáři.