Lineární rovnice a matice
Máme-li zadány lineární rovnice, mùeme je pomocí Maplu snadno pøevést na maticový tvar:
> rovnice := {2*x+3*y+z=1,x+3*y=0,x+y+z=3};
> K := genmatrix(rovnice,[x,y,z],flag);
Parametr flag urèuje, e se do matice dopíe i sloupec pravých stran. Nicménì je praktiètìjí parametr flag nahradit jménem promìnné do které chceme uloit vektor pravých stran:
> K := genmatrix(rovnice,[x,y,z],'l');
> print(l);
> augment(K,l);
Maple to umí i nazpátek - z matic do rovnic:
> geneqns(K,[x,y,z],l);
Tohle byly jen takové hraèièky, aby se nám lépe poèítalo, teï budeme rovnice øeit. Balíèek linalg na to obsahuje speciální funkci linsolve. Její výhodou je, e si slunì poradí i v pøípadì nekoneènì mnoha øeení a vypíe pøísluné vektory, generující prostor vech øeení. Navíc lze jako její parametry zadávat rovnice v maticovém tvaru a uetøit si práci s vypisováním vech promìnných. Následující rovnici tak napíu u jen maticovì:
> A:= matrix(4,4,[[1,2,3,-1],[1,-1,1,2],[1,5,5,-4],[1,8,7,-7]]);
> b := vector(4,[0,4,-4,-8]);
> linsolve(A,b);
Jak snadno z tohohle dostat standartní tvar øeení tj. souèet jednoho øeení a lineárního prostoru øeení homogení rovnice? Nejdøíve pouijeme zajímavou funkci nullspace, která nám dodá øeení homogení rovnice
, tedy spoèítá Ker f, kde f je homomorfismu daný maticí A.
> reseni_homogeni := nullspace(A);
Teï u staèí do zjitìného parametrického øeení dosadit jen nuly za
a _
{respektive jakékoli jiné konstanty, pokud nás to baví poèítat) a dostat vektor øeení [6,0,-2,0].
Pomocí funkce linsolve mùeme té hledat matice pøechodu, tedy takovou matici X aby pro matice A a B platilo AX = B.
> A := matrix(3,3,[[5,-9,5],[1,-2,1],[2,3,3]]);
> B := matrix(3,3,[[1,-1,2],[0,2,-1],[1,0,1]]);
> linsolve(A,B);
> gausselim(A);
Gaussovu eliminaci mùeme provádìt i v tìlesech s celoèíselným dìlením mod n -
. Dìlá se to pomocí ekvivalentního pøíkazu Gausselim, který dokonce není z balíèku linalg.
> Gausselim(A) mod 5;
Maple umí i dalí úpravy, jsou to pøedevím rùzné modifikace Gaussovy eliminace, dále se pokouí upravovat i hermitovsky (bohuel podle mì ne moc uiteèným zpùsobem) viz. pøísluné helpy na : ffgausselim , gaussjord , ismith , ihermite .
Jak v Maplu obcházet numerické problémy Gaussovy eliminace je popsáno v listu Základy numerické matematiky .
Nakonec se podíváme, jak lze lineární rovnice øeit v tìlesech s celoèíselným dìlením mod n (tj. v tìlesech
).
Následující soustavu vyøeíme v
. Pro snadnìjí a pøehlednìjí zápis ji napíeme v maticovém tvaru a teprve potom pøepíeme do rovnic, které vyøeíme pomocí funkce na øeení rovnic v tìlesech
msolve.
> A := matrix([[4,1,4,5,3,2],[5,0,6,2,0,5],[2,2,3,6,3,3],[4,3,1,2,1,1]]);
> b := vector([5,1,0,1]);
> rovnice := geneqns(A,[x,y,z,t,u,v],b);
> msolve(rovnice, 5);