Matlab Tablice i ich zastosowania Wykresy Iteracja
description
Transcript of Matlab Tablice i ich zastosowania Wykresy Iteracja
1
Matlab
• Tablice i ich zastosowania
• Wykresy
• Iteracja
Wykład 2
MOiPP
2
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]
3
x=0:2:10 %generowanie wektora od 0 do 10 co 2
% wart_pocz:krok:wart_koncowa
Metoda generowania tablicy o elementach ciągu arytmetycznego
x=0:10 %generowanie wektora od 0 do 10 co 1
% wart_pocz:wart_koncowa
0 2 4 6 8 10
0 1 2 3 4 5 6 7 8 9 10
x= 0:0.1:2 %dozwolona wartość dziesiętna kroku
Można pominąć krok:
M = [0:5 ; 10:15] %wartość początkowa: wartość końcowa (krok 1)
ale UWAGA!
M = [0:5; 10:17]
błąd
arguments dimensions are not consistent
0 1 2 3 4 5
10 11 12 13 14 15
4
Podobnie w tablicach wielowymiarowych
x= [0 : 0.1: 10] %wartość początkowa: krok: wartość końcowa
M=[x; sind(x)]
0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 0.9000 1.00000 0.0017 0.0035 0.0052 0.0070 0.0087 0.0105 0.0122 0.0140 0.0157 0.0175
5
x= [1 :10]
M=[x; log(x)]
1.0000 2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.0000 9.0000 10.00000 0.6931 1.0986 1.3863 1.6094 1.7918 1.9459 2.0794 2.1972 2.3026
Można wygenerować tablicę z wartościami funkcji:
M1=[ 1 3 5 -11 7]
disp(M1(3))wyświetlony zostanie trzeci element tablicy
Dostęp do elementu tablicy
Można elementy zdefiniowanej tablicy wykorzystać w wyrażeniach:
M2 = [1 2 3; 2 1 1.5; 1 0 0]
disp(M2(2,3))
y= M(2,2)^26
ale też M2(8)
1 4 7
2 5 8
3 6 9
7
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) % także obliczenie macierzy odwrotnej!
s=m4*m4o %sprawdzenie - macierz jednostkowa
w=det(m4) %wyznacznik,uwaga:macierz kwadratowa!
Operacje na tablicach (macierzach)
8
jeśli A i B są tablicamiC=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 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
Operatory "kropkowe" dla tablic
9
1 2
3 4
8
18
2
3
1 3
4 1
2 2
3 1
2 6
12 1
* = sumy iloczynów
.* =
1 3
4 1
2 2
16 1
0.5 1.5
0.25 1./ =
2 3
4 6
2 2
3 1
4 9
64 6.^ =
Proste przykłady operacji macierzowych:
10
2x + 3y – 4z = 5x + 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
Rozwiązywanie układu równań liniowych
Wybrane metody wykorzystania tablic
11
…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
12
Wyznaczanie pierwiastków równania n-tego stopniafunkcja 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ównaniaR – będzie wektorem rozwiązań
- jeśli równanie rzędu N to mamy N rozwiązań
- rozwiązaniami mogą być liczby zespolone!
13
Użyteczne funkcje tablicowerand(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
sort (A, i, typ)
i: 1 - kolumny lub 2 - wiersze
typ: 'ascend' 'descend'
domyślne wartości: 1 i 'ascend'
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 9sortowanie kolumnamim1 = 1 2 3 1 2 2 3 5 1 3 3 5 7 3 8 7 6 8 5 8 7 10 9 10 9sortowanie wierszamim2 = 3 5 8 8 10 3 3 5 7 10 1 3 5 7 8 1 2 2 6 7 1 2 3 9 9sortowanie wierszami malejącom2 = 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
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')
14
Sortowanie
>> M=rand(3)M = 0.3404 0.7513 0.6991 0.5853 0.2551 0.8909 0.2238 0.5060 0.9593>> size(M)ans = 3 3>>
Przykład
15
16
clear,clc
M=fix(rand(4)*10)
M2=M(2:3,2:3)
M = 2 1 5 5 6 4 2 6 6 9 7 8 1 3 2 9
M2 =
4 2 9 7
Wycinanie fragmentu tablicy
17
Możliwe jest także tworzenie tzw. tablic komórkowych (struktur)
>>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
>> T= A{1} % pierwsza składowa tablicy AT = 1 8 5
A = [1x3 double] 'Jakiś tekst' [2.0000 + 4.0000i] [1x4 double]
WYKRESY 2-wymiarowe
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] %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
18
19
x=0:90 %generowanie wektora co 1
y=sin(pi*x/180) %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)
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
20
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 onfplot('cos(x)',[0.01 4*pi])
2 4 6 8 10 12-1
-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
1
2 4 6 8 10 12-1
-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-0.5
0
0.5
1
2 4 6 8 10 12-1
-0.5
0
0.5
1
22
Krzywe 3DWykorzystujemy 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
-1-0.5
00.5
1
-1
-0.5
0
0.5
10
10
20
30
40
23
Piszemy m-plik:
clearx = (0:0.01:pi)' %wektor (kolumnowy!) xy = x' %wektor wierszowy yz=cos(3*x) * sin(y) %przeanalizować tablicę z mesh(x, y, z)
z=cos3x siny
Powierzchnie 3DKorzystamy z funkcji mesh(x,y,z)
Dla powierzchni podanej równaniem:
24
Przykładowe funkcje rysujące standardowe wykresy powierzchniowe 3D
peaks
cylider (średnica)
sphere (precyzja)
25
clearc = [8 6 4 2;4 -1 4 5]save ('mydata.dat', 'c','-ASCII')clearload ('mydata.dat') disp('Dane z pliku:');mydata
Zapis całej tablicy do pliku ASCII i odczyt z pliku
Obsługa plików
26
a=rand(3);b=6;save ('plik.mat', 'a', 'b');clear aclear bload ('plik.mat')disp(a)disp(b)
Zapis danych do pliku typu mat i odczyt z pliku
27
clear,clcx = 0: 0.1:1;y = [x; exp(x)]disp('Zapisujemy do pliku')fid = fopen('tab.txt','w');fprintf(fid,'%6.2f %10.8f \n', y); % y do plikufclose(fid);disp('Teraz odczytujemy z pliku')fid = fopen('tab.txt', 'r');a = fscanf(fid,'%f %f',[2 inf]) % z pliku do adisp(a(2,11))fclose(fid);
Można też tak zapisać tablicę w pliku i odczytać
nazwa pliku
typ:odczyt (read)
zamknięcie pliku
0.00 1.00000000 0.10 1.10517092 0.20 1.22140276 0.30 1.34985881 0.40 1.49182470 0.50 1.64872127 0.60 1.82211880 0.70 2.01375271 0.80 2.22554093 0.90 2.45960311 1.00 2.71828183 zawartość pliku tab.txt
typ:zapis (write)
y = 0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 0.9000 1.0000
1.0000 1.1052 1.2214 1.3499 1.4918 1.6487 1.8221 2.0138 2.2255 2.4596 2.7183
Zapisujemy do pliku
Teraz odczytujemy z pliku
a =
0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 0.9000 1.0000
1.0000 1.1052 1.2214 1.3499 1.4918 1.6487 1.8221 2.0138 2.2255 2.4596 2.7183
2.7183
28
Instrukcja iteracyjna („pętla liczona”)
for zmienna = wartość_pocz : krok: wartość_końcowa
instrukcja1
instrukcja2
….itd.
end
Schemat iteracji:
Jeśli pominięty krok to krok=1
29
clearfor i= 1:1:10,
a(i) = i; %element tablicy
disp(a)pause
end;
Przykłady prostych "pętli":
clcfor i= 1:10,
disp('jakiś tekst')end;
30
for i= 1:10,for j = 1:10,
a(i , j) = i*jend
end
Przykład ("zagnieżdżanie" iteracji):
31
for i= 1:5,
for j = 1:i,
a(i , j) = i*j;
end
end
disp(a)
Przykład (uzależnienie licznika "pętli wewnętrznej):
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
32
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); endenddisp(suma)
Przykład (sumowanie elementów w tablicy dwuwymiarowej):
33
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)
Przykład (zliczanie elementów dodatnich w tablicy dwuwymiarowej):
34
a=rand(5)disp('Oto 3-ci wiersz')for k= 1:1:5,
disp(a(3, k))enddisp('Oto przekątna')for k= 1:1:5,
disp(a(k, k))end
Przykład