MATLAB
4. gyakorlat Lineáris egyenletrendszerek, leképezések
Menetrend ●
Kis ZH
●
MATLAB függvények
●
Lineáris egyenletrendszerek
●
Lineáris leképezések
Kis ZH ●
pdf
MATLAB függvények ●
a szkriptekhez hasonlóan az Editorban készülnek
●
.m kiterjesztés, NE kezdődjön számmal a fájlnév, NE legyen benne space és NE egyezzen meg beépített függvény nevével (pl. plot.m)
●
function kulcsszóval kezdődik, end zárja le
●
bemenő paraméterek és lehetséges kimenetek
●
saját, lokális scope (a nem visszatérési értékként megadott változók csak a függvény futása alatt léteznek)
peldafv.m function kimenet = peldafv(bemenet1, bemenet2) % Példafüggvény help bejegyzése. A két bemenő % paraméter tetszőleges szám lehet, a kimenet % ezek összege. kulonbseg = bemenet1 – bemenet2; kimenet = bemenet1 + bemenet2; end 1. help peldafv 2. hívjuk meg a függvényt: osszeg = peldafv(2.3, 5.6); 3. Mi van a Workspace-ben?
Példa 1. ●
Írjunk függvényt, amely két bemenő paraméterrel és egy visszatérési értékkel rendelkezik. A bemenő paraméterek közül az első egy mátrix, a második pedig egy egész szám 1 és 3 között.
●
A függvény a második bemenő paraméter értéke alapján a következőket adja vissza:
●
–
1 esetén az első paraméterként kapott mátrix rangját
–
2 esetén a mátrix determinánsát
–
3 esetén a mátrix inverzét
A feltételvizsgálathoz switch struktúrát használjunk!
Megoldás 1. function kimenet = MatrixMuv(matrix, kapcsolo)
end
switch kapcsolo case 1 kimenet = rank(matrix); case 2 kimenet = det(matrix); case 3 kimenet = inv(matrix); otherwise error('Hibás kapcsoló érték.'); end
Megoldás 1. - ellenőrzés >> M = [3 2 7;8 10 23;15 4 1]; >> M_rang = MatrixMuv(M,1) M_rang = 3 >> M_det = MatrixMuv(M,2) M_det = -398.0000
>> M_inv = MatrixMuv(M,3) M_inv = 0.2060 -0.8467 0.2965
-0.0653 0.2563 -0.0452
0.0603 0.0327 -0.0352
0 1.0000 -0.0000
-0.0000 -0.0000 1.0000
>> M*M_inv ans = 1.0000 0.0000 0.0000
Lineáris egyenletrendszerek
(
ax +by+cz=d ex + fy + gz=h ix + jy +kz=l
(
)
a11 x 1 +a12 x 2 +a13 x 3=b1 a 21 x 1 +a 22 x 2 +a23 x 3=b2 a31 x 1 +a32 x 2 +a33 x 3=b3
A x=b −1
−1
A A x= A b −1
x= A b
)
Példa 2. ●
Anna, Béla és Cili Münchenbe utaznak a hétvégére vonattal. Amint leszállnak a RailJet-ről, elhatározzák, hogy gyümölcsöt vesznek. Be is térnek az első kisboltba, ahol: –
Anna vásárol három almát, 12 banánt és egy narancsot, összesen 2.36 EUR-ért.
●
–
Béla 12 almát és két narancsot vesz 5.26 EUR-ért.
–
Cili két banánt és három narancsot vesz 2.77 EUR-ért.
Számoljuk ki, hogy mennyibe került az egyes gyümölcsök darabja!
Megoldás 2. >> A = [3 12 1;12 0 2;0 2 3] A = 3 12 0
12 0 2
1 2 3
>> x = inv(A)*b x =
>> b = [2.36;5.26;2.77]
0.2900 0.0500 0.8900
b = 2.3600 5.2600 2.7700
>> x = A\b x = 0.2900 0.0500 0.8900
Ezt használjuk! (gyorsabb és pontosabb, mint az inv())
Példa 3.
Feladat: Adjuk meg I1, I2 és I3 irányát és nagyságát!
Megoldás 3. >> I = A\b >> A = [1 -1 -1;50 20 0;0 -20 60]
I =
A = 1 50 0
-1 20 -20
-0.1346 -0.3635 0.2288
-1 0 60
>> b = [0;-14;21] Eredmény:
b = 0 -14 21
●
●
●
I1 = 134.6 mA, a csomópontból kifelé I2 = 363.5 mA, a csomópontba befelé I3 = 228.8 mA, a csomópontból kifelé
Megoldás 3. - szimuláció Qucs (http://qucs.sourceforge.net/)
>> I = A\b I = -0.1346 -0.3635 0.2288
Lineáris leképezések
●
●
Minden mátrix egy lineáris leképezésnek tekinthető. A gyakorlaton csak 2D leképezésekről lesz szó.
Példa 4. ●
●
Töltsük be a house.mat fájlt és rajzoljuk ki a house változó tartalmát! Végezzük el az alábbi mátrixok által megadott transzformációkat az alakzaton és rajzoljuk ki az eredményeket egy ábrán, 4 subplotra:
[
0.5 0 A1 = 0 1
]
[
1 0 A2 = 0 0.5
[
0 1 A 3= 0.5 0
]
] [
0.5 0 A4 = 0 −1
]
Megoldás 4. load house.mat figure(1); plot(house(:,1),house(:,2)); axis equal; title('house'); % transzformációk % elvégzése H1 = house*A1; H2 = house*A2; H3 = house*A3; H4 = house*A4;
Megoldás 4. load house.mat figure(1); plot(house(:,1),house(:,2)); axis equal; title('house'); % transzformációk % elvégzése H1 = house*A1; H2 = house*A2; H3 = house*A3; H4 = house*A4;
figure(2); subplot(221); plot(H1(:,1),H1(:,2)); axis equal title('house*A1'); subplot(222); plot(H2(:,1),H2(:,2)); axis equal title('house*A2'); subplot(223); plot(H3(:,1),H3(:,2)); axis equal title('house*A3'); subplot(224); plot(H4(:,1),H4(:,2)); axis equal title('house*A4');
2D forgatás ●
●
2D esetben forgatásról a rajzolási síkra merőleges (általában Z) tengely körül beszélhetünk. Forgatási transzformációs mátrix (φ szöggel):
[
cos(φ) −sin (φ) R(φ)= sin (φ) cos(φ)
]
Példa 5. ●
●
●
Rajzoljuk ki a house változó 15-15 fokkal elforgatott változatait 90 fokig! Ehhez írjunk egy for ciklust, amely minden iterációban elvégez egy kirajzolást! (az adott forgatási szöget a ciklusváltozó jelöli) A program futásának gombnyomásig történő késleltetését a pause paranccsal érhetjük el.
Megoldás 5. % ha nem lenne betöltve load house.mat figure(3); for ang = 0:15:90 % aktuális forgatási szög phi = ang; % aktuális forgatási mátrix R = [cosd(phi) -sind(phi); sind(phi) cosd(phi)]; % forgatás elvégzése HR = house*R; % kirajzolás plot(HR(:,1),HR(:,2)); xlim([-10 10]); Ylim([-10 10]); title(['Forgatás ' num2str(ang) ' fokkal']);
end
% a futás megállítása tetszőleges % billentyű megnyomásáig pause;