KTE / PPEL Počítačová podpora v elektrotechnice Ing. Lenka Šroubová, Ph.D. email: lsroubov@kte.zcu.cz http://home.zcu.cz/~lsroubov 3. 10. 2012 Základy práce s výpočetními systémy opakování a pokračování Konstanty a vyhrazené proměnné pi Ludolfovo číslo π = 3,14159 i, j imaginární jednotky e Eulerovo číslo e = 2,71828 (lze spočítat jako exp(1)) Inf nekonečno NaN není číslo (neplatná numerická hodnota) eps strojové epsilon (něco jako přesnost ) test = 1 + eps test = 1 test - 1 2.22044604925031e-016 Ale pozor: test = 1 + (eps / 10), tj. eps/10 je už moc malé test = 1 test - 1 0 realmax maximální použitelné reálné kladné číslo realmin minimální použitelné reálné kladné číslo (v absolutní hodnotě, tj. číslo nejblíž k nule které lze použít) 0
Názvy proměnných musí začínat písmenem, povolené znaky jsou malá písmena, velká písmena, číslice a z dalších znaků jen podtržítko. Jako proměnné není vhodné používat klíčová slova, názvy funkcí apod. Použití některých znaků a symbolů, čárka - oddělovač parametrů funkcí, indexů apod. - oddělovač položek v řádku matice (totéž mezera) ; středník - na konci řádku potlačí výpis výsledku operace - oddělovač řádků matice při zadávání, např. A = [1,2,3;4,5,-6] A = 1 2 3 4 5-6 () - uzavírají parametry funkcí např. sin(2.4) - uzavírají indexy matic např. A(2,3) chci číslo na druhém řádku ve třetím sloupci A(2,3) -6 [] - uzavírají prvky matic při zadávání {} - u struktur (složené proměnné) - u tzv. buňkových polí, vektorů cell array - u seznamů u příkazu switch-case : - odděluje dolní a horní mez (popř. krok) intervalu, např. x = -6:2:8 x = -6-4 -2 0 2 4 6 8 - výčet, rozsah, např. A(2,:) 2. řádek matice A, např. A(2,:) 4 5-6
nebo - uzavírají řetězec (v MATLABu jen ), např. retezec nebo retezec - transpozice, např. [A ] 1 4 2 5 3-6 Práce s maticemi a vektory opakování a pokračování Přístup k jednotlivým prvkům matic a vektorů - pomocí tzv. indexů (indexuje se od 1) a=[9:-1:4] a = 9 8 7 6 5 4 a(3) přístup k 3. prvku 7 b=[10;8] b = 10 8 b(2) přístup k 2. prvku 8 b(2,1) přístup k prvku ve 2. řádku, 1. sloupci 8 D=[1:5;9,3,4,3,2;1:2:9;9:-1:5] D = 1 2 3 4 5 9 3 4 3 2 1 3 5 7 9 9 8 7 6 5
D(3,4) přístup k prvku ve 3. řádku, 4. sloupci 7 D(3:4,1:3) přístup k prvkům ve 3. až 4. řádku a 1. až 3. sloupci 1 3 5 9 8 7 D(3:4,:) přístup k prvkům ve 3. až 4. řádku a všech sloupcích 1 3 5 7 9 9 8 7 6 5 D([1,3,4],3:end) přístup k prvkům ve 1.,3. a 4. řádku a 3. až posledním sloupci 3 4 5 5 7 9 7 6 5 D(:,:) vytiskne celou matici, všechny řádky i sloupce Samotná : (rozsah, výčet) má význam (u indexů matic), že chci použít všechny možné (dostupné) hodnoty. D(5,:)=[1:4] přidání 5. řádku nelze: řádek musí mít 5 sloupců jako matice D(5,:)=[1:5] přidání 5. řádku D = 1 2 3 4 5 9 3 4 3 2 1 3 5 7 9 9 8 7 6 5 1 2 3 4 5
D(4,2)=10 nahrazení prvku na 4. řádku, ve 2. sloupci číslem 10 D = 1 2 3 4 5 9 3 4 3 2 1 3 5 7 9 9 10 7 6 5 1 2 3 4 5 D(3:5, 1:3) = 0.001 nahrazení prvků ve 3. až 5. řádku a 1. až 3. sloupci číslem 0.001 D = 1.000 2.000 3.000 4.000 5.000 9.000 3.000 4.000 3.000 2.000 0.001 0.001 0.001 7.000 9.000 0.001 0.001 0.001 6.000 5.000 0.001 0.001 0.001 4.000 5.000 D(:,4) = [] zrušení 4. sloupce vymažeme jej přiřazením prázdné matice D = 1.000 2.000 3.000 5.000 9.000 3.000 4.000 2.000 0.001 0.001 0.001 9.000 0.001 0.001 0.001 5.000 0.001 0.001 0.001 5.000 D(:,5) přístup k prvkům ve všech řádcích a 5. sloupci: nelze: 5. sloupec už neexistuje
Tak 5. sloupec opět přidáme: D(:,5) = [7;9;3;2;5] D = 1.000 2.000 3.000 5.000 7.000 9.000 3.000 4.000 2.000 9.000 0.001 0.001 0.001 9.000 3.000 0.001 0.001 0.001 5.000 2.000 0.001 0.001 0.001 5.000 5.000 Stejně by se k matici přidal řádek nebo více řádků nebo více sloupců Samozřejmě se musí dodržet v přiřazení, zda dodám sloupec nebo řádky. D(:,4) = zeros(5,1) nahrazení 4. sloupce nulami D = 1.000 2.000 3.000 0.000 7.000 9.000 3.000 4.000 0.000 9.000 0.001 0.001 0.001 0.000 3.000 0.001 0.001 0.001 0.000 2.000 0.001 0.001 0.001 0.000 5.000 D(3:5,1:3) = [] nelze: není možné vykousnout kus matice Měl by to být sloupcový vektor přidáváme sloupec, proto ;
D(7,6) = -3 přidání prvku na 6.řádek a 7.sloupec D = 1.000 2.000 3.000 0.000 7.000 0 9.000 3.000 4.000 0.000 9.000 0 0.001 0.001 0.001 0.000 3.000 0 0.001 0.001 0.001 0.000 2.000 0 0.001 0.001 0.001 0.000 5.000 0 0.000 0.000 0.000 0.000 0.000 0 0.000 0.000 0.000 0.000 0.000-3 Toto lze provést, zbytek matice se vyplní nulami. Operátory = přiřazení + sčítání - odečítání.* násobení NEmaticové prvek po prvku./ dělení NEmaticové prvek po prvku.\ dělení zleva NEmaticové prvek po prvku.^ mocnina NEmaticová prvek po prvku.' překlopení matice pole podle hl.diagonály (např. A.') * násobení maticové / dělení maticové \ dělení zleva maticové ^ mocnina maticová ' transpozice matice (např. A' ) pozor z komplexních čísel v matici budou čísla komplexně sdružená (z 2+3i bude 2-3i) == porovnání na rovnost (je rovno) ~= porovnání na nerovnost (není rovno) <, >, <=, >= relační operátory ~ negace (not)
format nastavuje způsob zobrazení čísel na obrazovce format short format long format rat atp. who výpis všech existujících proměnných whos výpis všech existujících proměnných včetně rozměru, obsažené paměti a třídy clear Prom maže proměnnou Prom clear maže všechny proměnné # (Octave), % (MATLAB, Octave) značí, že zbytek řádku je komentář Funkce pro práci s maticemi. Složení matice ze dvou vektorů: a=[1:5] a = 1 2 3 4 5 b=[9,3,4,3,2] b = 9 3 4 3 2 A = [a;b] A = 1 2 3 4 5 9 3 4 3 2 B = [a,b] B = 1 2 3 4 5 9 3 4 3 2
D=[1,2,3;4,5,6;7,8,-9] diag(d) vypíše hlavní diagonálu matice D inv(d) vypočte inverzní matici k matici D, jen pro čtvercové matice (Inverzní matice k dané matici je taková matice, která po vynásobení s původní maticí dá jednotkovou matici.) D*inv(D) 1.0000e+00 2.7756e-17-2.0817e-17 1.3878e-16 1.0000e+00-8.3267e-17 1.0131e-15-3.0531e-16 1.0000e+00 det(d) vypočte determinant matice D, jen pro čtvercové matice (Determinantem čtvercové matice řádu n nazýváme součet všech součinů n prvků této matice takových, že v žádném z uvedených součinů se nevyskytují dva prvky z téhož řádku ani z téhož sloupce.) det(d) 54 Speciální typy matic eye jednotková matice ones matice naplněná jedničkami zeros matice naplněná nulami pascal Pascalův trojúhelník magic "magická" matice - magický čtverec součet prvků na diagonále je stejný jako součet prvků v jednotlivých sloupcích matice rand matice naplněná náhodnými čísly z intervalu (0,1)
Operátory = přiřazení Operátory pro nematicové operace (operace s maticemi prvek po prvku) + sčítání A = 2 9 3 6 7 1 2 9 B = 2 5 1 3 3 9 1 8 C=A+B C = 4 14 4 9 10 10 3 17 (Stejný výsledek dostaneme i pomocí příkazu C=B+A. Sčítání matic je komutativní.) odečítání D = 0 4 2 3 4-8 1 1 (Stejný výsledek dostaneme i pomocí příkazu D=-B+A).* násobení NEmaticové prvek po prvku E=A.*B E = 4 45 3 18 21 9 2 72 (Stejný výsledek dostaneme i pomocí příkazu E=B.*A. Násobení vektorů prvek po prvku je komutativní)
./ dělení NEmaticové prvek po prvku F=A./B F = 1.00000 1.80000 3.00000 2.00000 2.33333 0.11111 2.00000 1.12500 (Stejný výsledek dostaneme i pomocí příkazu B.\A).\ dělení zleva NEmaticové prvek po prvku G=A.\B G = 1.00000 0.55556 0.33333 0.50000 0.42857 9.00000 0.50000 0.88889 (Stejný výsledek dostaneme i pomocí příkazu B./A).^ mocnina NEmaticová prvek po prvku H=A.^A H = 4 81 9 36 49 1 4 81 (Stejný výsledek dostaneme i pomocí příkazu A.*A).' překlopení dvourozměrného pole podle úhlopříčně, např. K= [A.'] K = 2 7 9 1 3 2 6 9
Rozměry matic, se kterými probíhají operace, musí být stejné, výsledek má také stejnou velikost, např. a=[1,2]; b=[3,4]; a.*b a(1)=1*3 3 8 a(2)=2*4 a*b nelze: rozměry matic nesouhlasí Příklady viz http://edison.fel.zcu.cz publikované sešity Operátory pro maticové operace (operace s celými maticemi) * násobení maticové / dělení maticové \ dělení zleva maticové ^ mocnina maticová ' transpozice matice Maticové násobení * Aby matice bylo možno násobit, musí být počet sloupců první matice stejný jako počet řádků druhé matice. Výsledek má počet řádek jako první matice a počet sloupců jako druhá matice. Např. máme-li: C = A * B (m,p) = (m,n) * (n,p) m,n,p počty řádků a sloupců příslušných matic A, B, C - musí mít matice A tolik sloupců, jako má matice B řádků, jinak nelze násobit maticově. - výsledná matice C má tolik řádků, jako měla A a má tolik sloupců jako měla B
D = B * A (???) = (n,p) * (m,n) m,n,p počty řádků a sloupců příslušných matic A, B - nelze násobit maticově, m p => A * B B * A (maticové násobení není komutativní) Příklad: C = A * B (3,4) = (3,3) * (3,4) - matice A má 3 sloupce, tj. stejný počet jako má matice B řádků => lze násobit maticově: A = B = C = 1 2 3 10 15 20 25 220 250 280 310 4 5 6 30 35 40 45 490 565 640 715 7 8 9 50 55 60 65 760 880 1000 1120 1 * 10 + 2 * 30 + 3 * 50 = 220 1 * 15 + 2 * 35 + 3 * 55 = 250 atd. první řádek z A s dalšími sloupci B. 1 * 20 + 2 * 40 + 3 * 60 = 280 1 * 25 + 2 * 45 + 3 * 65 = 310 A potom totéž pro druhý řádek A, opět se všemi sloupci B. 4 * 10 + 5 * 30 + 6 * 50 = 490 4 * 15 + 5 * 35 + 6 * 55 = 565 4 * 20 + 5 * 40 + 6 * 60 = 640 4 * 25 + 5 * 45 + 6 * 65 = 715
A dále totéž i pro třetí řádek A, opět se všemi sloupci B 7 * 10 + 8 * 30 + 9 * 50 = 760 7 * 15 + 8 * 35 + 9 * 55 = 880 7 * 20 + 8 * 40 + 9 * 60 = 1000 7 * 25 + 8 * 45 + 9 * 65 = 1120 až dostaneme výslednou matici C Pro čtvercové matice C, D platí rovněž C * D D * C (maticové násobení není komutativní) pro C * D bude jiný výsledek než pro D * C. eye jednotková matice (matice s jednotkami na hlavní diagonále, tj. na úhlopříčce z levého horního do pravého dolního rohu, jinde jsou nuly), nebo obdélníková matice s jednotkovou submaticí, např: eye(2) 1 0 0 1 eye(2,5) 1 0 0 0 0 0 1 0 0 0 F=[3,2,1;4,-5,6;-9,8,-7]; F = 3 2 1 4-5 6-9 8-7
J=eye(3) J = 1 0 0 0 1 0 0 0 1 Pro čísla platí: 2 * 1 = 2 U matic: F*J 3 2 1 4-5 6-9 8-7 Pro čísla platí: 1 2* 2 = 2*2 1 = 1 U matic F -1 (tj. vlastně něco jako F ) značí tzv. inverzní matici. inv(f) inverzní matice k matici F 0.12500-0.21154-0.16346 0.25000 0.11538 0.13462 0.12500 0.40385 0.22115 1
F*inv(F) maticové násobení matice F a k ní inverzní matice 1.0000e+00 2.7756e-17 8.3267e-17 1.1102e-16 1.0000e+00-1.3878e-16-2.4980e-16 2.7756e-17 1.0000e+00 tj. jednotková matice: 1 0 0 0 1 0 0 0 1 Násobením matice a k ní inverzní matice vznikne matice jednotková. F*[F.'] maticové násobení matice F a transponované matice 14 8-18 8 77-118 -18-118 194 Násobením matice a k ní transponované matice vznikne matice symetrická podle hlavní diagonály. Maticové dělení / (zprava) a \ (zleva) 2 / 3 - dvě děleno třemi zprava 0.66667 3 \ 2 - dvě děleno třemi zleva 0.66667 2 1 1 = 2* = 2*3 = 3 1 3 3 1 *2 Pro čísla jde o stejnou operaci násobení, půjde-li však o dělení matic, jde o dvě různé operace (viz výše násobení matic) U matic A -1 (tj. vlastně něco jako A ) značí tzv. inverzní matici. inv(a) inverzní matice
Tj.: A / B = A * inv(b); B \ A = inv(b) * A; B / A = B * inv(a); A \ B = inv(a) * B; - toto je A děleno B zprava - toto je A děleno B zleva - toto je B děleno A zprava - toto je B děleno A zleva - není zcela matematicky korektní, jen pro představu Mocnina maticová ^ A = 10 5 70 5 5 2 7 6 9 6 8 9 1 45 22 3 12 6 8 33 20 2 20 96 98 M=A ^ 2 M = 785 78 930 3765 2275 229 233 362 991 1069 681 696 1325 2638 3757 786 315 996 3625 3717 2612 1642 3968 11194 13324 Stejný výsledek dostaneme i pomocí maticového násobení A*A A * A 785 78 930 3765 2275 229 233 362 991 1069 681 696 1325 2638 3757 786 315 996 3625 3717 2612 1642 3968 11194 13324
Maticově mocnit lze jen čtvercovou matici nelze obdélníkovou probíhá stejná operace jako při maticovém násobení, první matice musí mít stejný počet sloupců jako má druhá matice řádků, tj. matice pro umocnění musí být čtvercová (musí mít stejný počet řádků a sloupců). M = A * A A čtvercová matice (n,n) = (n,n) * (n,n) n počet řádků a sloupců matice A, výsledná matice je stejných rozměrů O = B * B B obdélníková matice (???) = (m,n) * (m,n) m, n počty řádků, sloupců matice B nelze násobit, m n A.^2 mocnina NEmaticová prvek po prvku 100 25 4900 25 25 4 49 36 81 36 64 81 1 2025 484 9 144 36 64 1089 400 4 400 9216 9604 B = [A,A] B = 10 5 70 5 5 10 5 70 5 5 2 7 6 9 6 2 7 6 9 6 8 9 1 45 22 8 9 1 45 22 3 12 6 8 33 3 12 6 8 33 20 2 20 96 98 20 2 20 96 98 B^2 mocnina maticová nelze matice musí být čtvercová
B.^2 mocnina NEmaticová prvek po prvku - lze 100 25 4900 25 25 100 25 4900 25 25 4 49 36 81 36 4 49 36 81 36 64 81 1 2025 484 64 81 1 2025 484 9 144 36 64 1089 9 144 36 64 1089 400 4 400 9216 9604 400 4 400 9216 9604 Odmocnina sqrt(x) druhá odmocnina z x, např. sqrt(4) 2 Jak na jinou odmocninu než druhou? Platí: 1 n x n x =, to je tedy: x.^(1/n), např. 237.^ (1/18) 1.3550 - to je 18. odmocnina z 237. Příklad: třetí odmocnina z prvků matice 5 6 7 W =, tj. 3 3 3 5 6 7 4 3 2 W = 3 4 3 2 W.^(1/3) - nematicová operace, tj. prvek po prvku 1.7100 1.8171 1.9129 1.5874 1.4422 1.2599 Transpozice matice ' a.' 3 3
W=[5,6,7;4,3,2]; [W'] 5 4 6 3 7 2 Transpozice je překlopení matice kolem hlavní diagonály. V našem příkladu se z matice o 2 řádcích a 3 sloupcích stane matice o 3 řádcích a 2 sloupcích. Stejný výsledek dostaneme i pomocí příkazu W.' [W.'] 5 4 6 3 7 2 K=[1+3i,6,-7+5i;4-8i,-3-9i,2i]; K = 1 + 3i 6 + 0i -7 + 5i 4-8i -3-9i 0 + 2i [K.'] 1 + 3i 4-8i 6 + 0i -3-9i -7 + 5i 0 + 2i # prosta transpozice [K'] 1-3i 4 + 8i 6-0i -3 + 9i -7-5i 0-2i Matice K je naplněna komplexními čísly. Abychom získali transponovanou matici, musíme použít příkaz K.' (prostá transpozice matice).
Po provedení příkazu K' dostaneme tzv. adjugovanou matici, tzn. matici transponovanou, kterou tvoří ji čísla komplexně sdružená, tj. u imaginárních částí mají opačná znaménka. Výpočet soustavy lineárních rovnic 10x 1 + 5x 2 +70x 3 + 5x 4 + 5x 5 = 275 2x 1 + 7x 2 + 6x 3 + 9x 4 + 6x 5 = 100 8x 1 + 9x 2 + x 3 +45x 4 +22x 5 = 319 3x 1 +12x 2 + 6x 3 + 8x 4 +33x 5 = 242 20x 1 + 2x 2 +20x 3 +96x 4 +98x 5 = 958 A=[10, 5,70, 5, 5; x=[ x 1 b=[275; 2, 7, 6, 9, 6; x 2 100; 8, 9, 1,45,22; x 3 319; 3,12, 6, 8,33; x 4 242; 20, 2,20,96,98] x 5 ] 958] kde A je matice koeficientů soustavy lineárních rovnic, x je sloupcový vektor neznámých (tj. [x 1 ; x 2 ; x 3 ; x 4 ; x 5 ]), b=[275;100;319;242;958] je sloupcový vektor pravých stran (tj. vše, co je vpravo od =) Platí: A * x = b A -1 * A * x = A -1 * b J * x = A -1 * b x= A -1 * b - podle tohoto vztahu počítáme x=inv(a)*b pomocí maticového dělení zleva x = A \ b
x = 1.0000 2.0000 3.0000 4.0000 5.0000 Příklady viz http://edison.fel.zcu.cz publikované sešity a http://portal.zcu.cz nebo http://home.zcu.cz/~lsroubov