Laboratorium 3 Grafika 2D i 3D w Matlabie. Wprowadzenie do

Transkrypt

Laboratorium 3 Grafika 2D i 3D w Matlabie. Wprowadzenie do
Uniwersytet Zielonogórski
Wydział Informatyki, Elektrotechniki i Telekomunikacji
Instytut Sterowania i Systemów Informatycznych
Elektrotechnika niestacjonarne-zaoczne pierwszego stopnia z tyt. inżyniera
Laboratorium Metod Numerycznych
Laboratorium 3
Grafika 2D i 3D w Matlabie. Wprowadzenie do programowania
1
Wstęp
Matlab oferuje bardzo szerokie możliwości wizualizacji danych. Oprócz tworzenie klasycznych wykresów w układach kartezjańskich, biegunowym dostępne także są wykresy słupkowe, konturowe. Dostępne są również wykresy
trójwymiarowe. W dość prosty sposób można tworzyć animację wykresów.
1.1
Wykresy 2D
Za tworzenie wykresów w dwóch wymiarach odpowiedzialne jest polecenie plot. Polecenie to przyjmuje szereg
parametrów. Opis tych parametrów uzyskamy po wykonaniu skorzystaniu z pomocy: help plot.
Najmniej skomplikowana droga do uzyskania przebiegu dowolnej funkcji jest następująca. Przygotowujemy
wartość dziedziny funkcji np.: x=-2:0.01:2;. Generujemy wartości funkcji np.: y=x.*x.*x;. Ostatnim elementem jest uzyskanie wykresu: plot(x,y).
Do tworzenia wykresów w układzie biegunowym wykorzystuje się polecenie polar. Sposób korzystania z
tego polecenia jest taki sam jak dla polecenie plot. Nader często korzystać trzeba wykresów o logarytmicznej
skali. Wykorzystuje się polecenie loglog np.:
x = logspace(-1,2);
loglog(x,exp(x),’-s’)
grid on
1.2
Wykresy 3D
Otrzymywanie wykresów trójwymiarowych jest dość podobne jak w przypadku poleceń dla grafiki dwywymiarowej. Przygotowujemy wartości x oraz y jednak wykorzystujemy funkcje meshgrid:
[x,y] = meshgrid(-2:.2:2, -2:.2:2);
Następnie wyznaczamy wartość dla osi z: z = x .* exp(-x.^2 - y.^2);. Ostatnim elementem jest narysowanie wykresu: mesh(z). Użyte polecenie mesh tworzy wykres siatkowy jeśli chcemy uzyskać wykres bardziej
kolory należy zastosować polecenie surf. Standardowym poleceniem do rysowania w przestrzeni trójwymiarowej
jest polecenie plot3.
1.3
Zarządzanie wykresami
Choć funkcja plot samoczynnie tworzy okno z wykresem nader często istnieje potrzeba utworzenia pustego
okna. Do tego celu przeznaczona jest funkcja figure. Aby narysować elementarne wykresy funkcji x2 oraz
−x2 wystarczy przygotować dane: x=-3:0.1:3; y=x.*x;. A następnie za pomocą figure utworzyć nowe okno
i wydać polecenie plot. Dla następnego wykresu ponownie wydajemy polecenie figure tworząc tym samym
następne okno. Poszczególne polecenia prezentują się następująco:
plot(x,y)
figure
plot(x,-y)
1
Rysowanie nowego wykresu na istniejącym jest możliwe po wydaniu polecenia hold. Następnie polecenie plot nie
powoduje tworzenia nowego okna. Narysowanie obydwu parabol z poprzedniego przykładu na jednym wykresie
jest następujące:
x=-3:0.1:3;
y=x.*x;
figure
plot(x,y)
hold
plot(x,-y)
Polecenie plot oprócz podania danych, pozwala opisać w jaki sposób ma być rysowania linia samego wykresu.
Opis wszystkich oznaczeń uzyskamy po wydaniu polecenie help plot. Do narysowania wykresu np.: za pomocą
czerwonych kropek polecenie jest następujące: plot(x,y,’.r’). Znak „.” oznacza naturalnie kropkę, natomiast
litera „r” to nazwa koloru czerwonego. Zastosowane w jednym z poprzednich przykładów opis „-s” oznacza
wykres narysowany ciągłą linią ale w punktach węzłowych zostaną narysowane niewielkie kwadraty.
Po narysowaniu samego wykresu wykres można dalej przetwarzać np.: polecenie grid on spowoduje włączenie siatki. Poleceniem title określa się tytuł wykresu. Co ważne można stosować notację z Tex’a np.:
title(’f(x)=x^2’);. Inny przykład z greckimi literami:
title(’\ite^{\omega\tau} = cos(\omega\tau) + isin(\omega\tau)’)
Sam wykres także może być opatrywany komentarzami za pomocą polecenia text. Dwa pierwsze argumenty
to współrzędne a następnie podawany jest tekst komunikatu. Po nim może wystąpić dalszy opis np.: wielkości
fontu.
plot(0:pi/20:2*pi,sin(0:pi/20:2*pi))
text(pi,0,’ \leftarrow sin(\pi)’,’FontSize’,18)
Poszczególne osie także można opisać za pomocą poleceń xlabel, ylabel oraz dla wykresów trójwymiarowych
zlabel. Krótki przykład:
xlabel(’t = 0 to 2\pi’,’FontSize’,16)
ylabel(’sin(t)’,’FontSize’,16)
title(’\it{Wartości funkcji sin od zera do Pi}’,’FontSize’,16)
Wydruk wykresów czy też kopiowanie poprzez schowek można wykonać z poziomu menu. Matlab oferuje także
polecenie print z przeznaczeniem do wydruku bądź zapisu postaci wykresu do pliku. Zapis do pliku w formacie
PostScipt 2 przy zachowaniu kolorów jest następujący:
figure
% tworzenie wykresu
print -dpsc2 sin.ps
Wśród wielu dostępnych funkcji przydatne jest polecenie subplot. Polecenie dzieli okno wykresu ma macierz
o podanych wymiarach. Poszczególne pod-wykresy są numerowane począwszy od jedności. Pierwszy wykres
znajduje się w lewym górnym rogu. Poniżej znajduje się przykład z poleceniem subplot:
subplot(2,2,1)
plot(x,y1)
subplot(2,2,2)
plot(x,y2)
subplot(2,2,3)
plot(x,y3)
subplot(2,2,4)
plot(x,y4)
2
1.4
Animacja
Matlab umożliwia bardzo łatwe tworzenie animacji wykresów. Każde polecenie plot jak wiadomo generuje
nowe okno, zawartość tego okna można przy pomocy polecenie getframe zapisać np.: w tablicy. Utworzoną
tablicę odtworzamy wykorzystując polecenie movie. Poniższy krótki skrypt ukazuje zasadę działania tych dwóch
poleceń:
for k = 1:16
plot(fft(eye(k+16)))
axis equal
M(k) = getframe;
end
movie(M,30)
2
Podstawy programowania w Matlab
W Matlab oferuje język skryptowy zawierający typowe instrukcje jak if, while, for. Programy w Matlab’ie
przyjmują dwie postacie: skryptów które można nazywać listą instrukcji do wykonania oraz m-funkcji reprezentujące sobą instrukcje zapisane w postaci funkcji przyjmującej argumenty oraz zwracającej wartości. W
odróżnieniu od innych języków programowania funkcje w Matlab’ie mogą zwracać więcej niż jedną wartości.
2.1
Instrukcja warunkowa
Ogólny zapis syntaktyczny instrukcji warunkowej przedstawia się następująco:
if expression
statements
elseif expression
statements
else
statements
end
W instrukcji w opisie warunku stosujemy następujące operatory relacji: ==, <, >, <=, >=, ~=. Operatory
logiczne są następujące: && (and), ||, (or), ~ (not).
2.2
Instrukcja wielokrotnego wyboru
Zapis instrukcji wielokrotnego wyboru, czyli instrukcji odpowiadającej konstrukcji case z języka Pascal albo
switch z języka C przedstawia się następująco:
switch switch_expr
casa case_expr,
statement, ..., statement
casa {case_expr1, case_expr2, case_expr3,...}
statement, ..., statement
...
otherwise,
statement, ..., statement
end
2.3
Pętla for
Ogólny zapis syntaktyczny jest następujący:
3
for variable = expr,
statement
...
statement
end
Bardzo często pętla for korzysta z wyrażenia zakresu. Czego przykładem są następujace linie kodu, gdzie
wyświetlamy liczby od jedności do dziesięciu:
for i=1:10,
disp(i)
end
2.4
Pętla while
Zapis syntaktyczny pętli while jest następujący:
while expression
statements
end
2.5
Funkcje w Matlabie
Funkcje są definiowana w oddzielnych plikach np.: poniższy kod jest zawarty w jednym pliku:
function [mean,stdev] = stat(x)
n = length(x);
mean = avg(x,n);
stdev = sqrt(sum((x-avg(x,n)).^2)/n);
Inny przykład jest następujący:
function ret_val=fhad2()
ret_val=(1/sqrt(2)) ./ [1 1 ; 1 -1];
Trywialny przykład funkcji które nie przyjmuje argumentów i nie zwraca żadnych wartości:
function []=moja_fnc()
disp(’moja super funkcja’)
3
Zadania
1. Narysować standardowe wykresy dla następujących funkcji:
• y = x2 − 4, −5 ¬ x ¬ 5
• y = cos(x), −2π ¬ x ¬ 2π
• y = sin(x), −2π ¬ x ¬ 2π
• y = tg(x), −2π ¬ x ¬ 2π
2. Na jednym wykresie umieścić wykres funkcji sin oraz cos. Pierwszy z wykresów niech będzie narysowany
linią czerwoną, drugi niebieską. Ponadto umieścić na wykresie wszystkie przydatne informacje jak legenda,
tytuł wykresu, zakresy liczbowe na osi wykresów i etc.
3. W jednym oknie narysować wykresy funkcji (sam wykres funkcji przedstawić za pomocą różnych kolorów,
wykorzystać polecenie hold on) w przedziale x ∈ (0, 10):
• f (x) = x2 − 2x
• f (x) = 5 sin(x)
4
4. Utworzyć skrypt o następującej treści:
k = 5;
n = 2^k-1;
theta = pi*(-n:2:n)/n;
phi = (pi/2)*(-n:2:n)’/n;
X = cos(phi)*cos(theta);
Y = cos(phi)*sin(theta);
Z = sin(phi)*ones(size(theta));
colormap([0 0 0;1 1 1])
C = hadamard(2^k);
surf(X,Y,Z,C)
axis square
Dokonać eksportu otrzymanego wykresu do programu Microsoft Word w postaci bitmapy oraz formatu
wektorowego. Jak również zapisać, na dysk wykres w postaci pliku wektorowego i bitmapy.
5. Napisać skrypt Matlaba, który zmiennej a przypisze wartość 11. Wywołać ten skrypt i sprawdzić poprawność wyniku
6. Napisać skrypt który każdemu elementowi ai,j macierzy A przypisze wartość
size.
i+j
2i .
Wskazówka: użyć funkcji
7. Napisać funkcję o nazwie zwieksz przyjmującą jeden argument x i zwracającą argument powiększony o
jeden (tj. zwracającą x + 1).
8. Uzupełnić funkcję z zadania 7 o pomoc następującej treści:
ZWIEKSZ Zwieksza swoj argument o jeden.
Funkcja ZWIEKSZ(x) wykonuje dzialanie ZWIEKSZ(x)->x+1.
Przyklad:
ZWIEKSZ(2) = 3
9. Napisać funkcję delta wyznaczającą wyróżnik ∆ trójmianu kwadratowego postaci y = ax2 + bx + c wg.
wzoru ∆ = b2 − 4ac. Funkcję uzupełnić o opis „Pomocy” wg. przykładu z zadania 8.
10. Napisać funkcję do wyznaczania zer
trójmianu kwadratowego przy wykorzystaniu funkcji delta z zadania
√
∆
9. Wykorzystać wzór: x1,2 = −b±
2a
11. Napisać skrypt, którego zadaniem będzie zapytanie użytkownika o współczynniki a, b, c trójmianu kwadratowego postaci y = ax2 + bx + c a następnie wyświetlenie wszystkich rzeczywistych zer tego trójmianu
(jeśli istnieją) lub informacji o ich braku. W programie wykorzystać funkcję delta z zadania 9. Skrypt ten
ma działać aż do wprowadzenia współczynnika a równego 0. Wskazówka: użyć funkcji input
12. Napisać funkcję który każdemu elementowi ai,j macierzy A przypisze wartość
ma zostać podana tylko macierz A.
i+j
2i .
Jako argument funkcji
13. Napisać funkcję wolny kwadrat o argumencie x (i elementach xi ) będącym wektorem N liczb wyznaczającą wartość f (xi ) = x2i dla i = 1, 2, 3, . . . , N . Zadanie wykonać przy pomocy pętli metodą „element po
elemencie”. Wskazówka: Liczbę elementów wektora można wyznaczyć przy pomocy funkcji length.
14. Napisać funkcję szybki kwadrat o argumencie x (i elementach xi ) będącym wektorem N liczb wyznaczającą wartość f (xi ) = x2i dla i = 1, 2, 3, . . . , N . Zadanie wykonać bez pomocy pętli metodą tablicową.
15. Porównać czas działania funkcji wolny kwadrat i szybki kwadrat dla dużych wartości N . Do porównania
użyć instrukcji tic i toc. Porównać wynik z uzyskanym przy pomocy polecenia prof ile
5
4
Literatura
1. Analiza matematyczna w zadaniach, Włodzimierz Krysicki, Lech Włodarski (dowolne wydanie)
2. MATLAB 7 dla naukowców i inżynierów, Rudra Pratap, PWN 2009
3. Wykresy i obiekty graficzne w MATLAB, Wiesława Regel, Warszawa 2003, wydanie I
4. MATLAB i Simulink. Poradnik użytkownika. Wydanie II, Bogumiła Mrozek, Zbigniew Mrozek, 2004
5. Programowanie w MATLAB, Jerzy Brzózka, Lech Dorobczyński, Warszawa 1998, wydanie I
6. Matlab. Ćwiczenia z ..., Przykłady i zadania, Anna Kamińska, Beata Pańczyk, Warszawa 2002, wydanie I
6