Matlab, zajęcia 2. Dwukropek W Matlabie bardzo przydatnym operatorem jest dwukropek ma on kilka znaczeń to - (do) w sensie np. od do, Oznaczenie przedziału Oznaczenie całego zakresu Popatrzmy jak to działa A=1:30; A A' Można podać też krok B=1:3:40 C=10:-1:1 D=2:-0.05:1 Itd. Wybieranie zakresu A(1,1:5) %pierwszy wiersz i kolumny 1 do 5 %macierz o elementach losowych z rozkładu normalnego D=randn(15,15); D %wybranie 2 pierwszych elementow z 4 wiersza D(4,1:2) %wybranie kolumn 1 i 2 D(:,1:2) %wybranie kolumn 1,4 i 7 D(:,1:3:7) %drugi wiersz macierzy D(2,:) Definiowanie różnych macierzy B=zeros(8,8) B(:,1)=1:8 B(3,:)=100:-10:30 B(:,4)=B(:,1) Definiowanie ciągów 1
D=zeros(3,4) D(1:12)=3:3 D(1:12)=3:3:36 %jeśli chcemy mieć wyrazy kolejno w wierszach trzeba macierz transponować np. d=d' Zmienianie macierzy w wektor B(:) Możemy użyć też słowa end B(end,:) B(:,end) Usuwanie wierszy i kolumn K=[1:3;4:6;7:9] %usunięcie pierwszej kolumny K(:,1)=[] %usunięcie pierwszego wiersza K(1,:)=[] %usunięcie likwiduje dany wiersz bądź kolumnę z macierzy! Wyrażenia logiczne Programując bardzo często będziemy musieli posługiwać się wyrażeniami logicznymi. W wyniku operacji logicznych wynikiem jest prawda albo fałsz (TRUE, FALSE), standardowo kodowanych jako 1-prawda, 0-fałsz. relacje = = równość ~= różny od > większy >= większy lub równy < mniejszy <= mniejszy lub równy Operatory & koniunkcja alternatywa ~ negacja xor alternatywa wykluczająca 2=3 %błędne wyrażenie 2
2==3 %test logiczny w wyniku 0 a=2==3 %przypisanie wartości Zobacz, że w workspace nowa zmienna traktowana jest jako zmienna logiczna. Można jednak wykonać operacje a*3 W wyniku dostaniemy już liczbę. Operacje logiczne dla macierzy A=[1,2,3;4,5,6] B=[1,3,3;5,5,5] %porównanie element po elemencie A==B A>B A>=B A~=B %znalezienie elementów różnych w macierzach ~ans %ten sam wynik co przy == Przy operatorach 3>4 & 2<3 3>4 2<3 xor(3>4,2<3) xor(3<4,2<3) %fałsz, bo oba są prawdziwe Operatory dla macierzy A=[1 0 3 pi] B=[0 0 2 0] A&B A B xor(a,b) Analogiczne operacje możemy wykonywać dla słów 'ola'=='ala' Najważniejsze funkcje logiczne A=[1,2,3; 0, 2 NaN] % any czy jest niezerowy element w wektorze? any(a) % all- czy wszystkie elementy są niezerowe all(a) %isnan czy jest nieliczbą? isnan(a) %czy jest wartością skończoną? 3
isfinite(a) %czy jest literą? isletter(a) %find indeksy niezerowych elementów macierzy find(a) Inne operacje macierzowe Wyznacznik macierzy (det) A=magic(4) det(a) Wiemy, że można sprawdzić, czy macierz jest dodatnio określona badając jej minory główne (jeśli wszystkie są dodatnie to macierz jest dodatnio określona). Zbadajmy dla naszej macierzy A det(a(1:1)) %pierwszy minor det(a(1:2,1:2)) %drugi minor det(a(1:3,1:3)) %trzeci minor Znajdowanie wartości własnych macierzy Jak wiemy wartości własne macierzy to Av = λv A=[0-6 1; 6 2-16; -5 20-10] lambda=eig(a) [V,D] = eig(a) Kolumny macierzy V to kolejne wektory własne macierzy V(:,1) 4
A*V(:,1) ans/d(1:1) Faktoryzacja Choleskiego W wielu operacjach macierze faktoryzuje się. W ekonometrii często wykorzystuje się faktoryzacje Choleskiego A = RR ' gdzie R jest macierzą górno-trójkątną A=pascal(6) R=chol(A) %sprawdzenie R'*R Dzięki temu możemy rozwiązać układy równań Ax=b R Rx=b x = R\(R'\b) Jest to dużo szybsze numerycznie. Dekompozycja LU A = LU gdzie L jest macierzą dolno-, a U górno-trójkątną M2=magic(3) b=[3;4;5] [L,U]=lu(M2) U\(L\b) %sprawdzenie M2*ans Zapisywanie danych Dane znajdujące się w workspace można zapisywać. Robi się to poprzez wybranie z menu File, opcji save workspace as. Proszę spróbować. Następnie usuwamy wszystkie dane poprzez clear 5
i wczytujemy dane poprzez open (ctrl+o). Wszystkie macierze powinny znowu znaleźć się w Matlabie. Możemy też korzystać z opcji save save A1 A clear A load A1 Przy takiej konwencji pliki zapisywane są w bieżącym katalogu (jeśli nic nie zmienialiśmy to w katalogu typu C:\Program Files\MATLAB71\work) M-pliki M-pliki służą do zautomatyzowania naszej pracy w Matlabie. Z jednej strony pozwalają łatwo poprawiać długie sekwencje, z drugiej możemy pisać własne funkcje. Na początek otwórzmy nowy m-plik, poprzez opcję nowy i wprowadźmy następujący kod function c=pitagoras(a,b); c2=a^2+b^2; c=sqrt(c2); Jest to prosta funkcja obliczającą długość przeciwprostokątnej przy zadanych długościach przyprostokątnych. M-plik należy zapisać i w matlabie możemy podać np. komendę pitagoras(3,4) albo c=pitagoras(3,4) Oczywiście jest to bardzo prosta funkcja. Aby funkcje były dobrze napisane należy zabezpieczyć się przed niepoprawnym użyciem. Podajmy komendę c=pitagoras(3,[4,5;1,2]) albo c=pitagoras(3,[4,5]) c=pitagoras(3,4,5) W wyniku mamy błąd, albo jakiś niekonkretny wynik Dodajmy funkcję if function c=pitagoras(a,b); if all(size(a)==[1,1]) c2=a^2+b^2; 6
c=sqrt(c2); else error('argumenty muszą być liczbami') end Funkcja if musi kończyć się słowem end! c=pitagoras([4,5;1,2],3) Oczywiście nasza funkcja nie jest jeszcze doskonała. Nie sprawdza wymiaru macierzy b, ale już jest lepsza. Dodajmy jeszcze mały help do naszej funkcji Przed słowem function wstawmy tekst % pitagoras(a,b) - funkcja oblicza długość przeciwprostokątnej przy % zadanych przyprostokątych. Argumenty muszą być liczbami % autor T.Mostowski (04.03.2007) Zapiszmy zmiany i w matlabie podajmy komendę help pitagoras If-elseif-else W wyrażeniach warunkowych możemy też podawać opcję elseif Funkcja wystawiająca ocenę function x=ocena(a) if a<50 x='niedostateczny'; elseif a<=70 x='dostateczny'; elseif a<=85 x='dobry'; else x='bardzo dobry'; end for Jednymi z bardziej pożytecznych pętli są pętle for. Prosta funkcja badającą, czy macierz jest dodatnio określona. W wyniku dostaniemy 1 jeśli macierz jest dodatnio określona, a 0 w p.p. 7
% odotanio(a) - funkcja bada, czy macierz jest dodatnio określona. Zwraca % jeden jeśli tak i 0 w p.p. Na wejściu musi być macierz kwadratowa % autor T.Mostowski (04.03.2007) function c=ododatnio(a); [n m]=size(a); %pobranie wymiaru macierzy l=zeros(1,n); %stworzenie wektora zer for i=1:n l(i)=det(a(1:i,1:i))>0; %sprawdzamy, czy każdy kolejny minor jest większy od zera end c=all(l); %sprawdzamy, czy wszystkie liczby są różne od zera Sprawdźmy A=magic(4) %już wiemy, że nie jest ododatnio(a) B=pascal(5) ododatnio(b) 8
Zadania Zadanie 1. wprowadź do Matlaba następującą macierz A 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 123 100 77 54 31 8-15 -38-61 0 0 0 0 0 0 0 0 0 Oraz taką B 0 0 0 0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 Oraz wektor C o elementach od 32 do 3 o kroku równym 0,5. Macierze należy podać w sprytny sposób, a nie definiując liczbę po liczbie! Zadanie 2. Stworzyć macierz A2 o wymiarach 3na3 stworzoną z macierzy A jako 3,4,5 kolumna i 1,2,3 wiersz Stworzyć macierz B2 o wymiarach 3 na3 stworzoną z macierzy B jako 2,3,4 kolumna i 2,3,4 wierz Zadanie 3. Stworzyć macierz logiczną L mającą 1 w miejscach, gdzie A2 jest większe niż B2. Zadanie 4. Dla macierzy B2 znaleźć rozkład LU. Zadanie 5. Dla macierzy B znaleźć wektory własne. 9
Zadanie 6. Popraw funkcję pitagoras, tak aby sprawdzała też, czy argument b jest liczbą Zadanie 7. Napisz następujące proste funkcje. iscolumnvector sprawdza, czy argument jest wektorem kolumnowym (analogicznie jak poprzednia funkcja) isrowvector analogicznie, tylko sprawdza czy jest to wektor wierszowy whichvector(a,b) funkcja zwracająca 0 dla niewektora, 1 dla kolumnowego i 2 dla wierszowego lub słowa niewektor, kolumnowy, wierszowy w zależności od parametru b. Jeśli b jest 0 to słowami, jeśli b jest =1, to liczbami. Napisz też do tej funkcji help i sprawdzaj, czy argumenty są poprawne. Zadanie 8. Znaleźć dekompozycje Choleskiego dla macierzy 1 1 1 1 1 1 2 3 4 5 1 3 6 10 15 1 4 10 20 35 1 5 15 35 70 (Macierz Pascala) Zadanie 9. Zadanie 10. Zadanie 11. Znajdź dla tej macierzy dekompozycję LU Popraw funkcję ododatnio, żeby sprawdzała, czy macierz jest kwadratowa. Napisz funkcję badającą, czy macierz jest ujemnie określona (Macierz jest ujemnie określona, jeśli jej minory główne są na przemian ujemne i dodatnie, przy czym pierwszy jest ujemny) Praca domowa nr 1 Rozwiązanie przynajmniej 6 z powyższych zadań. 10