cz. 1. - Politechnika Warszawska

Transkrypt

cz. 1. - Politechnika Warszawska
Matlab/Octave
Tomasz Sobiech, Politechnika Warszawska, Wydział Fizyki
29 stycznia 2016
atlab jest środowiskiem stworzonym głównie w celu wykonywania obliczeń numerycznych. W skład
środowiska wchodzi język wysokiego poziomu, w większości kompatybilny z darmowymi odpowiednikami takimi jak Octave oraz interpreter tego języka.
Matlab posiada zaawansowane funkcje do numerycznego rozwiązywania powszechnych problemów algebry
liniowej, analizy sygnałów, statystyki, przetwarzania obrazów i innych. Jest łatwo rozszerzalny i konfigurowalny poprzez definiowane funkcji w języku Matlab lub używając dynamicznie ładowanych modułów
napisanych w C++, C, Fortran lub innych językach.
M
1
Wprowadzenie
Poniższy poradnik będzie stanowił pomoc w pierwszych krokach nauki programowania w Matlabie, jednak prawdopodobnie niezbędne okaże się korzystanie z innych źródeł i pomocy, jak np. dokumentacja dostępna na stronie:
http://www.mathworks.com/help/matlab/. Można również wykorzystać wbudowaną pomoc i dokumentację, dostępną
po wpisaniu:
• doc
• docsearch
• help - spis dostępnych kategorii funkcji, lista funkcji należących do danej kategorii, opis wybranej funkcji
• lookfor - przeszukanie za pomocą słowa kluczowego
• demo
• echodemo
Kilka dodatkowych uwag:
• Możliwe są dwa podstawowe typy pracy: interakcja w linii poleceń lub uruchamianie gotowych skryptów zapisanych
w M-plikach.
• Rozróżniane są duże i małe litery.
• Średnik na końcu linijki powoduje, że nie zostanie wyświetlony wynik tego polecenia.
• Komentarze rozpoczynają się znakiem %.
• Uzyskanie informacji o zdefiniowanych zmiennych, polecenie: who, whose
• Pracę kończy się przez wpisanie polecenia exit lub quit.
Strona 1 z 22
2
Podstawy
2.1
Ogólnie
Podstawową strukturą danych jest macierz. Standardowo liczby przechowywane są jako double (zakres < 10−308 , 10308 >),
możemy korzystać z wbudowanych stałych, takich jak: liczba π, jednostka urojona i, itd. i wbudowanych funkcji sin, exp,
besselj itd.
2.2
Operacje na macierzach
Skalar – Macierz o rozmiarze 1x1:
>> a = 1
a = 1
Wektor – w tym przypadku macierz o jednym wierszu:
>> b = [2 4 6 8]
b =
2
4
6
8
Wektor – tutaj macierz o jednej kolumnie:
>> c = [2; 4; 6; 8]
c =
2
4
6
8
Transpozycja macierzy:
>> c’
ans =
2
4
Strona 2 z 22
6
8
Macierze można budować bezpośrednio:
>> d = [1,2,3,4; 5,6,7,8]
d =
1
5
2
6
3
7
4
8
>> e = [8,7,6, 5; 4,3,2,1]
e =
8
4
7
3
6
2
5
1
Lub łączyć składowe:
>> f = [d; e]
f =
1
5
8
4
2
6
7
3
3
7
6
2
4
8
5
1
Istnieje możliwość definiowania każdego elementu osobno:
>> b
b =
2
4
6
8
6
8
>> b(1) = 1
b =
1
4
W ten sposób można automatycznie rozszerzyć macierz:
>> b(8) = 10
b =
Strona 3 z 22
1
4
6
8
0
0
0
10
0
0
0
20
Macierze można dodawać:
>> b+b
ans =
2
8
12
16
Mnożyć (element po elemencie):
>> b.*b
ans =
4
64
144
256
0
0
0
400
Brak kropki oznaczałby, że operacja ma zostać wykonana w sensie macierzowym:
>> b*b’
ans = 868
Tak samo jest również w przypadku potęgowania:
>> p=[1,2;3,4]
p =
1
3
2
4
>> p.^2
ans =
1
9
4
16
>> p^2
ans =
7
15
Strona 4 z 22
10
22
2.3
Generatory macierzy
Można stworzyć macierz zawierającą same zera, jedynki lub liczby losowe z zakresu [0, 1):
>> z = zeros(2,4)
z =
0
0
0
0
0
0
0
0
>> o = ones(3,3)
o =
1
1
1
1
1
1
1
1
1
>> n = rand(1,5)
n =
0.868423
0.195988
0.861193
0.717563
0.099785
Można otrzymać wektor liczb z pewnego zakresu:
>> 1:10
ans =
1
2
3
4
5
3
5
7
9
6
7
8
9
10
>> 1:2:10
ans =
1
linspace(a, b, n) zwraca n liczb z zakresu ha, bi
>> linspace(1, 3, 5)
ans =
1.0000
Strona 5 z 22
1.5000
2.0000
2.5000
3.0000
2.4
Instrukcje sterujace, petle
˛
i funkcje
Instrukcja warunkowa if:
if warunek 1
instrukcje - wersja 1
elseif warunek 2
instrukcje - wersja 2
else
instrukcje - wersja N
end
1
2
3
4
5
6
7
Pętla while
while warunek
instrukcje
end
1
2
3
Pętla for umożliwia wykonanie bloku instrukcji dla każdego elementu wektora.
for i = wektor
instrukcje
end
1
2
3
Oprócz korzystania z funkcji standardowych można tworzyć także własne funkcje:
function [zmienne wyjsciowe] = nazwa_funkcji(argumenty wejsciowe);
instrukcje
end
1
2
3
Istnieje również możliwość definiowania funkcji anonimowych. Są to krótkie, jednolinijkowe funkcje (wyrażenia lambda):
nazwa_funkcji = @(argumenty wejsciowe) instrukcja
1
2.5
Prezentacja wyników
Podstawową instrukcją tworzącą dwuwymiarowe wykresy jest funkcja plot:
>> x = -2*pi: 0.1 : 2*pi
>> plot(x, sin(x))
Do rysowania histogramów wykorzystujemy funkcję hist:
>>
hist(randn (100, 1), 20)
Strona 6 z 22
a)
b)
Rysunek 1: Wykres funkcji sinus (a), histogram (b)
Do rysowania wykresów 3D służą funkcję takie jak: mesh, surface, waterfall i wiele innych, przykład:
>> z = peaks(25);
>> mesh(z);
>> colormap(hsv)
Przykład 1. Zadanie do wykonania: zrobić sprawozdanie z prawa Ohma (lab. CLF)
1
2
3
4
5
6
7
8
%niepelne dane
U = [0.09, 0.18, 0.29, 0.37, 0.46, 0.54, ..., 3.4, 4, 4.5, 5.5, 6, 6.5, 7, 8, 8.5, 9, 9.5];
I = [0.0017, 0.00341, 0.00565, 0.00713, 0.00905, 0.01053, ..., 0.125, 0.138, 0.150, 0.186];
dI = [0.0001,0.00005,0.00008,0.0001,0.0001,0.0002,...,0.003,0.003,0.003,0.003,0.003,0.003];
% errorbar rysuje wykres z niepewnosciami pomiarowymi (tylko dy)
% argument 'r*' oznacza rysuj czerwone gwiazdki (standardowo niebieska linia)
errorbar(U, I, dI, 'r*');
hold on; % wstrzymuje wykres przed usunieciem zawartosci po ponownym rysowaniu
9
10
11
12
13
14
P = polyfit(U, I, 1); %dopasowanie wielomianu stopnia n,
%zwraca P = [a_n, ..., a_0] - wektor wspolczynikow wielomianu
x = 0:0.01:10;
%polyval oblicza wielomian y = a_n.*x.^n + ... + a_1.*x + a_0
plot(x, polyval(P, x)); hold off;
15
16
17
18
%podpisywanie osi
xlabel('U [V]');
ylabel('I [A]');
19
20
21
%wypisywanie na ekran z formatowaniem
fprintf('Opor elektryczn R = %0.2f Ohm\n', P(1));
Strona 7 z 22
Rysunek 2: Charakterystyka napięciowo prądowa
Przykład 2. Zadanie do wykonania: zgubiłeś wyniki pomiarów śrubą mikrometryczną, ale musisz oddać jutro sprawozdanie.
1
2
% srednica preta 10 [mm] odchylenie standardowe sig = 0.05
d = 0.05*randn(1, 20) + 10;
3
4
5
mu = mean(d); %warosc srednia
sig = std(d); %odchylenie standardowe
6
7
hist(d)
Przykład 3. Rozważ krzywą daną równaniami parametrycznymi x(t) = sin(2t), y(t) = cos(t), z(t) = t, gdzie t ∈ h0, 2πi).
Rb p
Oblicz długość łuku tej krzywej. Długość łuku liczymy ze znanego z analizy wzoru: L =
(dx(t))2 + (dy(t))2 + (dz(t))2 .
a
1
2
3
4
t = 0:0.1:3*pi;
plot3(sin(2*t),cos(t),t);
% definiujemy funkcje podcalkowa jako funkcje anonimowa
f = @(t) sqrt(4*cos(2*t).^2 + sin(t).^2 + 1);
5
6
len = integral(f,0,3*pi);
Strona 8 z 22
3
Praca zdalna
Matlab kosztuje niemało, więc aby z niego korzystać legalnie musimy iść na wydział:
$
ssh -Y [email protected]
a następnie wejść do sali 228 i usiąść przy wolnym komputerze, na przykład 02:
$
ssh -Y sl228-02
Opcja -Y w poleceniu ssh przekieruje okno matlaba na twój komputer. Teraz uruchamiamy matlaba:
$
matlab
Strona 9 z 22
4
Operatory (raz jeszcze)
4.1
Operator zakresu
Składnia operatora : wygląda następująco start : krok : nie większe niż . Przykład:
>> a = 3:0.7:7
a =
3.0000
3.7000
4.4000
5.1000
5.8000
6.5000
Domyślna wartość kroku to jeden, składnia upraszcza się wtedy do postaci:
>> a = 3:7
a =
3 4 5 6 7
W kontekście macierzy operator ten może przybrać jeszcze jedną formę:
>> A = zeros(3,4);
>> A(:,2) = 1
A =
0
0
0
1
1
1
0
0
0
0
0
0
Zapis A(:,2) weź wszystkie wartości z kolumny 2. Operatora zakresu możemy też używać z typem danych char:
>> s = ’a’:’f’
s =
abcdef
4.2
4.2.1
Działania arytmetyczne
Operatory macierzowe
Możliwość wykonywania działań macierzowych jest absolutnie niezbędna dla programisty-fizyka, środowisko
Matlab/Octave pozwala na wykonywanie takich obliczeń w szybki sposób przez zdefiniowane operatory (tab. 1), bez pisania
zbędnych pętli for.
Strona 10 z 22
Tablica 1: Operatory macierzowe
Operacja
Dodawanie
Odejmowanie
Mnożenie
Potęgowanie
Lewostronne dzielenie
Prawostronne dzielenie
Operator
+
*
^
\
/
Jeszcze słowo komentarza á propos dzielenia, oprócz dzielenia prawostronnego (/) mamy do dyspozycji dzielenie
lewostronne (\). Dzielenie takie stosowane jest w równaniach macierzowych. W szczególności polecenie x = A\b rozwiązuje
równanie Ax = b. Jest ono odpowiednikiem inv(A)*b, ale działa szybciej i numerycznie stabilniej.
4.2.2
Operatory tablicowe
Prawdopodobnie dużo częściej wykorzystywane są operatory tablicowe (tab. 2). Za ich pomocą możemy uzyskać takie
struktury jak v.*w = [v1 w1 , v2 w2 , ..., vn wn ], czy v.^w = [v1w1 , v2w2 , ..., vnwn ]. Te same zasady stosują się do macierzy. Dla
dwóch macierzy A i B polecenie C = A.*B, w wyniku daje macierz z elementami Cij = Aij Bij .
Tablica 2: Działania tablicowe
Operacja
Dodawanie
Odejmowanie
Mnożenie
Potęgowanie
Lewostronne dzielenie
Prawostronne dzielenie
4.3
Operator
+
.*
.^
.\
./
Operatory relacji
Działania z użyciem operatorów relacji dają wynik w postaci macierzy o tej samej wielkości co argumenty, gdzie 1
oznacza prawdziwość relacji, a 0 oznacza fałsz.
Tablica 3: Operatory relacji
Operacja
Mniejszy niż
Mniejszy lub równy
Większy niż
Większy lub równy
Równy
Różny od
Strona 11 z 22
Operator
<
<=
>
>=
==
=
Przykłady:
>> x = [1, 5, 3, 7];
>> y = [0, 2, 8, 7];
>> k = x<y
k =
0
0
>> k = x>=y
1
0
0
1
1
0
k =
1
1
>> k = x~=y
k =
1
4.4
1
Operatory logiczne
Operatory logicznie działają analogicznie do operatorów relacji, zwracają macierz o tej samej wielkości co argumenty:
Tablica 4: Operatory logiczne
Operacja
Koniunkcja
Alternatywa
Negacja
Alternatywa wykluczająca
Strona 12 z 22
Operator
&
|
~
xor
5
Praca z macierzami
5.1
Indeksowanie macierzy
W środowisku Matlab/Octave istnieją dwa sposoby indeksowania tablic (patrz rys. 3) tzw. index oraz subscripts, jak
to działa sprawdzimy na prostym przykładzie:
>> A = rand(4, 5)
A =
0.6557
0.0357
0.8491
0.9340
0.6787
0.7577
0.7431
0.3922
0.6555
0.1712
0.7060
0.0318
0.2769
0.0462
0.0971
0.8235
0.6948
0.3171
0.9502
0.0344
>> A(4) %w notacji index
ans =
0.9340
>> A(4,1) %to samo w notacji subscripts
ans =
0.9340
>> A(5) %w notacji index
ans =
0.6787
>> A(1, 2) %to samo w notacji subscripts
ans =
0.6787
Rysunek 3: Dwa sposoby indeksowania macierzy
Strona 13 z 22
Oczywiście tyczy się to też macierzy o większej ilości wymiarów. Do konwersji pomiędzy tymi dwoma stylami indeksowania
macierzy można wykorzystać funkcję ind2sub oraz sub2ind. Przykład (Macierz A z poprzedniego przykładu):
>> idx = [sub2ind(size(A), 3, 2), sub2ind(size(A), 4, 4), sub2ind(size(A), 4, 5)] ...
%tworzymy wektor 3 indeksów które chcemy wybrać z macierzy
idx =
7
16
20
>> A(idx) %wypisujemy podane elementy
ans =
0.7431
0.8235
0.0344
>> A(idx) = 0; %nadpisujemy wartość podanych elementów
>> A
A =
0.6557
0.0357
0.8491
0.9340
0.6787
0.7577
0
0.3922
0.6555
0.1712
0.7060
0.0318
0.2769
0.0462
0.0971
0
0.6948
0.3171
0.9502
0
Możemy też podawać w obu konwencjach wektory. W konwencji index przykład jest już wyżej, z macierzy wybierane
są wszystkie elementy, których index jest podany w wektorze. Trochę więcej przykładów:
>> A([1, 3, 5, 6, 7])
ans =
0.6557
0.8491
0.6787
0.7577
0
0
0.6555
>> A(1:2:20) %co drugi element
ans =
Columns 1 through 9
0.6557
0.8491
0.6787
0.7060
Column 10
0.9502
>> i = 5:5:20 %co piąty indeks od piątego do dwudziestego
Strona 14 z 22
0.2769
0.0971
0.6948
i =
5
10
15
20
>> A(i)
ans =
0.6787
0.1712
0.0971
0
W konwencji subscripts zwracany jest produkt kartezjański podanych indeksów:
>> A([1, 2], [1, 2]) %produkt kartezjański to elementy (1, 1), (1, 2), (2, 1), (2, 2)
ans =
0.6557
0.0357
0.6787
0.7577
>> A(1:3,1:3) %wykorzystując operator zakresu
ans =
0.6557
0.0357
0.8491
0.6787
0.7577
0
0.6555
0.1712
0.7060
>> A(1:2:3,1:3) %co drugi wiersz od pierwszego do trzeciego i od pierwszej kolumny do trzeciej
ans =
0.6557
0.8491
0.6787
0
0.6555
0.7060
Należy tu jeszcze wspomnieć o kolejnym ważnym elemencie dotyczącym indeksowania, mianowicie słowo kluczowe
end. Standardowo słowo end kończy blok kodu po for, if itd., w tym kontekście indeksowania ma ono inne znaczenie, tj.
oznacza ostatni element macierzy.
>> A(end)
ans =
0
>> A(end-4:end) %ostatnie pięć elementów
ans =
Strona 15 z 22
0
0.6948
0.3171
0.9502
0
>> A(end-1:end, 1) %korzystając z subscripts: przedostatni i ostatni element pierwszej kolumny
ans =
0.8491
0.9340
>> A(2:end, 1:end-3)
ans =
0.0357
0.8491
0.9340
0.7577
0
0.3922
Typowe zastosowanie wybierania indeksów z którym na pewno się spotkacie:
>> x = 0:0.01:10*pi;
>> y = sin(x);
>> idx = find(abs(y) < 5e-3); ...
%funkcja find zwraca indeksy elementów wektora równych 1 (działanie operatora relacji już znacie)
>> plot(x, y, ’b-’, x(idx), y(idx), ’ro’)
Na rysunku 4 przedstawiony jest wynik powyższych operacji.
Rysunek 4: Miejsca zerowe funkcji f (x) = sin(x)
Strona 16 z 22
5.2
Wektoryzacja
Przez wektoryzację rozumiemy nadanie obliczeniom takiej struktury, w której można zastosować zmienne wektorowe lub
tablicowe z operatorami tablicowymi zamiast seryjnych obliczeń skalarnych. Jako przykład rozważ aproksymację funkcji
wykładniczej za pomocą pierwszych dziesięciu wyrazów rozwinięcia w szereg
ex =
X xk−1
(k − 1)!
k
Można to liczyć w pętli, co jest czasochłonne, gdyż interpreter musi dziesięć razy wykonać tą czynność (interpreter
jest wolny). W formie zwektoryzowanej interpreter parsuje jedną linijkę, reszta liczy się w wewnętrznych funkcjach
Matlab/Octave napisanych w szybkich językach typu C/C++
>> x = 1;
>> k=1:10;
>> e = sum(x.^(k-1)./factorial(k-1))
e =
2.7183
>>%lub w inny sposób po wykonaniu drobnych przekształceń w głowie
>> format long
>> sum(1./factorial(0:10))-exp(1)
ans =
-2.731266102173890e-08
>> sum(1./factorial(0:10))-exp(1) %policzmy błąd takiego przybliżenia
ans =
-2.731266102173890e-08
>> sum(1./factorial(0:20))-exp(1) %zwiększmy nieco ilość wyrazów szeregu
ans =
0
W ten oto prosty sposób policzyliśmy liczbę Nepera. Stosować wektoryzację należy zawsze (o ile to jest możliwe)! Inny
przykład, odtworzymy sobie działanie funkcji diff, i policzmy pochodną funkcji:
>> plot(x, y, x, Dy)
>> dx = 0.001;
>> x = 0:dx:2*pi;
>> y = sin(x);
>> Dy = (y(2:end)-y(1:end-1))./dx; ...
%diff => y(2:end)-y(1:end-1), dzieląc przez dx otrzymujemy pochodną
Strona 17 z 22
>> Dy = [Dy, Dy(end)]; %powielenie ostatniego elementu, żeby zgadzały się długości wektorów
>> plot(x, y, x, Dy)
Rysunek 5: Funkcja f (x) = sin(x) oraz jej pochodna f 0 (x) = cos(x)
5.3
Trudniejsze przykłady
Rozwiążmy teraz typowy fizyczny problem tj. rozwiążemy dwuwymiarowe równanie Poissona
(
∇u(x, y) =
f (x, y)
∀(x,y) ∈ h0, 100i × h0, 100i = Ω
u(x, y) ∂Ω = 0
gdzie
(
100
f (x, y) =
0
∀(x,y) ∈ h49, 51i × h10, 90i = ω
∀(x,y) ∈ Ω\ω
Przedstawione tu rozumowanie jest nieco uproszczone, więcej o rozwiązywaniu równań różniczkowych można dowiedzieć się
na wykładnie z Metod Numerycznych lub w internecie. Dyskretyzując równanie dla prostokątnej siatki otrzymujemy:
ui−1,j + ui,j−1 + ui+1,j + ui,j+1
− ui,j = fi,j
4
(1)
u0,j = u100,j = ui,0 = ui,100 = 0
(2)
Obliczenie tego wyrażenia w C wymagałoby iteracji po całej macierzy w dwóch pętlach for, możemy jednak to
zwektoryzować. Graficznie pierwszy składnik tego równania można przedstawić jak poniżej:




1 6 11 16 21
1 6 11 16 21


 2 7 12 17 22 

 +  2 7 12 17 22 
 3 8 13 18 23 
 3 8 13 18 23 




 4 9 14 19 24 
 4 9 14 19 24 
5 10 15 20 25
5 10 15 20 25
Strona 18 z 22


















1 6 11
2 7 12
3 8 13
4 9 14
5 10 15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1 6 11
2 7 12
3 8 13
4 9 14
5 10 15

16 21
17 22 
+
18 23 

19 24 
20 25














+




16 21
17 22 

18 23 

19 24 
20 25

16
17
18
19
20
21
22
23
24
25

+



1 6
2 7
3 8
4 9
5 10
11
12
13
14
15
1 6
2 7
3 8
4 9
5 10

11 16 21
12 17 22 

13 18 23 

14 19 24 
15 20 25
1 6
2 7
3 8
4 9
5 10
11
12
13
14
15

16 21
17 22 

18 23 

19 24 
20 25

16 21
17 22 

18 23 

19 24 
20 25
Tak powstałą nową macierz należy jeszcze podzielić przez cztery i odjąć od niej macierz początkową.
1
close all, clear all, clc %zamknij wszystkie wykresy, wyczysc zmienne, wyczysc linie komend
2
3
4
5
6
7
8
9
10
11
%definicja geometrii
N = 100;
u = zeros(N, N);
%rysuje prostokat
%wybieramy podmacierz i przypisujemy ladunek
%floor (podloga) zaokraglenie, aby miec pewnosc ze bedzie liczba calkowita
w1 = floor((N/2))-1;
w2 = floor((N/2))+1;
u(10:N-10, w1:w2) = 100;
12
13
14
15
16
17
18
19
20
21
for i = 0:1e4
%liczymy laplasjan (to tu cala magia)
nabla = zeros(N, N);
nabla(1:end-1,:) = nabla(1:end-1,:) +
nabla(2:end,:)
= nabla(2:end,:)
+
nabla(:,1:end-1) = nabla(:,1:end-1) +
nabla(:,2:end)
= nabla(:,2:end)
+
nabla = nabla./4.0;
nabla = nabla - u;
u(2:end,:);
u(1:end-1,:);
u(:,2:end);
u(:,1:end-1);
22
23
u = u + nabla;
24
25
26
27
28
29
%warunki
u(1,:)
u(end,:)
u(:,1)
u(:,end)
brzegowe
= zeros(1,
= zeros(1,
= zeros(1,
= zeros(1,
N);
N);
N);
N);
30
31
32
u(10:N-10, w1:w2) = 100;
end
33
34
35
contourf(u); hold on;
rectangle('Position',[w1, 10, w2-w1, N-20],'FaceColor','k')
Strona 19 z 22
Rysunek 6: Rozwiązanie równania
Zadanie 1. Wygenerować macierz 3D zgodnie ze wzorem v = x ∗ sin x2 − y 2 − z 2 w przedziale [−2, 2] z krokiem 0.05.
Wyświetlić ją na ekranie.
1
close all, clear all, clc %zamknij wszystkie wykresy, wyczysc zmienne, wyczysc linie komend
2
3
4
[X,Y,Z] = meshgrid(-2:0.05:2,-2:0.05:2,-2:2); %tworzymy 3 macierze 3D
V = X.*sin(X.^2-Y.^2-Z.^2); %tworzymy nowa macierz 3D z wartosciami ze wzoru
5
6
7
8
for i = 1:5
% conturf rysuje wykres w formie mapy
[¬,h] = contourf(X(:,:,3), Y(:,:,3), V(:,:,3)); hold on;
9
10
11
12
13
%tu troche magicznych funkcji w sumie nieistotne
hh = get(h,'Children');
set(hh, {'ZData'}, cellfun(@(x) (i-3)*ones(size(x)), get(hh,{'XData'}), 'UniformOutput',false))
end
Rysunek 7: Mapy kostki
Strona 20 z 22
6
Wizualizacja
W tym rozdziale przedstawione zostały różne przykłady wizualizacji danych w Matlab/Octave. Najbardziej użyteczną
funkcją generującą wykresy jest plot, jej składnia wygląda następująco:
plot(vec_x1, vec_y1, ’opcje stylu’, vec_x1, vec_y1, ’opcje stylu’, ...)
Przykładowo:
plot(y) %tworzy domyślny wykres na osi x odłożone są ideksy wektora y
plot(x,y,’--’) %zamiast linii ciągłej jest przerywana
plot(x,y,’ro’) %rysuje czerwone kółka
Tablica 5: Opcje stylów
Opcje koloru
y żółty
m purpurowy
c granatowy
r czerwony
g zielony
b niebieski
w biały
k czarny
6.1
Opcje stylu linii
- linia ciągła
– linia przerywana
: linia kropkowana
-. linia kreskowo-kropkowa
Opcje stylu znacznika
+ symbol plusa
o kółko
* gwiazdka
x znak x
. kropka
^ daszek
s kwadrat
d rąb
Etykiety, tytuły, legendy i inne
Wykresy można opisywać za pomocą poleceń:
xlabel(’napis x’)
ylabel(’napis y’)
title(’tytul’)
text(x, y, ’napis’)
%
%
%
%
tytuł osi x
tytuł osi y
tytuł wykresu
umieszcza na wykresie napis w pozycji (x,,y)
Legendę można utworzyć, jak nie trudno się zgadnąć, za pomocą funkcji legend
legend(’linia 1’, ’linia 2’, ...)
legend(’StylLinii1’, ’linia 1’, ...)
legend(..., pos)
legend off
%
%
%
%
tworzy legendę zawierającą etykiety ’linia 1’, ...
przypisuje każdej etykiecie styl linii
pos = 1 (lub inna wartość) ustawia pozycję legendy
wyłącza legendę
Ustawiać zakresy osi możemy za pomocą polecenia axis
axis([x_min, x_max])
% ustawia zakres osi x
axis([x_min, x_max, y_min, y_max]) % ustawia zakres osi x i y
axis(’equal’)
% ustawia jednakową skalę na obu osiach
itd.
6.2
Wykresy nakładane
Istnieje kilka sposobów narysowania wielu linii na jednym wykresie, oto przykład:
Strona 21 z 22
1
2
3
4
t = linspace(0, 2*pi, 100);
y1 = sin(t);
y2 = t;
y3 = t - (t.^3)/6 + (t.^5)/120;
5
6
7
8
9
10
11
%rysuje y1 jako ciagla linie (domyslnie)
plot(t,y1)
% %dodaje y2 jako linie przerywana
line(t,y2, 'linestyle', '--')
% %dodaje y3 jako serie kolek
line(t,y3, 'linestyle', 'o')
12
13
14
15
16
17
18
%inaczej ale robi to samo
plot(t,y1)
hold on
plot(t,y2, 'linestyle', '--')
plot(t,y3, 'linestyle', 'o')
hold off
19
20
21
%w ten sposob podobnie ale dodatkowo automatycznie zmienia kolory linii
plot(t,y1,t,y2, '--',t,y3, 'o')
22
23
24
25
26
27
6.3
axis([0 5 -1 5]) %nowe zakresy osi
xlabel('t')
ylabel('aproksymacja sin(t)')
title('Wykresy nakladane')
legend('sin(t)', 'aproksymacja liniowa', 'aproksymacja piatego rzedu')
Tworzenie wykresów równoległych
Do rysowania kilku wykresów w jednym oknie służy polecenie subplot. Funkcja ta dzieli okno na siatkę (n, m)
podwykresów, na przykład:
subplot(3,2,1) % trzeci argument oznacza na którym wykresie aktualnie rysujemy
plot(x)
subplot(3,2,2)
plot(y)
...
1
2
t = linspace(0, 8*pi, 200);
y = t.*sin(t);
3
4
5
6
7
8
9
10
figure(1) %tworzy okno
subplot(1, 2, 1)% dzieli okno na macierz (1,2) wykresow rysuje na 1
area(t, y);
subplot(1, 2, 2)% teraz rysuje na 2
t = linspace(0, 2*pi, 200);
y = sqrt(abs(2.*sin(5.*t)));
polar(t, y)
11
12
13
14
15
16
17
18
19
20
figure(2) %tworzy drugie okno
subplot(1, 2, 1)
hist(randn(1, 1000));
subplot(1, 2, 2)
t = linspace(0, 2*pi, 500);
r = sqrt(abs(2.*sin(5.*t)));
x = r.*cos(t);
y = r.*sin(t);
fill(x, y, 'r')
Strona 22 z 22

Podobne dokumenty