KURZUS: Számítási módszerek
MODUL: Matematikai számítások MATLAB-bal
3. lecke Mátrixok/2
Cél: A mátrixokat bemutató, önmagában igen hosszú leckét két kisebb részre vágtuk szét, ez a második rész. A cél és a motiváció ugyanaz, mint az előző leckénél. | |||
Követelmények: Ön akkor sajátította el megfelelően a tananyagot, ha (a MATLAB segítségével) | |||
| |||
Időszükséglet: A tananyag elsajátításához (a feladatok megoldásával együtt) hozzávetőlegesen 2,5 órára lesz szüksége. | |||
Kulcsfogalmak | |||
| |||
Speciális mátrixok | |||
A MATLAB rendszerben több speciális, nevezetes mátrix (vektor) beépített paranccsal is előállítható. Ezen mátrixok között vannak egészen egyszerűek, és jóval bonyolultabbak is, amelyek pl. speciális numerikus feladatok megoldásánál tesztmátrixként szolgálhatnak. | |||
Mi a Számítási módszerek tantárgy keretein belül elsősorban azokat a fontosabb alapmátrixokat (elemi mátrixok) tárgyaljuk, amelyeket feladataink megoldása során használunk. A mélyebben érdeklődők számára javasoljuk a gallery csoport tanulmányozását a súgóban (itt több mint 50 különböző speciális mátrix található, leírással, példákkal). | |||
| |||
Egységmátrix, csupa egyes és csupa nulla mátrix | |||
A nevezetes mátrixok ezen csoportja könnyen megjegyezhető, mert az angol nevük alapján a tartalmuk egyértelmű és a méretmegadás azonos konvenciót követ (ones, zeros, eye). | |||
Paraméterezésük is egyszerű, a méret és a típus adható meg. Itt a típus el is maradhat, a méret egyetlen, vagy több numerikus adat, amelyeknek az egész része számít számít (célszerű eleve egész adatot megadni). | |||
Néhány példa már korábban is szerepelt, továbbiak: | |||
>> A = ones(3) % 3×3 méretű csupa egyesekből álló mátrix | |||
Hozzon létre egy 5×3-as csupa nulla mátrixot a megfelelő beépített paranccsal! | |||
Hozzon létre ugyanilyen méretű csupa nulla mátrixot úgy is, hogy valamely egész típust használ! Hasonlítsa össze a két mátrix méretét! | |||
Megjegyezzük, hogy a true() és false() parancsok is - megfelelő méretmegadással - felhasználhatók csupa egyes és csupa nullás mátrixok létrehozására. Ebben az esetben a megfelelő mátrix helyfoglalása természetesen a logikai típusnak megfelelő. | |||
>> A = true(2, 3) | |||
Tudjuk, hogy a 0-val való osztás problémás művelet. Mik lesznek az eye(3)./zeros(3) hányados elemei? | |||
Sorozatképző operátorok, parancsok | |||
Szintén a speciális mátrixok közé soroljuk a kettőspont operátorral és a linspace paranccsal létrehozott oszlop- és sorvektorokat is. Ezeket korábban már tanultuk, ezért most csak egy újabb példát mutatunk be, egy érdekes alkalmazást. | |||
Felveszünk egy fi vektorba kellően sűrű alappontokat 0-tól -ig, majd az exp(i(fi) képlettel előállítjuk azon komplex számokat, amelyek forgásszöge a fi vektor elemeivel meghatározott, és 1 távolságra vannak az origótól. A pontokat végül kirajzoljuk. | |||
>> fi = linspace(0 , 2*pi , 181); % alappontok 0-tól 2*pi-ig | |||
| |||
Logaritmikusan skálázott vektorok is készíthetők a logspace paranccsal. A használat a linspace-nek megfelelő, csak a határok megadásánál figyelni kell arra, hogy 10 hatványok kitevőivel dolgozunk. | |||
>> x = logspace(1, 2, 6) % 6 elemű logaritmikus vektor 10-től 100-ig | |||
Pascal-, Hilbert-, Vandermonde-mátrix és a mágikus mátrix | |||
A Pascal-mátrix a Pascal-háromszög elemeit (a binomiális együtthatókat) állítja elő, de téglalapos elrendezésben (a háromszög csúcsa az 1; 1 pozícióban van); az eredeti háromszög sorai így átlósan olvashatók ki a mátrixból. | |||
>> P = pascal(6) % a háromszög 5. sorának elemeit megjelöltük | |||
A bemutatott példához hasonlóan határozza meg a Pascal-háromszög 12. sorának középső elemét! (A háromszögben a sorok és az oszlopok számozása 0-tól indul.) | |||
Érdekesség, hogy a Pascal-mátrix determinánsa mindig 1, ezért az inverz mátrix ilyenkor mindig egész számokból épül fel (ezt már korábban bemutattuk). | |||
>> det(P) | |||
Ellenőrizze, hogy a Pascal-mátrix inverzének determinánsa is 1. Milyen következtetés adódik ebből? | |||
A Hilbert-mátrix egy speciális tesztmátrix, amelyben a természetes számok reciprokai szerepelnek a következő szabály szerint: h(i, j) = 1/(i + j - 1). A MATLAB-ban a hilb(méret) függvénnyel állítható elő (mindig négyzetes mátrixot kapunk). | |||
>> H5 = hilb(5) | |||
Ezeket a törteket direkt módon mi is megadhatjuk, persze bonyolultabban. | |||
H4 = [1./[1:4]; 1./[2:5]; 1./[3:6]; 1./[4:7]] | |||
A pontos törtalakot is előállíthatjuk (karakterláncként) a rats(hilb(n)) paranccsal. | |||
>> rats(hilb(4)) | |||
A Hilbert-mátrix fontos tulajdonsága, hogy számolásnál kismértékű változásokra is nagyon érzékeny (gyengén kondicionált), ezért szokták különböző numerikus eljárások tesztelésére használni. | |||
A következő példában kiszámítjuk a Hilbert-mátrix inverzét speciálisan erre a célra beépített MATLAB eljárással és az inv függvénnyel is, majd bemutatjuk, hogy az utóbbi már kis méretek esetén is érzékelhetően pontatlan eredményt ad. | |||
>> IH = invhilb(5) % beépített speciális parancs, pontos eredmény | |||
Ellenőrizze, hogy az inverz Hilbert-mátrix méretének növekedésével a hiba rendkívül gyorsan nő. (Többszörös nagyságrendi növekedés tapasztalható minden egyes méretnöveléskor!) | |||
Nézze meg a hibát 6×6-os, 7×7-es és 8×8-as mátrixokra is. | |||
*A hiba bemutatott gyors növekedésének egyszerű szemléletes indoklása lehet a következő: a MATLAB az inv parancsnál determinánsszámítást is végez (ezzel oszt), a Hilbert-mátrixok determinánsai pedig gyorsan csökkenő sorozatot alkotnak. | |||
>> det(hilb(4)), det(hilb(7)) | |||
A Max függvény felhasználásával állapítsuk meg a hilb(4), hilb(5), hilb(6) mátrixok inverzeinek legnagyobb elemét! | |||
A Vandermonde mátrix oszlopaiban egy oszlopvektor csökkenő kitevőjű hatványai állnak. Előállítására a vander() parancs szolgál (az oszlopvektort meg kell adnunk): | |||
>> x = [1,2,3,4]'; % alap oszlopvektor, nem íratjuk ki | |||
A mágikus mátrix egy speciális n×n-es mátrix, amely pozitív egész számokból épül fel (1-től -ig), fontos tulajdonsága, hogy elemeinek összege egy soron és egy oszlopon belül, továbbá a főátlóban és az antiátlóban is megegyezik. A MATLAB a mágikus mátrixot beépített függvénnyel elő tudja állítani (adott n-re mindig ugyanazt a mátrixot kapjuk; részletek: súgó). | |||
>> A = magic(4) % 4×4-es mágikus mátrix | |||
Készítse el az 5×5-ös mágikus mátrixot, és ellenőrizze, hogy az ismert tulajdonságok itt is teljesülnek. Az oszlopok és sorok összegének előállításához használja a sum(A) és a sum(A') parancsokat. | |||
Határozza meg a 6×6-os Hilbert-mátrix elemeinek sorösszegét! | |||
A megismert nevezetes mátrixokból sokféle különböző gyakorlati feladathoz készíthetünk építkezéssel alkalmas tesztmátrixot. | |||
Példa: A következő tesztmátrix felépítéshez felhasználható az egységmátrix, a csupa nulla mátrix, a csupa egyes mátrix, a Pascal-mátrix, a Hilbert-mátrix és a mágikus mátrix. Építsük fel egyszerű mátrixműveletek (transzponálás is megengedett) segítségével a W tesztmátrixot! | |||
W = | |||
A megoldáshoz észrevesszük, hogy W négy részre bontható: bal felső sarkában egy 3×2-es csupa egyes mátrix, jobb felső sarkában egy 3×3-as egységmátrix kétszerese, bal alsó sarkában egy 3×3-as Pascal-mátrix, jobb alsó sarkában pedig egy 3×2-es csupa nulla mátrix található. Ellenőrzésként legyárthatjuk külön-külön a részmátrixokat, például: | |||
>> eye(3)*2 | |||
Végül összerakjuk a darabokat, és ellenőrizzük, hogy pontosan megkapjuk-e W-t. | |||
>> W = [ones(3, 2) eye(3)*2; pascal(3) zeros(3, 2)] | |||
Véletlen mátrixok | |||
A véletlen (álvéletlen) számokból felépülő mátrixok a MATLAB-ban fontos szerephez jutnak, hiszen pl. ily módon gyorsan lehet generálni általános, nagy méretű egyenletrendszert. Véletlen számok előállítására a rand() és a randi() függvény használható. | |||
A rand függvény a [0, 1) intervallumon belüli (ál)véletlen számokat generál (hasonlóan, mint az Excel Vél függvénye), és ezekkel megadott méretű mátrix feltölthető. A randi függvény megadott határok közötti véletlen egészeket állít elő (egyenletes eloszlással), és ezekkel szintén fel tudunk tölteni adott méretű mátrixot. A méret mindkét esetben lehet egy darab szám (ez esetben négyzetes lesz a mátrix), vagy külön sor- és oszlopszám. | |||
>> R = rand(3) % véletlen 3×3-as mátrix | |||
A következő példában egy lottóhúzás eredményét szimuláljuk (az esetleges ismétlődést nem ellenőrizzük), majd rendezzük az eredményvektort. | |||
>> L = randi([1 90], size(1:5)) % lottóhúzás szimuláció | |||
A randn() függvény standard normális eloszlású véletlen számokat (azaz: várható értékük 0, szórásuk 1) állít elő, a használat módja ugyanaz, mint amit a rand-nál megismertünk. A függvény segítségével most hisztogramot kérünk néhány száz adott várható értékű és szórású számról. | |||
>> x = 2*randn(400, 1) + 10; hist(x) % szórás: 2, várható érték: 10 | |||
| |||
Láthatjuk, hogy a minta a nem túl nagy elemszám ellenére is szépen kezdi kirajzolni a Gauss-görbét. | |||
Ezzel szemben az egyenletes eloszlású véletlen adatok hisztogramja valóban nagyjából egyenletes lesz (lokális eltérések természetesen adódhatnak, a csipkézettség az elemszám növelésével csökkenthető). | |||
>> x = rand(400,1); hist(x) % egyenletes eloszlás | |||
| |||
Próbálja ki a fenti példákat 1000-1000 adatra úgy, hogy a hisztogram rekeszeinek a számát is módosítja (a hist parancs második paraméterként ez a szám megadható). | |||
Mátrixokat manipuláló függvények | |||
Tükrözés, forgatás, eltolás | |||
A tükrözést, forgatást, eltolást megvalósító függvények látványos lehetőségeket adnak az eddig megismerteken túl további származtatott mátrixok előállítására, ill. újabb, bővített "építkezésre". | |||
Az ebben és a következő alfejezetben bemutatott egyszerű példákat próbálja ki Ön is. | |||
A flipud() (up-down; felülről lefelé) és fliplr() (left-right; balról jobbra) függőlegesen, ill. vízszintesen tükrözi a paraméterként megadott mátrixot. A parancsok önmaguk inverzei, egy adott tükrözést kétszer egymásután végrehajtva az eredeti mátrixot kapjuk meg újra. | |||
>> A = [1:3; 4:6; 7:9]; | |||
Megemlítjük, hogy a flipdim() paranccsal kiváltható a flipud és a fliplr is. Ilyenkor második paraméterként a dimenziósorszámot meg kell adni. | |||
>> flipdim(A, 1); % függőleges tükrözés | |||
A rot90() parancs 90 fokonként balra forgatja el a megadott mátrixot (rotate - forgatás). A forgatások száma második, opcionális paraméterként megadható. | |||
>> rot90(A) % forgatás 90 fokkal balra | |||
A circshift() függvény mátrixok körkörös shiftelésére szolgál. Az eltolás felfelé és lefelé (ill. jobbra és balra) is elvégezhető. Ennek irányát és nagyságát a második paraméter határozza meg. | |||
>> circshift(A, 1) % függőleges körkörös eltolás lefelé 1 egységgel | |||
Ha vízszintes eltolást (is) szeretnénk, akkor a második paramétert dupla indexként kell megadni (y és x irányok, ebben a sorrendben). | |||
>> circshift(A, [0 1]) % vízszintes körkörös eltolás jobbra 1 egységgel | |||
Próbálja ki a MATLAB-ban, hogy milyen eltolást hajt végre a circshift(mátrix, [1 2]) parancs. | |||
A következőkben építkezéshez is felhasználjuk a most megismert mátrixfüggvényeket. | |||
Feladatunk az, hogy a speciális mátrixfüggvények segítségével előállított megfelelő almátrixokból rakjuk össze az alábbi W mátrixot. | |||
W = | |||
Látjuk, hogy a W mátrix 4 blokkra bontható, ezek mérete 3×3, 3×4; 4×3, 4×4. | |||
A nem négyzetes blokkok zérusmátrixok, a négyzetes mátrixoknak pedig csak az anti-diagonálisa tartalmaz egyeseket. Ez utóbbiakat az egységmátrix (3×3-as, ill. 4×4-es példányainak) tükrözésével, vagy forgatásával állíthatjuk elő. | |||
Eszerint a klasszikus összerakós megoldás (kiíratás nélkül): | |||
>> W = [flipud(eye(3)), zeros(3,4); zeros(4,3), rot90(eye(4))]; | |||
Egy másik - direkt értékadásos - megoldás adódik annak felhasználásával, hogy a célmátrix fel nem töltött elemei automatikusan nullák lesznek. Így az értékadásokhoz csak a 4×4-es egységmátrix szükséges: | |||
>> AE4 = rot90(eye(4)); W(1:3,1:3) = AE4(2:4,1:3); W(4:7,4:7) = AE4; | |||
Még tömörebb képlethez jutunk abból az észrevételből, hogy a 7×7-es egységmátrix tükrözésével és körkörös eltolásával is előállítható a célmátrix. | |||
>> W = flipud(circshift(eye(7), 4)); | |||
Sávmátrixok, alsó- és felső háromszögmátrixok | |||
A diag parancs felhasználásával kiemelhetjük egy mátrix főátlóját vagy valamelyik vele párhuzamos mellékátlóját (ennek sorszáma a második paraméterrel meghatározott - milyen messze vagyunk a főátlótól). Az eredmény egy oszlopvektor lesz. | |||
>> D = [1:4; 11:14; 21:24; 31:34] % tesztmátrix | |||
Ha a diag parancs paramétere egy oszlopvektor, akkor a MATLAB egy megfelelő méretű négyzetes mátrix átlójában helyezi el az oszlopvektor elemeit (diagonális mátrix képződik). Az adott vektor a főátlóba vagy valamelyik mellékátlóba is elhelyezhető (ennek sorszáma a második paraméterrel meghatározott - milyen messze vagyunk a főátlótól). A mátrix többi eleme 0 lesz. | |||
>> diag(diag(D)) % ugyanezt adja a diag(d) is | |||
A parancs felhasználásával és mátrixösszeadással sávmátrixokat is készíthetünk. | |||
>> diag(diag(D)) + diag(diag(D, 1), 1) + diag(diag(D, -1), -1) | |||
Próbálja ki, hogy mit állít elő a diag(diag(D, -1), 1) + diag(diag(D, 1), -1) + diag(diag(D)) kifejezés! A MATLAB-os próba előtt írja le füzetébe a várható eredményt! | |||
A tril és triu (l - lower, u - upper) függvények a mátrix alsó vagy felső háromszög alakú részét emelik ki, beleértve a főátlót is. Ha második paraméterként átlószám is szerepel, akkor a kiemelés a megjelölt mellékátlóig tart. | |||
>> triu(D) | |||
A következő példában az eredeti mátrixot a megfelelő függvényekkel három diszjunkt részre szeleteljük (alsó- és felsőháromszög, főátló), majd ezen részek összegeként visszakapjuk az eredeti mátrixot. | |||
>> fent = triu(D, 1); lent = tril(D, -1); atlo = diag(diag(D)); ... | |||
Az alfejezetet annak a script-fájlnak (M-fájlnak) a bemutatásával zárjuk, amely már az első MATLAB-os ismerkedésünknél is szerepelt. A parancs (függvény) megadott méretű sávmátrixot készít, és ennek főátlóját, ill. alsó- és felső mellékátlóját megadott elemekkel tölti fel. | |||
Nyissunk meg a MATLAB editorral egy üres M-fájlt (a File/New menüpont alatt). Írjuk be vagy másoljuk be a következő kódot (a zöld komment sorok a működéshez nem szükségesek, de az értelmezést elősegítik): | |||
function T = tridiag(a, b, c, n) | |||
A fájlt mentsük el. A parancs ezután már használható: | |||
>> tridiag(1, 2, 3, 4) | |||
Az M-fájlok általánosan egy vagy több MATLAB utasítást tartalmaznak, amelyeket a gép az M-fájl nevének, mint parancsnak a kiadásával végrehajt. | |||
Mi most speciálisan egy függvényt készítettünk, a visszatérési érték definiálása miatt. További példákat a következő leckében találunk. |
Önellenőrző kérdések | |||||
1. A Pascal-mátrix segítségével állapítsa meg az kifejtésében az tag együtthatóját! ![]() | |||||
2. Határozza meg, hogy melyik Hilbert mátrixnak lesz először kisebb a determinánsa, mint az eps érték! ![]() | |||||
Felesleges zárójeleket és szimbólumokat ne használjon! | 3. Építse fel az egységmátrix, a csupa nulla mátrix, a csupa egyes mátrix, a Pascal-mátrix, a Hilbert-mátrix, a mágikus mátrix és egyszerű mátrixműveletek (transzponálás is megengedett) segítségével a következő mátrixot T = ![]() | ||||
4. Hisztogram kirajzolásával ellenőrizze, hogy sok (itt: 192 darab) egyenletes eloszlású véletlen szám összege már más eloszlású lesz! Tipp: a sum(A) művelet az A mátrix oszlopainak összegét képezi egyetlen sorvektorba. Erre kérjünk hisztogramot. ![]() | |||||
5. Hozzon létre olyan 5×5-ös méretű mátrixot, amely az antiátlójában csupa 5-ös elemet tartalmaz, a többi pozícióban pedig 0 áll. | |||||
Tipp: Használja valamelyik tükröző függvényt. | |||||
6. Állítsa elő a következő (még nem létező) mátrixot elemeire történő értékadásokkal! (lehetőleg a legkevesebbel) | |||||
0 10 0 0 0 0 0 0 0 0 | |||||
Segítség: | |||||
| |||||
7. Hozzon létre a leckében bemutatott példa felhasználásával (módosításával) egy tridiag2 nevű M-fájt, amely olyan sávmátrixot készít a megadott elemekből, hogy az elemek a főátlóban, ill. a +2-es és a -2-es mellékátlóban szerepelnek (a +1-es és a -1-es mellékátlóba 0-ák kerülnek). | |||||
Minta: | |||||
>> tridiag2(1, 2, 3, 4) |