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

[Maple Math]

[Maple Math]

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 uložit vektor pravých stran:

> K := genmatrix(rovnice,[x,y,z],'l');

> print(l);

[Maple Math]

[Maple Math]

Teï napodobíme parametr flag z pøedchozího a zároveò si uchováme sloupec pravých stran pro pozdìjší použití. Pøíkazem adjung skládáme matice (resp. vektory) horizontálnì k sobì.

> augment(K,l);

[Maple Math]

Maple to umí i nazpátek - z matic do rovnic:

> geneqns(K,[x,y,z],l);

[Maple Math]

Tohle byly jen takové hraèièky, aby se nám lépe poèítalo, teï budeme rovnice øešit. Balíèek linalg na to obsahuje speciální funkci linsolve. Její výhodou je, že si slušnì poradí i v pøípadì nekoneènì mnoha øešení a vypíše pøíslušné vektory, generující prostor všech øešení. Navíc lze jako její parametry zadávat rovnice v maticovém tvaru a ušetøit si práci s vypisováním všech 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);

[Maple Math]

[Maple Math]

[Maple Math]

Jak snadno z tohohle dostat standartní tvar øešení tj. souèet jednoho øešení a lineárního prostoru øešení homogení rovnice? Nejdøíve použijeme zajímavou funkci nullspace, která nám dodá øešení homogení rovnice [Maple Math] , tedy spoèítá Ker f, kde f je homomorfismu daný maticí A.

> reseni_homogeni := nullspace(A);

[Maple Math]

Teï už staèí do zjištìného parametrického øešení dosadit jen nuly za [Maple Math] a _ [Maple Math] {respektive jakékoli jiné konstanty, pokud nás to baví poèítat) a dostat vektor øešení [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);

[Maple Math]

[Maple Math]

[Maple Math]

Pokud nejsme úplnì líní, mùžeme si matice upravovat a následnì øešit pomocí rùzných druhù eliminací. Základní eliminace je gaussova. V Maple se provádí takhle:

> gausselim(A);

[Maple Math]

Gaussovu eliminaci mùžeme provádìt i v tìlesech s celoèíselným dìlením mod n - [Maple Math] . Dìlá se to pomocí ekvivalentního pøíkazu Gausselim, který dokonce není z balíèku linalg.

> Gausselim(A) mod 5;

[Maple Math]

Maple umí i další úpravy, jsou to pøedevším rùzné modifikace Gaussovy eliminace, dále se pokouší upravovat i hermitovsky (bohužel podle mì ne moc užiteèným zpùsobem) viz. pøíslušné 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 øešit v tìlesech s celoèíselným dìlením mod n (tj. v tìlesech [Maple Math] ).

Následující soustavu vyøešíme v [Maple Math] . 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 øešení rovnic v tìlesech [Maple Math] 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);

[Maple Math]

[Maple Math]

[Maple Math]
[Maple Math]

[Maple Math]
[Maple Math]