Příklad: Řešte soustavu lineárních algebraických rovnic 10x1+ 5x2+70x3+ 5x4+ 5x5 = 275 2x1+ 7x2+ 6x3+ 9x4+ 6x5 = 100 A*x=b 8x1+ 9x2+ x3+45x4+22x5 = 319 3x1+12x2+ 6x3+ 8x4+33x5 = 242 20x1+ 2x2+20x3+96x4+98x5 = 958 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]
x=[ x1 x2 x3 x4 x5]
b=[275;... 100;... 319;... 242;... 958]
kde A je matice koeficientů soustavy lineárních rovnic, x je sloupcový vektor neznámých (tj. [x1;x2;x3;x4;x5]), 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 ,
kde J je jednotková matice. - podle tohoto vztahu počítáme x = inv(A) * b % * operace maticové násobení (5,1) = (5,5) * (5,1)
– počty řádků a sloupců souhlasí
- nebo pomocí maticového dělení zleva x = A \ b % \ operace maticové dělení zleva
Platí:
A*x=b A-1 * A * x = A-1 * b J * x = A-1 * b x = A-1 * b ,
Víme, že: A-1 * A = J J*x=x
kde J je jednotková matice. - podle tohoto vztahu počítáme x = inv(A) * b % * operace maticové násobení (5,1) = (5,5) * (5,1)
– počty řádků a sloupců souhlasí
- nebo pomocí maticového dělení zleva x = A \ b % \ operace maticové dělení zleva
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]; b=[275;100;319;242;958]; Rychlejší výpočet Řešení pomocí výpočtu inverzní matice a Řešení pomocí maticového násobení maticového dělení zleva
x = inv(A) * b x = 1.0000 2.0000 3.0000 4.0000 5.0000
x = A \ b x = 1.0000 2.0000 3.0000 4.0000 5.0000
Pozor na nepřesnosti způsobené zaokrouhlováním: (round zaokrouhluje na nejbližší celé číslo) x = round(inv(A)) * b x = 361 0 0 0 0 A to je opravdu špatně.... x = round(inv(A).*1000)./1000 * b x = - zaokrouhlíme na tisíciny 0.32400 2.41100 3.03000 3.58600 5.20400 Stále velmi nepřesné…
round – zaokrouhlení na nejbližší celé číslo floor – zaokrouhlení na nejbližší nižší celé číslo, zaokrouhlení dolů ceil – zaokrouhlení na nejbližší vyšší celé číslo, zaokrouhlení nahoru fix – zaokrouhlení na nejbližší celá čísla směrem k nule. Příklad: a=[-0.954, -1.231, 5.241, 6.896]; floor(a) ans = -1 -2 ceil(a) ans = 0 -1
5
6
6
round(a) ans = -1 -1
5
7
7
fix(a) ans = 0
5
6
-1
Příklad – elektrický obvod se stejnosměrným zdrojem napětí
Určete proudy I18, I23 , I4 , I5 , I67 v obvodu na obr., je-li dáno: R1 = 1 Ω, R2 = 2 Ω, R3 = 3 Ω, R4 = 5 Ω, R5 = 3 Ω, R6 = 2 Ω, R7 = 4 Ω, R8 = 4,5 Ω, U0 = 60 V. Řešte pomocí přímé aplikace Kirchhoffových zákonů. R3
R6
R4
R2
+ R1
R7
R5
= U0 UAC
R8
Pokračování příkladu – elektrický obvod se stejnosměrným zdrojem napětí R3
R6
R4
R2
+ R1
R7
R5
= U0
R8
UAC
1. K. z. pro uzel A: 1. K. z. pro uzel C: 2. K. z. pro smyčku s1: 2. K. z. pro smyčku s2: 2. K. z. pro smyčku s3:
I 18 I 23 I 4 0 I 5 I 67 I 18 0 R1 I 18 R4 I 4 R5 I 5 R8 I 18 U 0 0 R2 I 23 R3 I 23 R4 I 4 0 R6 I 67 R7 I 67 R5 I 5 0
Pokračování příkladu – elektrický obvod se stejnosměrným zdrojem napětí 1. K. z. pro uzel A: 1. K. z. pro uzel C: 2. K. z. pro smyčku s1: 2. K. z. pro smyčku s2: 2. K. z. pro smyčku s3:
I 18 I 23 I 4 0 I 5 I 67 I 18 0 R1 I 18 R4 I 4 R5 I 5 R8 I 18 U 0 0
R2 I 23 R3 I 23 R4 I 4 0 R6 I 67 R7 I 67 R5 I 5 0
Rovnice upravíme, seřadíme proudy, na levé straně ponecháme členy s neznámými, ostatní členy převedeme na pravou stranu. 1* I18 1* I 23 1* I 4 0 * I 5 0 * I 67 0 1. K. z. pro uzel A: 1* I18 0 * I 23 0 * I 4 1* I 5 1* I 67 0 1. K. z. pro uzel C: 2. K. z. pro smyčku s1: ( R1 R8 ) * I18 0 * I 23 R4 * I 4 R5 * I 5 0 * I 67 U 0 2. K. z. pro smyčku s2: 0 * I18 ( R2 R3 ) * I 23 R4 I 4 0 * I5 0 * I 67 0 2. K. z. pro smyčku s3: 0 * I18 0 * I 23 0 * I 4 R5 I 5 ( R6 R7 ) * I 67 0
Pokračování příkladu – elektrický obvod se stejnosměrným zdrojem napětí Soustava rovnic: 1* I18 1* I 23 1* I 4 0 * I 5 0 * I 67 0 1* I18 0 * I 23 0 * I 4 1* I 5 1* I 67 0 ( R1 R8 ) * I18 0 * I 23 R4 * I 4 R5 * I 5 0 * I 67 U 0 0 * I18 ( R2 R3 ) * I 23 R4 I 4 0 * I 5 0 * I 67 0 0 * I18 0 * I 23 0 * I 4 R5 I 5 ( R6 R7 ) * I 67 0
Řešíme soustavu 5 rovnic o 5 neznámých: 1 1 R1 R8 0 0
1
1
0
0
0
1
0
R4
R5
R 2 R3
R4
0
0
0
R5
I 18 0 1 I 23 0 0 I 4 U 0 0 I5 0 R6 R7 I 67 0 0
Pokračování příkladu – elektrický obvod se stejnosměrným zdrojem napětí 1 1 R1 R8 0 0
A=[
1
1
0
0
0
1
0
R4
R5
R 2 R3
R4
0
0
0
R5
I 18 0 1 I 23 0 0 I 4 U 0 0 I5 0 R6 R7 I 67 0 0
1, -1, -1, 0, 0;... -1, 0, 0, 1, 1;... R1+R8, 0, R4, R5, 0;... 0,R2+R3,-R4, 0, 0;... 0, 0, 0,-R5,R6+R7];
b=[0;0;U0;0;0];
Pokračování příkladu – elektrický obvod se stejnosměrným zdrojem napětí R1=1; R2=2; R3=3; R4=5; R5=3; R6=2; R7=4; R8=4.5; U0=60; % jednotlivé hodnoty odporů a napětí A = [1,-1,-1,0,0;-1,0,0,1,1;R1+R8,0,R4,R5,0;... 0,R2+R3,-R4,0,0;0,0,0,-R5,R6+R7]; % matice A b = [0;0;U0;0;0]; % sloupcový vektor b x = A\b % maticová operace - dělení zleva x = Řešení soustavy rovnic je: 6.0000 I 18 6 A 3.0000 I 23 3 A 3.0000 I4 3A 4.0000 I5 4 A 2.0000 I 67 2 A
Pokračování příkladu – elektrický obvod se stejnosměrným zdrojem napětí Jiná možnost řešení soustavy rovnic: R=[1,2,3,5,3,2,4,4.5]; % hodnoty odporů - vektor U0=60; A=[1,-1,-1,0,0;-1,0,0,1,1;R(1)+R(8),0,R(4),R(5),0;… 0,R(2)+R(3),-R(4),0,0;0,0,0,-R(5),R(6)+R(7)]; b = [0,0,U0,0,0]; % b zadán jako řádkový vektor x = A\b.’ % transpozice vektoru b x = 6.0000 3.0000 3.0000 4.0000 2.0000
Pokračování příkladu – elektrický obvod se stejnosměrným zdrojem napětí Jiná možnost řešení soustavy rovnic: R=[1,2,3,5,3,2,4,4.5]; % hodnoty odporů - vektor U0=60; V matici A prvky vektoru R A=[1,-1,-1,0,0;-1,0,0,1,1;R(1)+R(8),0,R(4),R(5),0;… 0,R(2)+R(3),-R(4),0,0;0,0,0,-R(5),R(6)+R(7)]; b = [0,0,U0,0,0]; % b zadán jako řádkový vektor x = A\b.’ % transpozice vektoru b x = 6.0000 3.0000 3.0000 4.0000 2.0000
Pokračování příkladu – elektrický obvod se stejnosměrným zdrojem napětí Jiná možnost řešení soustavy rovnic: R=[1,2,3,5,3,2,4,4.5]; % hodnoty odporů - vektor U0=60; V matici A prvky vektoru R A=[1,-1,-1,0,0;-1,0,0,1,1;R(1)+R(8),0,R(4),R(5),0;… 0,R(2)+R(3),-R(4),0,0;0,0,0,-R(5),R(6)+R(7)]; b = [0,0,U0,0,0]; % b zadán jako řádkový vektor x = A\b.’ % transpozice vektoru b x = 6.0000 Vektor b musí být 3.0000 sloupcový, aby mohlo 3.0000 proběhnout dělení zleva 4.0000 2.0000
Příklad: Funkce pro výpočet obsahu kruhu function S = obsah(r) S = pi*(r.^2); % operace prvek po prvku end % konec funkce Volání funkce pro více poloměrů, vypočtou se obsahy všech kruhů najednou – vstupní parametr vektor – nutná operace prvek po prvku ve funkci
polomery = [1,5,10,20]; % vstupni parametr vektor obsahy = obsah(polomery) obsahy = 3.1416 78.5398
314.1593
1256.6371
Příklad: Funkce pro výpočet objemu kvádru function V = objem(a,b,c) V = a.*b.*c; % operace prvek po prvku end % konec funkce Volání funkce pro 3 kvádry o stranách: a1 = 1 mm, b1 = 1 mm, c1 = 1 mm (vlastně krychlička), a2 = 2 mm, b2 = 5 mm, c2 = 7 mm, a3 = 3 mm, b3 = 6 mm, c3 = 8 mm. Aby mohlo proběhnout násobení vektorů prvek po prvku, je nutná operace prvek po prvku ve funkci V = objem([1,2,3],[1,5,6],[1,7,8]) V = 1 70 144 % objemy jednotlivých kvádrů
Příklad: Funkce – jednoduchá kalkulačka function kalkulacka(A,B,znak) switch (znak) case '+' Volání funkce: disp(A+B); kalkulacka([8,4,6],[2,1,3],'*') case '-' 16 4 18 disp(A-B); case '*' disp(A.*B); % operace prvek po prvku case '/' disp(A./B); % operace prvek po prvku case '\' disp(A.\B); % operace prvek po prvku otherwise disp('Toto nepocitam'); end % konec switch end % konec funkce
Příklad: Funkce pro řešení soustavy lineárních algebraických rovnic – vstupní parametry: matice koeficientů soustavy a vektor pravých stran. function x = soustava_rovnic(A,b) x = A \ b; % operace maticová end % konec funkce Volání funkce pro soustavu: 3x1 + 4x2 = 11 2x1 – 5x2 = – 8 x = soustava_rovnic([3,4;2,-5],[11;-8]) x = 1.0000 Ve funkci soustava_rovnic, aby výpočet 2.0000 mohl proběhnout je nutno použít maticovou operaci A \ b.
return – ukončení funkce Příklad: Funkce pro řešení soustavy lineárních algebraických rovnic s ošetřením řešitelnosti soustavy – vstupní parametry: matice koeficientů soustavy A a vektor pravých stran b.
Bylo uvedeno: Matice, jejíž determinant je nenulový, se nazývá regulární.
Je-li matice koeficientů soustavy regulární, tedy det(A)≠0, potom má soustava právě jedno řešení. Inverzní matici lze vytvořit pouze ke čtvercové matici, která je regulární a tedy lze pro výpočet soustavy užít vztahy: x = inv(A) * b, resp. x = A \ b Pozn.: Později si ukážeme techniky, jak dále rozpoznat, zda má soustava nekonečně mnoho řešení či žádné řešení.
return – ukončení funkce Příklad: Funkce pro řešení soustavy lineárních algebraických rovnic s ošetřením řešitelnosti soustavy – vstupní parametry: matice koeficientů soustavy A a vektor pravých stran b. function soust_rov_det(A,b) if(det(A)==0) disp('Determinant se rovna nule => konec!') return % konec běhu funkce else x = A \ b; disp('Reseni soustavy') disp(x) end end
Pokračování příkladu: Volání funkce pro soustavu: 3x1 + 4x2 = 11 2x1 – 5x2 = – 8
det([3,4;2,-5]) ans = -23
soust_rov_det([3,4;2,-5],[11;-8]) Reseni soustavy 1 2 det([1,1;2,2]) ans = x1 + x2 = 11 0 2x1 + 2x2 = – 8 soust_rov_det([1,1;2,2],[11;-8]) Determinant se rovna nule => konec!
linspace(od, do, počet_prvků_mezi_od_do) – vytvoří řádkový vektor se zadaným počtem prvků rovnoměrně rozložených mezi počáteční a koncovou hodnotou Např.: linspace(0,10,5) – 5 prvků mezi 0 a 10 ans = 0 2.5000 5.0000 7.5000 10.0000 logspace(exp_od, exp_do, počet_prvků) – vytvoří řádkový vektor, avšak se zadaným počtem prvků logaritmicky rozložených mezi 10exp_od a 10exp_do. Např.: logspace(0,1,5)– 5 prvků mezi 100 a 101, tj. 5 bodů mezi 1 a 10 ans = 1.0000 1.7783 3.1623 5.6234 10.0000
– prvky mezi 0 a 4 s krokem 2
0:2:4 ans =
0
2
4
linspace(0,4,3) – 3 prvky mezi 0 a 4 (nezadán krok) ans = – lineární rozložení prvků 0 2 4
logspace(0,4,3) – 3 prvky mezi 100 a 104, tj. mezi 1 a 10000 ans = – logaritmické rozložení prvků 1 100 10000
– prvky mezi 0 a 4 s krokem 2
0:2:4 ans =
0
2
4
není zadán počet prvků
linspace(0,4,3) – 3 prvky mezi 0 a 4 (nezadán krok) ans = – lineární rozložení prvků není zadán 0 2 4 krok
logspace(0,4,3) – 3 prvky mezi 100 a 104, tj. mezi 1 a 10000 ans = – logaritmické rozložení prvků 1 100 10000 není zadán krok
plot() – vytváří dvou-dimenzionální grafy, – mnoho různých kombinací vstupních argumentů, – nejjednodušší formou je plot(y), plot(x,y) . plot(y) – vykreslí hodnoty vektoru y v závislosti na jejich indexu (pořadí ve vektoru) plot (x, y) – vykreslí hodnoty vektoru y v závislosti na hodnotách vektoru x. plot (x, y,'řetězec') – vykreslí hodnoty vektoru y v závislosti na hodnotách vektoru x, řetězec svým složením příslušných znaků nastaví barvu křivky, příp. značky, typ značky a styl čáry
Příklad: vykreslení grafu funkce y=sin(t) pro t z intervalu od 0 do 2π Použití „:“, příp. linspace() , potom sin() a plot() t = [0:0.01:2*pi]; y = sin(t); plot(t,y,'r')
– lze
nastavit barvu křivky: k (black), r (red), g (green),b (blue), m (magenta), c (cyan), w (white), y (yellow) – řetězec se píše do apostrofů např. plot(t,y,'m') nebo plot(t,y,'k') nebo celým názvem plot(t,y,'green')
t = [0:0.01:2*pi]; y = sin(t); plot(t,y,'--g') % čárkovaná zelená křivka – lze nastavit styl čáry: '-' plná čára '-.' čerchovaná čára '--' čárkovaná ':' tečkovaná viz help plot Např. plot(t,y,'-.k') (Pozn. platí pro MATLAB, v jiných výpočetních systémech jiné možnosti)
– lze nastavit typ bodu: v ,^, <, > trojúhelník (různě orientovaný), o kolečko,. bod, + plus, * hvězdička, x křížek, s čtverec, apod. t = [0:0.2:2*pi]; y = sin(t); plot(t,y,'o')
t = [0:0.4:2*pi]; y = sin(t); plot(t,y,'^')
Další typy značek bodů - viz help plot
– lze nastavit typ bodu: v ,^, <, > trojúhelník (různě orientovaný), o kolečko,. bod, + plus, * hvězdička, x křížek, s čtverec, apod. t = [0:0.2:2*pi]; y = sin(t); plot(t,y,'o')
krok => rozložení bodů v grafu
t = [0:0.4:2*pi]; y = sin(t); plot(t,y,'^')
Další typy značek bodů - viz help plot
– při vykreslování křivky je důležitá velikost kroku, příp. počet prvků, ve vektoru t (na ose x). t = [0:0.01:2*pi]; t = [0:1:2*pi]; y = sin(t); y = sin(t); plot(t,y,'r') plot(t,y,'m')
– při vykreslování křivky je důležitá velikost kroku, příp. počet prvků, ve vektoru t (na ose x). t = [0:0.01:2*pi]; t = [0:1:2*pi]; y = sin(t); y = sin(t); plot(t,y,'r') plot(t,y,'m') krok
– při vykreslování křivky je důležitá velikost kroku, příp. počet prvků, ve vektoru t (na ose x). t = [0:0.01:2*pi]; t = [0:1:2*pi]; y = sin(t); y = sin(t); plot(t,y,'r') plot(t,y,'m') krok
length(t) ans = 629
length(t) ans = 7
– při vykreslování křivky je důležitá velikost kroku, příp. počet prvků, ve vektoru t (na ose x). t = linspace(0,2*pi,500); y = sin(t); t = linspace(0,2*pi,5); plot(t,y,'b') y = sin(t); plot(t,y,'c')
– při vykreslování křivky je důležitá velikost kroku, příp. počet prvků, ve vektoru t (na ose x). t = linspace(0,2*pi,500); y = sin(t); t = linspace(0,2*pi,5); plot(t,y,'b') y = sin(t); počet plot(t,y,'c') prvků ve vektoru t
– název
grafu – parametr – řetězec v apostrofech
title('graf sin')
– popis os – parametr – řetězec v apostrofech
xlabel('t') ylabel('y') zlabel('z') – pro 3D grafy
– název
grafu – parametr – řetězec v apostrofech
title('graf sin')
– popis os – parametr – řetězec v apostrofech
xlabel('t') ylabel('y') zlabel('z') – pro 3D grafy
– název
grafu – parametr – řetězec v apostrofech
title('graf sin')
– popis os – parametr – řetězec v apostrofech
xlabel('t') ylabel('y') zlabel('z') – pro 3D grafy
– název
grafu – parametr – řetězec v apostrofech
title('graf sin')
– popis os – parametr – řetězec v apostrofech
xlabel('t') ylabel('y') zlabel('z') – pro 3D grafy
– více křivek v jednom grafu plot(x1,y1,x2,y2,…,xn,yn) Např. y1=sin(t), y2=cos(t) t = linspace(0,2*pi,80); y1 = sin(t); y2 = cos(t); plot(t,y1,'ok',t,y2,'xg') xlabel('t') ylabel('y') title('graf sin a cos') legend('sin(t)','cos(t)')
– více křivek v jednom grafu plot(x1,y1,x2,y2,…,xn,yn) Např. y1=sin(t), y2=cos(t) t = linspace(0,2*pi,80); y1 = sin(t); y2 = cos(t); plot(t,y1,'ok',t,y2,'xg') xlabel('t') ylabel('y') title('graf sin a cos') legend('sin(t)','cos(t)')
– křivka sin(t) zobrazena černými kolečky ('ok'), křivka cos(t) zelenými křížky ('xg')
– více křivek v jednom grafu plot(x1,y1,x2,y2,…,xn,yn) Např. y1=sin(t), y2=cos(t) t = linspace(0,2*pi,80); y1 = sin(t); y2 = cos(t); plot(t,y1,'ok',t,y2,'xg') xlabel('t') ylabel('y') title('graf sin a cos') legend('sin(t)','cos(t)')
– křivka sin(t) zobrazena černými kolečky ('ok'), křivka cos(t) zelenými křížky ('xg')
– více křivek v jednom grafu plot(x1,y1,x2,y2,…,xn,yn) Např. y1=sin(t), y2=cos(t) t = linspace(0,2*pi,80); y1 = sin(t); y2 = cos(t); plot(t,y1,'ok',t,y2,'xg') xlabel('t') ylabel('y') title('graf sin a cos') legend('sin(t)','cos(t)') – legend ('řetězec1', ..., 'řetězecn') umístí legendu podle pořadí uvedených řetězců (nutno dodržet pořadí jednotlivých křivek, jak byly kresleny, např. příkazem plot)
– křivka sin(t) zobrazena černými kolečky ('ok'), křivka cos(t) zelenými křížky ('xg')