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