DFX 8
Transkrypt
DFX 8
INFORMATYKA MPDI2 Wykład 9 MATLAB cd TABLICE Tworzenie tablicy wektor wierszowy M1=[1 2 3 4 5] lub M1=[1, 2, 3, 4, 5] wektor kolumnowy M2=[1; 2; 3; 4; 5] tablica dwuwymiarowa M3 = [1 2 3; 2 1 1; 1 0 0] 2 Metoda generowania tablicy o elementach ciągu arytmetycznego x=0:2:10 %generowanie wektora od 0 do 10 co 2 % wart_pocz:krok:wart_koncowa 0 2 4 6 8 x= 0:0.1:2 10 %dozwolona wartość dziesiętna kroku Można pominąć krok: x=0:10 %generowanie wektora od 0 do 10 co 1 % wart_pocz:wart_koncowa 0 1 2 3 4 5 6 7 8 9 10 3 Podobnie w tablicach wielowymiarowych M = [0:5 ; 10:15] %wartość początkowa: wartość końcowa (krok 1) 0 1 2 3 4 5 10 11 12 13 14 15 ale UWAGA! M = [0:5; 10:17] błąd arguments dimensions are not consistent 4 Można wygenerować tablicę z wartościami funkcji: x= [0 : 0.1: 10] %wartość początkowa: krok: wartość końcowa M=[x; sind(x)] 0 0 0.1000 0.0017 0.2000 0.0035 0.3000 0.0052 0.4000 0.0070 0.5000 0.0087 0.6000 0.0105 0.7000 0.0122 0.8000 0.0140 0.9000 0.0157 1.0000 0.0175 x= [1 :10] M=[x; log(x)] 1.0000 0 2.0000 0.6931 3.0000 1.0986 4.0000 1.3863 5.0000 1.6094 6.0000 1.7918 7.0000 1.9459 8.0000 2.0794 9.0000 2.1972 10.0000 2.3026 5 Dostęp do elementu tablicy M1=[ 1 3 5 -11 7] disp(M1(3)) wyświetlony zostanie trzeci element tablicy ale też M2(8) M2 = [1 2 3; 2 1 1.5; 1 0 0] disp(M2(2,3)) 147 258 369 Można elementy zdefiniowanej tablicy wykorzystać w wyrażeniach: y= M(2,2)^2 6 Operacje na tablicach (macierzach) m4=[1 2 34 6;6 8/2 4 -2; 2 -5 56 6; 6 72 0.2 12] m4t = m4' %macierz sprzężona – transponowana m4o = m4^-1 %macierz odwrotna (macierz kwadratowa!) mo= inv(m) s=m4*m4o w=det(m4) % także obliczenie macierzy odwrotnej! %sprawdzenie - macierz jednostkowa %wyznacznik,uwaga:macierz musi być kwadratowa! 7 Operatory "kropkowe" dla tablic jeśli A i B są tablicami C=A*B to iloczyn macierzowy – kiedy dozwolony? - gdy macierz A ma tyle kolumn ile macierz B wierszy D=A.*B to iloczyn elementowy – każdy element macierzy D powstaje z iloczynu odpowiednich elementów macierzy A i B – dozwolony gdy A i B mają te same wymiary i rozmiary podobnie ./ .^ (dzielenie i potęgowanie elementowe) A^2 % tożsame z A*A (uwaga:A musi być kwadratowa) A.^2 % każdy element do kwadratu – A dowolne 8 Proste przykłady operacji macierzowych: 1 2 3 4 1 3 4 1 2 * .* 1 3 4 1 2 3 4 6 ./ .^ 8 = 3 2 2 3 1 = 2 2 16 1 2 2 3 1 sumy iloczynów! 18 = = 2 6 12 1 0.5 1.5 0.25 1 4 9 64 6 9 Wybrane metody wykorzystania macierzy Rozwiązywanie układu równań liniowych 2x + 3y – 4z = 5 x + y – z = 3,5 –2,5y – z =2 Rozwiązanie w Matlabie (m-plik): A = [2 3 -4 ; 1 1 -1 ; 0 -2.5 -1] B = [ 5 ; 3.5 ; 2] X= A^(-1)*B %wektor rozwiązań (lub X=inv(A)*B) A*X % wynikiem powinien być wektor wyrazów wolnych B 10 …sprawdzenie rozwiązań: s1=A(1,1)*X(1)+ A(1,2)*X(2)+A(1,3)*X(3)-B(1) …. powinno dać wartość s1=0 podobnie: s2=A(2,1)*X(1)+ A(2,2)*X(2)+A(2,3)*X(3)-B(2) s3=A(3,1)*X(1)+ A(3,2)*X(2)+A(3,3)*X(3)-B(3) Uwaga: rozwiązania istnieją jeśli równania układu nie są liniowo zależne 11 Wyznaczanie pierwiastków równania n-tego stopnia funkcja roots(M) - gdzie M jest wektorem współczynników przy kolejnych potęgach np. x3 + 3x2 –4=0 instrukcja: R=roots ([1 3 0 -4]) wyznacza pierwiastki równania R – będzie wektorem rozwiązań - jeśli równanie rzędu N to mamy N rozwiązań - rozwiązaniami mogą być liczby zespolone! 12 Użyteczne wbudowane funkcje tablicowe rand(n) - losowo generowana tablica kwadratowa nxn rand(n,m) - losowo generowana tablica prostokątna nxm sum (A) - wektor sum elementów w kolumnach macierzy A sum(sum(A)) - suma wszystkich elementów macierzy 2-wymiarowej max(A) - wektor elementów maksymalnych w kolumnach max(max(A)) - element największy w macierzy dwuwymiarowej min(A) - wektor elementów minimalnych w kolumnach macierzy A min(min(A)) - element najmniejszy w macierzy dwuwymiarowej ndims(A) - ile wymiarów macierzy numel(A) - liczba elementów macierzy reshape(A,n,m) - rekonfiguracja macierzy size(A) - rozmiar macierzy length(A) - największy rozmiar 13 Macierze specjalne ones(n,m) - macierz nxm wypełniona jedynkami zeros(n,m) magic(n) - macierz nxm wypełniona zerami - wektor sum elementów w kolumnach macierzy A x=magic(4) y1=sum(x) y2=sum(x') x= 16 2 5 11 9 7 4 14 y1 = 34 34 y2 = 34 34 3 13 10 8 6 12 15 1 34 34 34 34 także przekątne mają sumę=34 Przykład M=round(10*rand(3)) w=size(M) M2=reshape(M,1, 9) M2=reshape(M',1, 9) M= 2 9 3 w= 3 M2= 2 M3 = 2 2 3 6 5 4 8 3 9 3 2 3 6 5 4 8 2 5 9 3 4 3 6 8 15 Sortowanie sort (A, i, typ) i: 1 - kolumny lub 2 - wiersze typ: 'ascend' 'descend' domyślne wartości: 1 i 'ascend' clc m=round(10*rand(5)) disp('sortowanie kolumnami') m1=sort(m,1) disp('sortowanie wierszami') m2=sort(m,2) disp('sortowanie wierszami malejąco') m2=sort(m,2,'descend') m= 3 5 8 10 8 7 10 3 5 3 7 3 5 1 8 2 6 7 1 2 1 2 9 3 9 sortowanie kolumnami m1 = 1 2 3 1 2 2 3 5 1 3 3 5 7 3 8 7 6 8 5 8 7 10 9 10 9 sortowanie wierszami m2 = 3 5 8 8 10 3 3 5 7 10 1 3 5 7 8 1 2 2 6 7 1 2 3 9 9 sortowanie wierszami malejąco m2 = 10 8 8 5 3 10 7 5 3 3 8 7 5 3 1 7 6 2 2 1 9 9 3 2 1 16 Możliwe jest także tworzenie tzw. tablic komórkowych >>A = {[1 8 5], 'Jakiś tekst'; 2+4i, 1:2:7} A= [1x3 double] 'Jakiś tekst' [2.0000 + 4.0000i] [1x4 double] >> s1= A{1} % pierwsza składowa tablicy A s1 = 1 8 5 Po co? Umożliwiają umieszczenie różnych typów danych w komórkach (tablice heterogeniczne) – teksty, dane liczbowe, tablice 17 Fragmenty wektorów i macierzy dwuwymiarowych: A(2:5) fragment wektora (elementy od 2-go do 5-go) A(2:end) od 2-go do końca A(1:2:end) co drugi elemet począwszy od pierwszego A(3,:) cały trzeci wiersz macierzy A A(3,2:5) trzeci wiersz macierzy A o kolumnach od drugiej do piątej A(:,2) druga kolumna macierzy A diag(A) główna przekątna macierzy A Przykład clear,clc M=fix(rand(4)*10) M2=M(2:3,2:3) M3=M(2:end;1:end) M= 7 7 2 6 M2 = 1 1 M3 = 7 2 6 6 1 1 4 9 3 5 2 7 2 5 6 3 5 2 2 5 6 3 5 1 1 4 19 Instrukcja iteracyjna („pętla liczona”) Schemat iteracji: for zmienna = wartość_pocz : krok: wartość_końcowa instrukcja1 instrukcja2 ….itd. end Jeśli pominięty krok to krok=1 20 Przykłady prostych "pętli": clc for i= 1:10, disp('jakiś tekst') end; clear for i= 1:1:10, a(i) = i; %generowanie kolejnych elementów wektora disp(a) pause end; 21 Przykład ("zagnieżdżanie" iteracji): %generowanie kolejnych elementów wektora for wiersz= 1:10, for kolumna = 1:10, a(wiersz , kolumna) = wiersz*kolumna pause end end 22 Przykład (uzależnienie licznika "pętli wewnętrznej): for i= 1:5, for j = 1:i, a(i , j) = i*j; end end disp(a) 1 0 0 0 0 2 4 0 0 0 3 6 9 0 0 4 8 12 16 0 5 10 15 20 25 23 Przykład (sumowanie elementów w tablicy dwuwymiarowej): a=0; suma = 0; for i= 1:5, for j = 1:5, a(i , j) = 2*i - 4* j, pause, %zatrzymuje do naciśnięcia klawisza suma=suma+a(i , j); end end disp(suma) 24 Przykład (zliczanie warunkowe - elementów dodatnich w tablicy dwuwymiarowej): clear; clc a=rand(5,5)-0.5 %tablica z elementami ujemnymi iledod= 0; for i= 1:1:5, for j = 1:1:5, if a(i , j)>0 iledod=iledod+1; end end end disp(iledod) 25 Przykład a=rand(5) disp('Oto 3-ci wiersz') for k= 1:1:5, disp(a(3, k)) end disp('Oto przekątna') for k= 1:1:5, disp(a(k, k)) end 26 WYKRESY 2-wymiarowe 1 sposób: Funkcja plot Wymaga utworzenia dwóch wektorów o tej samej liczbie elementów x=0:10 %generowanie wektora co 1 % wart_pocz:wart_koncowa y=[5.1 1.1 -2 -3 4.2 5.5 4.3 3.1 4.5 5.9 4.9] z=[0 2 3 3 5 4 3 4 5 4 9] title('wykres') plot(x,y) %trzeci wektor %dodanie tytułu %rysowanie wykresu plot(x,y,'r',x , z,'k') %r – red k- black 27 Przykłady wykresów funkcji x=0:90 y=sind(x) plot(x,y) ,grid %generowanie wektora co 1 %wektor y %wykres z siatką x=0:pi/50:6*pi y=cos(2*x)./sqrt(x+1) Uwaga: zapis kropkowy plot(x,y) elementowe dzielenie(mnożenie wektorów) x = - 9:1:9 z = x.^2 plot(x, z) 28 2 sposób: Funkcja fplot Wykres funkcji podanej jako parametr tekstowy jedna krzywa: fplot('sin(x*x)/x',[0 4*pi]) punkt dzielenia przez 0 nie jest rysowany - ostrzeżenie dwie krzywe: fplot('[sin(x*x)/x cos(x)]',[0.01 4*pi]) Uwaga: zamiast x można użyć innej, dowolnej nazwy zmiennej niezależnej 29 1 0.8 Sposoby rysowania wielu krzywych 0.6 0.4 0.2 0 -0.2 -0.4 fplot('[sin(x*x)/x cos(x)]',[0.01 4*pi]) -0.6 -0.8 -1 2 4 6 8 10 12 1 fplot('sin(x*x)/x',[0.01 4*pi]) hold on fplot('cos(x)',[0.01 4*pi]) 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 subplot(1,2,1) fplot('sin(x*x)/x',[0.01 4*pi]) subplot(1,2,2) fplot('cos(x)',[0.01 4*pi]) 2 4 6 8 10 12 1 0.5 0 -0.5 2 4 6 8 10 12 2 4 6 8 10 12 1 0.5 0 -0.5 -1 Wykresy 3D Krzywe 3D Wykorzystujemy funkcję plot3(y,z,x) Przykładowo dla krzywej (helisy) danej równaniami: y=sin(x) z=cos(x) 40 30 Tworzymy m-plik: 20 10 0 1 0.5 t = 0:pi/50:10*pi; plot3(sin(t),cos(t),t); 1 0.5 0 0 -0.5 -0.5 -1 -1 31 Powierzchnie 3D Korzystamy z funkcji mesh(x,y,z) Dla powierzchni podanej równaniem: z=cos3x siny Piszemy m-plik: clear x = (0:0.01:pi)' y = x' z=cos(3*x) * sin(y) mesh(x, y, z) %wektor (kolumnowy!) x %wektor wierszowy y %przeanalizować tablicę z 32 Przykładowe funkcje rysujące standardowe wykresy powierzchniowe 3D peaks cylider (średnica) sphere (precyzja) 33 Obsługa plików Zapis całej tablicy do pliku ASCII i odczyt z pliku clear c = [8 6 4 2;4 -1 4 5] save ('mydata.dat', 'c','-ASCII') clear load ('mydata.dat') disp('Dane z pliku:'); mydata 34 Zapis danych do pliku typu mat i odczyt z pliku a=rand(3); b=6; save ('plik.mat', 'a', 'b'); clear a clear b load ('plik.mat') whos disp(a) disp(b) 35 Sortowanie bąbelkowe Porównywanie kolejnych par elementów sąsiadujących i zamiana miejscami w przypadku niewłaściwej kolejności 1 2 3 N-1 porównań 4 ..... N Wykonujemy N przebiegów Sortowanie bąbelkowe skrócone Przebiegów wykonujemy N-1 W każdym kolejnym przebiegu liczba analizowanych par jest zmniejszana o 1 Przykładowo 96 12 22 76 64 23 74 11 64 23 74 11 96 76 96 rezultat 1 PRZEBIEGU 12 22 76 po 2 PRZEBIEGU 12 22 64 23 74 11 itd. 37 M-plik - sortowanie "bąbelkowe" clc clear N=5; G=rand(1,N) %stadardowa funkcja sortująca G1=sort(G) %sortowanie bąbelkowe for k=1:N-1 for m=1:N-k zamiana miejscami if G(m)>G(m+1) gdy elementy w pom=G(m); niewłaściwej G(m)=G(m+1); kolejności G(m+1)=pom; end end disp(G) %pokazuje kolejne wypływające "bąbelki" end %ostatecznie po posortowaniu disp(G) 38 Symbolic ToolBox Dodatkowy zestaw narzędziowy do Matlaba Wymaga odrębnej licencji Obliczenia symboliczne Wymagają zadeklarowania zmiennych symbolicznych – abstrakcyjnych zmiennych nie posiadających wartości. Służy do tego polecenie syms: syms zmienna1 zmienna2 itd 40 Symboliczne rozwiązywanie równań – funkcja solve() Przykład: syms x a f=a - x^2 f= a - x^2 r=solve(f, x) r= a^(1/2) -a^(1/2) 41 Symboliczne operacje macierzowe syms a b c d A=[a b; c d] ilustracja iloczynów macierzy kwadratowych A= [ a, b] il_m=A*B [ c, d] il_m = macierzowy Cauchy'ego B=[e f ; g h] [ a*e+b*g, a*f+b*h] B= [ c*e+d*g, c*f+d*h] elementowy Hadamarda [ e, f] il_e=A.*B [ g, h] il_e = (po współrzędnych) [ a*e, b*f] [ c*g, d*h] 42 Obliczenia na wyrażeniach symbolicznych Funkcja subs( ) - podstawienie wartości do wyrażenia symbolicznego Przykład: syms a b c x % definicja 4 zmiennych symbolicznych y = solve(a*x^2+b*x+c) % rozwiązanie równania względem x y= -1/2*(b-(b^2-4*a*c)^(1/2))/a -1/2*(b+(b^2-4*a*c)^(1/2))/a a=3; b=4; c=1; % Przypisanie wartości liczbowych a b c w = subs(y) % Obliczenie wartości liczbowej dla y w= -0.3333 -1.0000 43 Obliczanie pochodnych funkcji - funkcja diff( ) Argumentami funkcji są: • funkcja, której pochodna będzie liczona, • zmienna, względem której pochodna jest liczona (opcjonalnie) • rząd pochodnej (opcjonalnie) diff (F,[zmienna],[N]) 44 Przykład: Obliczenie pochodnej funkcji f(x)=x2 syms x df=diff(x^2) df = 2*x 45 Przykład: Obliczenie pochodnej funkcji f(x, y, z) według każdej zmiennej (pochodne cząstkowe): syms x y z f=(x*y*z)^x+(1/(x*y))^2 dfx=diff(f) dfx=diff(f,x) dfy=diff(f,y) dfz=diff(f,z) dfx = (x*y*z)^x*(log(x*y*z)+1)-2/x^3/y^2 dfx = (x*y*z)^x*(log(x*y*z)+1)-2/x^3/y^2 dfy = (x*y*z)^x*x/y-2/x^2/y^3 dfz = (x*y*z)^x*x/z 46 Przykład: Obliczenie drugiej pochodnej funkcji: f (x, y, z) syms x y z f=(x*y*z)^x+(1/(x*y))^2 u=diff(f,x,2) u= (x*y*z)^x*(log(x*y*z)+1)^2+(x*y*z)^x/x+6/x^4/y^2 Można też tak liczyć drugą pochodną: u=diff(diff(f,x)) 47 Całkowanie funkcji - funkcja int( ) Jej argumentem jest funkcja symboliczna opcjonalnie także zmienna całkowania oraz granice całkowania (dla całek oznaczonych). int(F,[zmienna], {a , b}) opcjonalnie Uwaga: domyślnie zmienną symboliczną jest x 48 Przykład: Obliczenie całki nieoznaczonej funkcji f(a,b)=a+b syms a x c=int(a+x) % domyślna zmienna to x c= a*x+1/2*x^2 c=int(a+x, a) % teraz zmienna to a cs = 1/2*a^2+a*x Sprawdzenie: s=diff(f) s= a+x 49 Obliczenie całki oznaczonej: syms x c=int(x^2,1,3) c= 26/3 Obliczenie całki oznaczonej funkcji sin(x) w przedziale (0, π) syms x c=int(sin(x),0,pi) c= 2 50 Wykresy funkcji symbolicznych ezplot( f, [xmin xmax]) 0 20 15 10 f(x), df(x) clc syms x f=x^2 ezplot(f,[-10 10]) hold on df=diff(f) ezplot(df,[-10 10]) hold on f0=0*x ezplot(f0,[-10 10]) 5 0 -5 -10 -15 -20 -10 -5 0 x 5 10 51 ezplot( f ) domyślny przedział: x (-2π, 2π) Można też ustalić zakresy obu osi:15 2 x syms x f=x^2 10 ezplot(f) axis([-5 5 0 15]) 5 0 -5 0 x 5 52