Wykład 2 MATLAB cd INFORMATYKA 2 MPZI2 sem.4
2x + 3y – 4z = 5 x + y – z = 3,5 –2,5y – z = 2 Rozwiązanie w Matlabie (m-plik): A = [ ; ; ] 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 Rozwiązywanie układu równań liniowych Wybrane metody wykorzystania macierzy 2
…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 3
Wyznaczanie pierwiastków równania n-tego stopnia funkcja roots(M) - gdzie M jest wektorem współczynników przy kolejnych potęgach np. x 3 + 3x 2 –4 =0 instrukcja: R=roots ([ ]) 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! 4
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 5
Macierze specjalne ones ( n,m) - macierz nxm wypełniona jedynkami zeros(n,m)- macierz nxm wypełniona zerami magic(n)- wektor sum elementów w kolumnach macierzy A x=magic(4) y1=sum(x) y2=sum(x') x = y1 = y2 = także przekątne mają sumę=34
M=round(10*rand(3)) w=size(M) M2=reshape(M,1, 9) M2=reshape(M',1, 9) Przykład 7 M = w = 3 3 M2= M3 =
sort (A, i, typ) i: 1 - kolumny lub 2 - wiersze typ: 'ascend' 'descend' domyślne wartości: 1 i 'ascend' m = sortowanie kolumnami m1 = sortowanie wierszami m2 = sortowanie wierszami malejąco m2 = 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') 8 Sortowanie
Możliwe jest także tworzenie tzw. tablic komórkowych >>A = {[1 8 5], 'Jakiś tekst'; 2+4i, 1:2:7} Po co? Umożliwiają umieszczenie różnych typów danych w komórkach (tablice heterogeniczne) – teksty, dane liczbowe, tablice >> s1= A{1} % pierwsza składowa tablicy A s1 = A = [1x3 double] 'Jakiś tekst' [ i] [1x4 double] 9
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 Fragmenty wektorów i macierzy dwuwymiarowych:
11 clear,clc M=fix(rand(4)*10) M2=M(2:3,2:3) M3=M(2:end;1:end) M = M2 = M3 = Przykład
Instrukcja iteracyjna („pętla liczona”) for zmienna = wartość_pocz : krok: wartość_końcowa instrukcja1 instrukcja2 ….itd. end Schemat iteracji: 12 Jeśli pominięty krok to krok=1
clear for i= 1:1:10, a(i) = i; %generowanie kolejnych elementów wektora disp(a) pause end; Przykłady prostych "pętli": clc for i= 1:10, disp('jakiś tekst') end; 13
%generowanie kolejnych elementów wektora for wiersz= 1:10, for kolumna = 1:10, a(wiersz, kolumna) = wiersz*kolumna pause end Przykład ("zagnieżdżanie" iteracji): 14
15 for i= 1:5, for j = 1:i, a(i, j) = i*j; end disp(a) Przykład (uzależnienie licznika "pętli wewnętrznej):
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 disp(suma) Przykład (sumowanie elementów w tablicy dwuwymiarowej): 16
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 disp(iledod) Przykład (zliczanie warunkowe - elementów dodatnich w tablicy dwuwymiarowej): 17
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 Przykład 18
WYKRESY 2-wymiarowe x=0:10 %generowanie wektora co 1 % wart_pocz:wart_koncowa y=[ ] z=[ ] %trzeci wektor title('wykres')%dodanie tytułu plot(x,y) %rysowanie wykresu plot(x,y,'r',x, z,'k') %r – red k- black 1 sposób: Funkcja plot Wymaga utworzenia dwóch wektorów o tej samej liczbie elementów 19
x=0:90%generowanie wektora co 1 y=sind(x) %wektor y plot(x,y),grid%wykres z siatką Przykłady wykresów funkcji x=0:pi/50:6*pi y=cos(2*x)./sqrt(x+1) plot(x,y) x = - 9:1:9 z = x.^2 plot(x, z) Uwaga: zapis kropkowy elementowe dzielenie(mnożenie wektorów) 20
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 2 sposób: Funkcja fplot 21
Sposoby rysowania wielu krzywych fplot('[sin(x*x)/x cos(x)]',[0.01 4*pi]) fplot('sin(x*x)/x',[0.01 4*pi]) hold on fplot('cos(x)',[0.01 4*pi]) subplot(1,2,1) fplot('sin(x*x)/x',[0.01 4*pi]) subplot(1,2,2) fplot('cos(x)',[0.01 4*pi])
Krzywe 3D Wykorzystujemy funkcję plot3(y,z,x) Przykładowo dla krzywej (helisy) danej równaniami: y=sin(x)z=cos(x) Tworzymy m-plik: t = 0:pi/50:10*pi; plot3(sin(t),cos(t),t); Wykresy 3D 23
Piszemy m-plik: 24 clear x = (0:0.01:pi)'%wektor (kolumnowy!) x y = x'%wektor wierszowy y z=cos(3*x) * sin(y)%przeanalizować tablicę z mesh(x, y, z) z=cos3x siny Powierzchnie 3D Korzystamy z funkcji mesh(x,y,z) Dla powierzchni podanej równaniem:
Przykładowe funkcje rysujące standardowe wykresy powierzchniowe 3D peaks cylider (średnica) sphere (precyzja) 25
clear c = [ ; ] save ('mydata.dat', 'c','-ASCII') clear load ('mydata.dat') disp('Dane z pliku:'); mydata 26 Zapis całej tablicy do pliku ASCII i odczyt z pliku Obsługa plików
a=rand(3); b=6; save ('plik.mat', 'a', 'b'); clear a clear b load ('plik.mat') whos disp(a) disp(b) 27 Zapis danych do pliku typu mat i odczyt z pliku
Porównywanie kolejnych par elementów sąsiadujących i zamiana miejscami w przypadku niewłaściwej kolejności Sortowanie bąbelkowe N N-1 porównań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, a
PRZEBIEG 1 PRZEBIEG
30 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 if G(m)>G(m+1) pom=G(m); G(m)=G(m+1); G(m+1)=pom; end disp(G) %pokazuje kolejne wypływające "bąbelki" end %ostatecznie po posortowaniu disp(G) zamiana miejscami gdy elementy w niewłaściwej kolejności M-plik- sortowanie "bąbelkowe"
Symbolic ToolBox Dodatkowy zestaw narzędziowy do Matlaba Wymaga odrębnej licencji
wymagają zadeklarowania zmiennych symbolicznych – abstrakcyjnych zmiennych nie posiadających wartości. syms zmienna1 zmienna2 itd Służy do tego polecenie syms: 32 Obliczenia symboliczne
Symboliczne rozwiązywanie równań – funkcja solve() syms x a f=a - x^2 f = a - x^2 r=solve(f, x) r= a^(1/2) -a^(1/2) Przykład: 33
syms a b c d A=[a b; c d] A = [ a, b] [ c, d] B=[e f ; g h] B = [ e, f] [ g, h] Symboliczne operacje macierzowe il_m=A*B il_m = [ a*e+b*g, a*f+b*h] [ c*e+d*g, c*f+d*h] il_e=A.*B il_e = [ a*e, b*f] [ c*g, d*h] ilustracja iloczynów macierzy kwadratowych macierzowy Cauchy'ego elementowy Hadamarda (po współrzędnych) 34
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 = Obliczenia na wyrażeniach symbolicznyc h - funkcja subs( ) 35
Argumentami funkcji są: funkcja, której pochodna będzie liczona, zmienna, względem której pochodna jest liczona (opcjonalnie) rząd pochodnej (opcjonalnie) Obliczanie pochodnych funkcji - funkcja diff( ) diff (F,[zmienna],[N]) 36
syms x df=diff(x^2) df = 2*x Przykład: Obliczenie pochodnej funkcjif(x)=x 2 37
syms x y z f=(x*y*z)^x+(1/(x*y))^2 dfx=diff(f) dfx = (x*y*z)^x*(log(x*y*z)+1)-2/x^3/y^2 dfx=diff(f,x) dfx = (x*y*z)^x*(log(x*y*z)+1)-2/x^3/y^2 dfy=diff(f,y) dfy = (x*y*z)^x*x/y-2/x^2/y^3 dfz=diff(f,z) dfz = (x*y*z)^x*x/z Obliczenie pochodnej funkcji f(x, y, z) według każdej zmiennej (pochodne cząstkowe): Przykład: 38
u= (x*y*z)^x*(log(x*y*z)+1)^2+(x*y*z)^x/x+6/x^4/y^2 Obliczenie drugiej pochodnej funkcji: Przykład: f (x, y, z) syms x y z f=(x*y*z)^x+(1/(x*y))^2 u=diff(f,x,2) 39 Można też tak: u=diff(diff(f,x))
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}) Uwaga: domyślnie zmienną symboliczną jest x 40 opcjonalnie
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 Przykład: Obliczenie całki nieoznaczonej funkcji f(a,b)=a+b 41
Obliczenie całki oznaczonej: syms x c=int(x^2,1,3) syms x c=int(sin(x),0,pi) Obliczenie całki oznaczonej funkcji sin(x) w przedziale (0, π) c= 26/3 c = 2 42
Obliczenie całki oznaczonej: syms x c=int(x^2,1,3) ezplot(x^2,[1 3]) c= double(c) syms x c=int(sin(x),0,pi) Obliczenie całki oznaczonej funkcji sin(x) w przedziale (0, ) c= 26/3 c = c = 2 43 Całka oznaczona określa pole powierzchni między krzywą opisaną daną funkcją a osią x w określonym przedziale
44 Wykresy funkcji symbolicznych ezplot( f, [xmin xmax ymin ymax]) 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])
45 ezplot( f ) Domyślne przedziały: x (-2 , 2 ), y (-2 , 2 ) ezplot( 'x-y', [ ] ) Mogą być też funkcje uwikłane dwóch zmiennych: ezplot( 'x-y ') domyślny przedział: x (-2 , 2 )
46 clc syms x y f=y-sin(x) df=y-diff (f) ezplot (f,[0 2*pi -1 1]) hold on ezplot (df,[0 2*pi -1 1]) Przykład
47 Długość krzywej (np. paraboli) clc clear syms x disp('parabola') f=x^2; d=int(sqrt(1+diff(f)^2), -1, 1); %całka oznaczona disp('całkowita długość:') disp(d) disp (double(d)) parabola f= x^2 całkowita długość: 5^(1/2)-1/2*log(-2+5^(1/2)) a b