23.01.2014 Views

KURS MATLAB II - Instytut Geofizyki

KURS MATLAB II - Instytut Geofizyki

KURS MATLAB II - Instytut Geofizyki

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>KURS</strong><br />

<strong>MATLAB</strong> <strong>II</strong><br />

Rok 2005/2006, semestr zimowy<br />

Uniwersytet Warszawski<br />

Wydzia! Fizyki<br />

Ryszard Buczy%ski, Rafa! Kasztelanic<br />

1


Spis Tre)ci<br />

Fourierowska analiza danych ............................................................................................... 4<br />

Przetwarzanie dwików ..................................................................................................... 6<br />

Przetwarzanie obrazów – toolbox Image Processing ............................................................ 8<br />

Ca!kowanie numeryczne .................................................................................................... 11<br />

Numeryczne ró$niczkowanie funkcji ................................................................................. 13<br />

Równania ró$niczkowe i ca!kowe ...................................................................................... 14<br />

Obs!uga b!dów ................................................................................................................. 18<br />

Grafika uchwytów ............................................................................................................. 20<br />

Graficzny interfejs u$ytkownika (GUI)............................................................................... 22<br />

Z!o$one struktury danych .................................................................................................. 27<br />

Programowanie zorientowane obiektowo ........................................................................... 29<br />

Obliczenia symboliczne w Matlabie – toolbox Symbolic Math............................................ 32<br />

Wspó!praca Matlaba z innymi 7rodowiskami programistycznymi ...................................... 36<br />

2


<strong>KURS</strong> <strong>MATLAB</strong> <strong>II</strong><br />

Rok 2005/2006 semestr zimowy, wymiar 15h<br />

Prowadz-cy:<br />

dr Ryszard Buczy:ski, ryszard.buczynski@mimuw.edu.pl,<br />

dr Rafa! Kasztelanic, kasztel@mimuw.edu.pl<br />

Zak!ad Optyki Informacyjnej, <strong>Instytut</strong> <strong>Geofizyki</strong>, Wydz. Fizyki UW<br />

Zajcia odbywaj> si w Instytucie <strong>Geofizyki</strong>, ul. Pasteura 7, V pitro, pok. 508. (lub pok. 106)<br />

Oprogramowanie:<br />

Matlab, The MathWorks, Inc.; wersja 7.0; platforma UNIX/LINUX.<br />

Krótki opis kursu:<br />

G!ównym celem kursu jest nauka pos!ugiwania si Matlabem jako narzdziem programistycznym na poziomie<br />

7rednio zaawansowanym. Kurs <strong>MATLAB</strong> <strong>II</strong> jest kontynuacj> kursu <strong>MATLAB</strong> I skoncentrowany na<br />

zagadnieniach zwi>zanych z programowaniem. W programie kursu przewidziane s> równie$ tematy wymagaj>ce<br />

korzystania z dodatkowych modu!ów pakietu Matlab oraz dodatkowych narzdzi programistycznych.<br />

Kurs sk!ada si z 15 godzin zajG komputerowych. Ka$dy student pracuje indywidualnie przy osobnym<br />

terminalu. Wszystkie spotkania rozpoczynaj> si od wprowadzenia merytorycznego do poruszanych zagadnie:.<br />

Dalsza cz7G zajG po7wicona jest na indywidualn> prac z komputerem nad seri> zada:.<br />

Kurs odbywaG si bdzie zarówno w jzyku polskim jak i angielskim.<br />

Forma zaliczenia:<br />

Do zaliczenia Kursu na ocen dostateczn> lub zal. wymagane jest zaliczenie wszystkich Gwicze:-laboratoriów.<br />

Ocena ko:cowa wystawiana jest przez prowadz>cego na podstawie osi>gnitej sprawno7ci i postpów w<br />

pos!ugiwaniu si <strong>MATLAB</strong>em, oraz kreatywno7ci studenta.<br />

Obecno7G na wszystkich zajciach jest obowi>zkowa, dopuszczamy jedna nieobecno7G, przy wikszej ilo7ci<br />

wymagane jest zwolnienie lekarskie. Nieobecno7G nie zwalnia studenta z zaliczenia poszczególnych zada:.<br />

Ostatnia godzina 15-ta jest przeznaczona na wystawianie ocen i ewentualne poprawki.<br />

Wymagania:<br />

<strong>MATLAB</strong> I, znajomo7G algebry, analizy matematycznej i programowania.<br />

Zagadnienia poruszane w ramach kursu <strong>MATLAB</strong> <strong>II</strong>:<br />

Kurs <strong>MATLAB</strong> <strong>II</strong> bazuje na wiedzy zdobytej w trakcie kursu <strong>MATLAB</strong> I. DO g!ównych zagadnie:<br />

poruszanych w trakcie trwania kursu nale$>:<br />

1. Fourierowska analiza danych<br />

2. Przetwarzanie obrazów – toolbox Image Processing<br />

3. Ca!kowanie numeryczne<br />

4. Numeryczne ró$niczkowanie funkcji<br />

5. Równania ró$niczkowe i ca!kowe<br />

6. Obs!uga b!dów<br />

7. Grafika uchwytów<br />

8. Graficzny interfejs u$ytkownika<br />

9. Z!o$one struktury danych<br />

10. Programowanie zorientowane obiektowo<br />

11. Obliczenia symboliczne w Matlabie<br />

12. Wspó!praca Matlaba z innymi 7rodowiskami programistycznymi<br />

Literatura:<br />

1. A. Zalewski, R. Cegie!a, Matlab - obliczenia numeryczne i ich zastosowania.<br />

2. B. Mrozek, Z. Mrozek, Matlab 6 - poradnik u$ytkownika.<br />

3. D. Higham, N. Higham: Matlab guide.<br />

4. The MathWorks, Inc: Numerical Computing with <strong>MATLAB</strong>.<br />

5. http://www.mathworks.com/<br />

3


TEMATY<br />

FOURIEROWSKA ANALIZA DANYCH<br />

Analiza widma funkcji otrzymywanej za pomoc> transformaty Fouriera stanowi podstawi<br />

wikszo7ci algorytmów przetwarzania sygna!ów.<br />

Matlab dostarcza wygodnych narzdzi do takiej analizy.<br />

Temat 1<br />

Jedno wymiarowa transformata Fouriera<br />

Definicja fft(x) gdzie x jest wektorem próbek sygna!u. ifft(x) – oznacza odwrotn><br />

transformat Fouriera.<br />

Wszystkie pochodne funkcji transformaty Fouriera znajduj> si w grupie datafun.<br />

UWAGA: Funkcja fft i jej pochodne najszybciej wykonywana jest dla danych o rozmiarze<br />

bd>cym potg> dwójki, np. 16, 32, 64, itd. Troch wolniej trwaj> obliczenia dla danych o<br />

rozmiarze bd>cym liczb> pierwsz>. Obliczenia dla danych o innych rozmiarach s><br />

zdecydowanie wolniejsze.<br />

Temat 2<br />

Inne pomocne funkcje<br />

fftshift<br />

real<br />

imag<br />

conj<br />

angle<br />

abs<br />

conv<br />

deconv<br />

cov<br />

decimate<br />

interp<br />

unwrap<br />

przesunicie odpowiednich elementów sk!adowych sygna!u<br />

cz7G rzeczywista liczby zespolonej<br />

cz7G urojona liczby zespolonej<br />

sprz$enie zespolone<br />

cz7G fazowa sygna!u<br />

modu! sygna!u<br />

splot dwóch wektorów<br />

dekonvolucja dwóch wektorów<br />

kowariancja<br />

przetworzenie wektora – rzadsze próbkowanie<br />

przetworzenie wektora – gstsze próbkowanie<br />

Uci>glenie fazy<br />

UWAGA: Aby obliczyG warto7G nat$enia sygna!u nale$y skorzystaG z nastpuj>cego<br />

przekszta!cenia:<br />

>> nat = abs(sygnal).^2;<br />

4


Temat 3<br />

Dwu wymiarowa transformata Fouriera Transformata<br />

Z przypadkiem dwu wymiarowej transformaty Fouriera najcz7ciej mamy do czynienia przy<br />

przetwarzaniu zdjG.<br />

Dwu wymiarowa transformata Fouriera – fft2.<br />

Funkcje odwrotne: ifft2, ifftshift.<br />

Przyk!ad:<br />

>> s = rand(128); % stworzenie 2 wymiarowego zbioru danych<br />

>> fs = fftshift(fft2(s)); % 2 wymiarowa transformata Fouriera wraz z przesuni4ciem danych<br />

Temat 4<br />

Wielowymiarowa transformata Fouriera Transformata<br />

Matlab oferuje mo$liwo7G obliczenia wielowymiarowej transformaty Fouriera przy<br />

wykorzystaniu funkcji fftn.<br />

Przyk!ad:<br />

>> s4 = rand(32,32,32,32); % stworzenie 4 wymiarowego zbioru danych<br />

>> fs4 = fftshift(fftn(s4));<br />

Temat 5<br />

Filtry analogowe i cyfrowe<br />

Signal Processing Toolbox udostpnia wiele funkcji zwi>zanych z przetwarzaniem sygna!ów<br />

za pomoc> filtrów. Filtr analogowy, odpowied czstotliwo7ciowa, realizowany jest przy<br />

wykorzystaniu funkcji freqs(a, b, w). Gdzie a i b s> wspó!czynnikami wielomianów a w jest<br />

wektorem z czsto7ciami, dla których prowadzimy analiz.<br />

Filtracj cyfrow>, FIR (sko:czona odpowied impulsowe) lub <strong>II</strong>R (niesko:czona odpowied<br />

impulsowa), wykonuje si za pomoc> funkcji filter(b, a, x). Gdzie b i a s> wspó!czynnikami<br />

odpowiednich wielomianów a w jest wektorem dyskretnych warto7ci sygna!u na wej7ciu<br />

filtra.<br />

Przyk!ad:<br />

>> data = [1:0.2:4]';<br />

>> filter(ones(1,5)/5,1,data); % filtr cyfrowy tyu FIR (u-redniaj/cy)<br />

>> a = [1 0.4 1]; b = [0.2 0.3 1]; w = logspace(-1,1);<br />

>> freqs(b,a,w) % filtr analogowy<br />

5


PRZETWARZANIE D@WIAKU<br />

Przyk!adem sygna!u 1 wymiarowego jest sygna! dwikowy.<br />

Temat 6<br />

Wczytanie pliku dBwiCkowego – funkcja wavread<br />

Do wczytania pliku dwikowego w formacie .wav wykorzystuje si funkcj wavread().<br />

Przyk!ad:<br />

>> y = wavread(‘plik.wav’); % wczytanie pliku d9wi4kowego<br />

>> [y,Fs,bits] = wavread(‘plik.wav’); % zwraca plik d9wi4kowy y, cz4sto-: próbkowania Fs<br />

i liczb4 bitów próbkowania<br />

UWAGA: Do wczytania ci>gu danych niebd>cych plikiem dwikowym s!u$y funkcja load.<br />

Temat 7<br />

Odtworzenie pliku dBwiCkowego – funkcja wavplay<br />

Funkcj> wavplay mo$na odtworzyG jako dwik dowoln> zmienn> bd>c> wektorem liczb<br />

rzeczywistych.<br />

Przyk!ad:<br />

>> wavplay(y); % odtworzenie pliku d9wi4kowego y<br />

>> d = rand(1,20000);<br />

>> wavplay(d); % odtworzenie wektora losowego<br />

>> t = (0:0.001:1)';<br />

>> y = sin(2*pi*50*t) + 2*sin(2*pi*120*t); sygna> o 2 sk>adowych o cz4sto-ciach 50 i 120 Hz<br />

>> wavplay(y) % odtworzenie d9wi4ku y<br />

Temat 8<br />

Zarejestrowanie dBwiCku – funkcja wavrecord<br />

Do zarejestrowania dwiku wykorzystuje si funkcj wavrecord. Funkcja ta mo$e byG<br />

wywo!ywane z kilkoma parametrami:<br />

waverecord(liczba próbek, czsto7G próbkowania, próbkowanie);<br />

Przyk!ad:<br />

>> Fs = 11025;<br />

>> y = wavrecord(5*Fs,Fs,'int16'); % Nagranie 5 sekund z cz4sto-ci/ 11025 Hz i<br />

próbkowaniem 16 bitowym<br />

6


Temat 9<br />

Zapisanie pliku dBwiCkowego – funkcja wavwrite<br />

Do zapisania zarejestrowanego lub zmienionego pliku dwikowego wykorzystuje si funkcj<br />

wavwrite(zmienna z danymi, czsto7G próbkowania, ‘nazwa pliku’)<br />

Przyk!ad:<br />

>> wavwrite(y,11025,’muzyka.wav’); % zapisanie zmiennej y z próbkowaniem 11025 Hz w<br />

pliku muzyka.wav<br />

Temat 10<br />

Generowanie przebiegów czasowych<br />

sawtooth<br />

square<br />

gauspuls<br />

chirp<br />

przebieg trójk>tny (periodyczny)<br />

przebieg prostok>tny (periodyczny)<br />

przebieg sinusoidalny modyfikowany Gaussem (nieperiodyczny)<br />

Przebieg cosinusoidalny o zmiennym okresie<br />

Temat 11<br />

Fourierowska analiza próbek dwikowych – funkcja specgram<br />

Funkcja specgram udostpniona jest w ramach Signal Processing Toolbox.<br />

Zadaniem tej funkcji jest przeprowadzenie analizy czstotliwo7ciowej sygna!u zmiennego w<br />

czasie. Wynikiem dzia!ania funkcji jest obraz, na którego osi poziomej mamy informacje o<br />

czasie a na osi pionowej informacje o czstotliwo7ciach.<br />

Przyk!ad:<br />

>> specgram(y,512,2); % wy-wietla<br />

7


PRZETWARZANIE OBRAZÓW<br />

Przy przetwarzaniu obrazów wygodnie jest korzystaG z Image Processing Toolbox.<br />

Temat 12<br />

Wczytanie obrazka – funkcja imread<br />

Przy wykorzystaniu funkcji imread mo$na wczytaG dowolny, rozpoznawalny przez Matlaba<br />

(cur, gif, ico, tif, png, hdf), plik graficzny.<br />

Przyk!ad:<br />

>> obr = imread('pout.tif’);<br />

UWAGA: Wczytany obrazek jest pamitany jako macierz typu uint8 lub uint16. Czasami w<br />

celu wykonania ró$nych operacji zachodzi potrzeba zmiany typu macierzy na double:<br />

>> obr = double(imread('pout.tif’));<br />

Temat 13<br />

Wy)wietlenie obrazka na ekran<br />

>> imshow(obr) % wy-wietlenie obrazka<br />

>> image(obr) % wy-wietla macierz danych jako obraz<br />

Temat 14<br />

Zapisywanie obrazka – funkcja imwrite<br />

Podstawowe wywo!anie funkcji imwrite sk!ada si z 2 parametrów okre7laj>cych macierz z<br />

danymi oraz nazw pliku. Rozszerzenie nazwy pliku determinuje w jakim formacie zapisany<br />

jest obraz. W wywo!aniu funkcji mo$e si znaleG te$ wicej parametrów odpowiedzialnych<br />

za takie parametry jak palety barw, ilo7G kolorów, przezroczysto7G, kompresje itp.<br />

Przyk!ad:<br />

>> imwrite(obr,'obraz.png’); % nagranie macierzy z danymi obr w pliku obrazowym typu png<br />

Temat 15<br />

Podstawowe operacje na obrazach<br />

imabsdiff<br />

imadd<br />

imdivide<br />

imlincomb<br />

immultiply<br />

imsubtract<br />

ró$nica midzy dwoma obrazami<br />

suma 2 obrazów, plus sta!a<br />

7rednia arytmetyczna z 2 obrazów (piksel po pikselu)<br />

kombinacja liniowa midzy seri> obrazów<br />

iloczyn 2 obrazów<br />

odejmowanie dwóch obrazów, minus sta!a<br />

UWAGA: W przypadku plików typu uint8 lub uint16, dane po ka$dej cz>stkowej operacji s><br />

ucinane do okre7lonego zakresu. Mo$e to powodowaG niezamierzone dzia!ania.<br />

8


Temat 16<br />

Metody poprawiania obrazów<br />

Przyk!ad:<br />

imadjust<br />

fspecial<br />

imfill<br />

histeq<br />

poprawienie kontrastu obrazka<br />

ró$nego rodzaju filtry poprawiaj>ce obraz<br />

wype!nianie dziur w obrazie<br />

poprawienie kontrastu obrazu na podstawie histogramu<br />

>> filtr = fspecial('unsharp'); % generacja filtry wyostrzaj/cego kontury<br />

>> fobr = imfilter(obr,filtr); % zastosowanie zdefiniowanego filtru do obrazu Obr<br />

Temat 17<br />

Przetwarzanie obrazów<br />

Przyk!ad:<br />

imcontour<br />

edge<br />

imfilter<br />

deconv*<br />

imregionalmax<br />

imnoise<br />

znajdowanie konturów obiektów w obrazie<br />

znajdowanie krawdzi w obrazie<br />

splot obrazu z filtrem<br />

szereg funkcji przeprowadzaj>cych dekonvolucj<br />

szukanie lokalnych maksimów w obrazie<br />

dodanie szumu do obrazu<br />

>> filtr = ones(3)/9; % generacja filtru u-redniaj/cego 3x3<br />

>> fobr = imfilter(obr,filtr); % zastosowanie filtru do obrazu<br />

Temat 18<br />

Morfologia matematyczna w przetwarzaniu obrazów<br />

Przyk!ad:<br />

imclose<br />

imopen<br />

imdilate<br />

imerode<br />

strel<br />

imbothat<br />

imtophat<br />

bwmorph<br />

operacja zamknicia morfologicznego<br />

operacja otwarcia morfologicznego<br />

operacja delacji morfologicznej<br />

operacja erozji morfologicznej<br />

tworzenie elementu strukturyzuj>cego<br />

operacja morfologiczna dolny-kapelusz<br />

operacja morfologiczna górny-kapelusz<br />

Operacje morfologiczne na obrazie czarno-bia!ym<br />

>> obr = imread('circles.png'); % wczytanie obrazka czarno-bia>ego<br />

>> elemstr = strel('disk',5); % definicja elementu strukturyzuj/cego , okr/g o promieniu 5<br />

>> erodeobr = imerode(obr,elemstr); % erozja obrazu elementem strukturyzuj/cym<br />

>> obr = bwmorph(BW,'remove')<br />

Temat 19<br />

Inne przydatne funkcje do pracy z obrazami<br />

imhist<br />

improfile<br />

impixel<br />

bwarea<br />

imrotate<br />

imresize<br />

im2bw<br />

histogram obrazu<br />

przekrój przez wiersz lub kolumn obrazu<br />

kolor lub warto7G piksela<br />

liczenie powierzchni obiektu (obraz czarno-bia!y)<br />

obrót obrazu o dowolny k>t<br />

zmiana rozmiaru obrazka<br />

Zamiana obrazka szaroodcieniowego na obraz binarny<br />

9


Temat 20<br />

Filmy w Matlabie<br />

Przyk!ad:<br />

aviread<br />

movie<br />

avifile<br />

getframe<br />

addframe<br />

wczytanie pliku filmowego typu avi<br />

odtworzenie zmiennej typu avi<br />

stworzenie nowego obiektu typu avi<br />

pobranie wntrza okna graficznego jako klatki filmu<br />

dodanie ramki/obrazka do zmiennej typu avi<br />

>> x=1:10; % o- X<br />

>> for j=1:10,<br />

plot(x,j*x,’r’), % w p4tli rysuje kolejne obrazki<br />

axis([0 100 0 10]); % ograniczenie zmienno-ci wy-wietlania osi wykresu<br />

F(j)=getframe; % pobieranie kolejnych klatek<br />

end<br />

>> movie(F,10) % 10 krotne wy-wietlenie animacji<br />

Temat 21<br />

Korelacyjne metody rozpoznawania obrazów<br />

Korelacja jest miar> podobie:stwa midzy 2 obiektami. Mo$na j> wykorzystaG do<br />

rozpoznawania obrazów.<br />

Przyk!ad:<br />

function [w]=rozp1<br />

% scena do filtru<br />

a=double(imread('A.bmp')); % obrazki o rozmiarze 64x64<br />

b=double(imread('B.bmp'));<br />

c=double(imread('C.bmp'));<br />

d=double(imread('D.bmp'));<br />

filtr=zeros(256); % filtr b4dzie wi4kszy 256x256<br />

filtr(128-64-32:128-64+31,128-64-32:128-64+31)=a; % poszczególne litery w 4 :wiartkach<br />

filtr(128+64-32:128+64+31,128-64-32:128-64+31)=b;<br />

filtr(128-64-32:128-64+31,128+64-32:128+64+31)=c;<br />

filtr(128+64-32:128+64+31,128+64-32:128+64+31)=d;<br />

figure, subplot(2,2,1), imshow(filtr) % rysuje co zapami4tane na filtrze<br />

% liczenie filtru<br />

f=fft2(filtr);<br />

filtr=conj(f)./abs(f);<br />

% scena wejsciowa<br />

we=zeros(256);<br />

we(128-32:128+31,128-32:128+31)=a; % litera w -rodku obrazu 256x256<br />

subplot(2,2,2), imshow(we) % rysuje scen4 wej-ciow/<br />

% rozpoznanie – korelacja mi4dzy obrazem wej-ciowym a scen/ na filtrze<br />

p1=fft2(we);<br />

p2=p1.*filtr;<br />

p3=fftshift(ifft2(p2));<br />

wy=abs(p3).^2; % nat4Lenie w p>aszczy9nie wyj-ciowej<br />

subplot(2,2,3), imshow(wy/max(max(wy))) % p>aszczyzna korelacji 2D<br />

subplot(2,2,4), mesh(wy) % p>aszczyzna korelacji 3D<br />

10


CALKOWANIE NUMERYCZNE<br />

Temat 22<br />

Ca!kowanie numeryczne<br />

Problem polega na znalezieniu ca!ki oznaczonej funkcji f(x) na przedziale . Jest to<br />

!atwe, gdy znana jest funkcja pierwotna F(x) taka, $e F(x)’=f(x) nie zawsze jest to jednak<br />

mo$liwe. Metody ca!kowania numerycznego (kwadratury) polegaj> na przybli$eniu funkcji<br />

podca!kowej f na danym przedziale lub jego podprzedzia!ach przy pomocy innej<br />

funkcji, dla której warto7G ca!ki jest okre7lona analitycznie. Matlab stosuje kwadratury<br />

Newtona-Cotesa - quad (interpolacja wielomianem drugiego stopnia) i Simpsona - quadl<br />

(interpolacja wielomianowa – dobierany stopie: wielomianu).<br />

Q=quad(f,a,b,tol,trace);<br />

Q=quadl(f,a,b,tol,trace);<br />

f – !a:cuch zawieraj>cy nazw funkcji, funkcja musi byG umieszczona w odpowiednim<br />

skrypcie, musi zwracaG wektor warto7ci a jej argumentem jest wektor elementów.<br />

a,b – przedzia! ca!kowania,<br />

tol – wymagana tolerancja wzgldna, domy7lnie 10^(-3)<br />

trace – parametr opcjonalny, pozwala na rysowanie wykresu z wz!ami kwadratury.<br />

Przyk!ad 1<br />

function [y] = funkcja_calkowana(x)<br />

%% funkcja<br />

y=sin(x.*x);<br />

%% Koniec<br />

%%Wywo>anie funkcji ca>kowania<br />

>> q1 = quad(‘funkcja_calkowana’,0,pi,1e-5,1);<br />

>> ql = quadl(‘funkcja_calkowana’,0,pi,1e-5,1);<br />

Temat 23<br />

Uchwyt do funkcji – @<br />

Istnieje kilka sposobów wywo!ywania funkcji ca!kowania. Jedn> z nich, wykorzystywan><br />

tak$e w innych przypadkach, jest metoda oparta na uchwycie funkcji. Uchwyt @ mo$na<br />

wykorzystaG do definiowania w!asnych funkcji.<br />

Przyk!ad:<br />

>> srednia = @(x,y) (x+y)/2; % definicja funkcji<br />

>> srednia(5,3) % wywo>anie z linii poleceP Malaba<br />

Wykorzystanie uchwytu @ do ca!kowania funkcji przedstawiono poni$ej.<br />

Przyk!ad:<br />

>> fs = @(x) sin(x);<br />

>> ql = quad1(fs,0,pi,1e-5,1);<br />

11


Temat 24<br />

Inne funkcje zwi-zane z ca!kowaniem numerycznym funkcji<br />

dblquad<br />

trapz<br />

triplequad<br />

obliczanie ca!ek podwójnych<br />

ca!kowanie metod> trapezów<br />

obliczanie ca!ek potrójnych<br />

12


NUMERYCZNE RÓNNICZKOWANIE FUNKCJI<br />

Temat 25<br />

Numeryczne róOniczkowanie funkcji<br />

Przybli$on> warto7G pochodnej mo$na obliczyG przez obliczenie ró$nic pomidzy<br />

warto7ciami tych samych wspó!rzdnych s>siaduj>cych punktów funkcji zadanej<br />

numerycznie. Korzysta si tu z definicji pochodnej funkcji:<br />

d f ( x) f ( x2 ) f ( x1<br />

)<br />

=<br />

dx x2 x1<br />

Do wykonania tej operacji wykorzystuje si funkcj diff(), która oblicza ró$nice pomidzy<br />

s>siaduj>cymi elementami wektora.<br />

Przyk!ad<br />

>> dxdy = diff(y)./diff(x) % y jest wektorem z warto-ciami funkcji w punktach x<br />

Temat 26<br />

Inne funkcje zwi-zane z numerycznym obliczaniem pochodnej.<br />

gradient<br />

del2<br />

Numeryczne obliczenie gradientu funkcji<br />

Laplasian funkcji<br />

13


RÓWNANIA RÓNNICZKOWE<br />

Równania ró$niczkowe, które mamy mo$liwo7G rozwi>zywania w Matlabie mo$na podzieliG<br />

na trzy grupy:<br />

- równania ró$niczkowe zwyczajne gdzie szukamy rozwi>zania równania<br />

ró$niczkowego dla zadanego warunku pocz>tkowego.<br />

- równania ró$niczkowe zwyczajne gdzie szukamy rozwi>zania równania<br />

ró$niczkowego dla zadanych warunków granicznych<br />

- równania ró$niczkowe cz>stkowe<br />

Temat 27<br />

Równania róOniczkowe zwyczajne pierwszego rzCdu<br />

W rozwi>zaniach wielu problemów fizycznych, ekonomicznych wymagana jest znajomo7G<br />

funkcji y=y(t) przy znajomo7ci funkcji y'=f(t, y) oraz warunków pocz>tkowych y(a)=y0,<br />

gdzie a oraz y0 s> liczbami rzeczywistymi a f funkcj> w postaci jawnej. W takim przypadku<br />

mamy do czynienia z równaniem ró$niczkowym zwyczajnym pierwszego rzdu (ordinary<br />

differential equations - ODEs).<br />

Funkcja<br />

ode23<br />

ode45<br />

ode113<br />

ode15s<br />

ode23s<br />

Opis metody<br />

Rozwi>zuje zagadnienie pocz>tkowe dla równa: ró$niczkowych zwyczajnych<br />

metod> Runge-Kutta rzdu 2 i 3<br />

Rozwi>zuje zagadnienie pocz>tkowe dla równa: ró$niczkowych zwyczajnych<br />

metod> Runge-Kutta rzdu 4 i 5<br />

Rozwi>zuje zagadnienie pocz>tkowe dla równa: ró$niczkowych zwyczajnych<br />

metod> Adams-Bashforth-Moulton<br />

Metoda oparta na formule numerycznego ró$niczkowania<br />

Metoda oparta na zmodyfikowanej formule Rosenbrocka 2 rzdu<br />

Podstawowa formu!a rozwiazywania ODE w Matlabie jest nastepujaca:<br />

[t, y] = ode23(fun, tspan, y0,options]<br />

gdzie:<br />

fun – zmienna !a:cuchow> bd>ca nazw funkcji zawieraj>c> rozwi>zywane równanie<br />

ró$niczkowe<br />

tspan – warto7ciami czasu, dla którego poszukiwane jest rozwi>zanie, y0 jest wektorem, w<br />

którym przechowywane s> warto7ci rozwi>zania uk!adu w chwili pocz>tkowej.<br />

Je7li zmienna tspan zawiera wicej ni$ dwa elementy, to metoda zwraca obliczone warto7ci y<br />

dla tych elementów. Parametry wyj7ciowe t i y zawieraj> wektory warto7ci do oblicze: t i<br />

obliczone dla nich warto7ci y.<br />

Warto7ci options s> ustawiane za pomoc> funkcji odeset i pozwalaj> ingerowaG w parametry<br />

rozwi>zywania równania<br />

Analogicznie rozwi>zuje si równania ró$niczkowe dla metody ode45.<br />

14


Przyk!ad:<br />

Szukamy rozwi>za: numerycznych y = y(t) dla warto)ci t = 0, .25, .5, .75, 1 dla równania<br />

ró$niczkowego y' = -2ty 2 , przy warunku pocz>tkowym y(0) = 1. Zastosowane zostan> dwie<br />

metody ode23 i ode45.<br />

Powy$szy problem ma rozwi>zanie analityczne y(t) = 1/(1 + t2) co pozwoli porównaG<br />

otrzymane wyniki numeryczne z wynikami analitycznymi.<br />

>> %% definicja rozwi/zywanego równania róLniczkowego y' = -2ty^2<br />

function dy = eq1(t,y)<br />

dy = -2*t.*y(1).^2;<br />

%% rozwi/zanie równania róLniczkowego zwyczajnego<br />

>> format long<br />

>> tspan = [0 .25 .5 .75 1]; y0 = 1; % warto-ci dla których liczymy i warunki pocz/tkowe<br />

>> [t1 y1] = ode23('eq1', tspan, y0); % metoda ode23<br />

>> [t2 y2] = ode45('eq1', tspan, y0); % metoda ode45<br />

>> [t1 y1 y2] % porównanie wyników osi/gni4tych obiema metodami<br />

Przyk!ad:<br />

W poni$szym przyk!adzie szukamy rozwi>za: numerycznych uk!adu równa: ró$niczkowych<br />

pierwszego stopnia:<br />

y 1( t) = y1( t) 4y2( t)<br />

<br />

y2 () t = y1() t + y2()<br />

t<br />

przy warunkach pocz>tkowych:<br />

y1( 0) = 1, y2( 0)<br />

= 0.<br />

Zastosowana zostanie metoda ode23.<br />

Powy$szy problem ma rozwi>zanie analityczne<br />

1<br />

y1<br />

= exp ( ) exp ( 3 )<br />

2<br />

t + t <br />

1<br />

y2<br />

= exp( 3t) + exp( t)<br />

<br />

4<br />

<br />

<br />

co pozwoli porównaG otrzymane wyniki numeryczne z wynikami analitycznymi.<br />

%% definicja rozwi/zywanego uk>adu równaP róLniczkowych za pomoc/ funkcji inline<br />

>> dy = inline('[1 –4;-1 1]*y', 't', 'y')<br />

>> tspan = [0 1]; % przedzia> dla którego szukamy rozwi/zaP<br />

>>y0 = [1 0]; % warunki pocz/tkowe<br />

>>[t,y] = ode23(dy, tspan, y0); % metoda ode23<br />

>>plot(t,y(:,1),t,y(:,2),'--'), legend('y1','y2'), xlabel('t'), ...<br />

ylabel('y(t)'), title('Numerical solutions y_1(t) and y_2(t)') % zobrazowanie wyników<br />

15


Przyk!ad:<br />

W poni$szym przyk!adzie szukamy rozwi>zania numerycznego uk!adu równa:<br />

rózniczkowych dla równania Eulera dla bry!y sztywnej bez si! zewnetrzych:<br />

y 1<br />

= y2y3<br />

<br />

y2 = y1y3<br />

<br />

y<br />

= 0,51y y<br />

3 1 2<br />

function dydt = f(t,y) %% zapisujemy równia Eulera<br />

dydt = [y(2)*y(3); -y(1)*y(3); -0.51*y(1)*y(2)];<br />

>> tspan = [0 12]; % przedzia>, dla którego szukamy rozwi/zaP<br />

>> y0 = [0; 1; 1]; warunki pocz/tkowe<br />

>> ode45(@f,tspan,y0); % metoda ode45<br />

Temat 28<br />

Równania róOniczkowe zwyczajne wyOszego rzCdu<br />

Matlab pozwala równie$ na rozwi>zywanie równa: ró$niczkowych wy$szego rzdu. W tym<br />

przypadku trzeba jednak zapisaG równanie w postaci uk!adu równa: ró$niczkowego<br />

pierwszego rzdu.<br />

y = f ( t,<br />

y)<br />

Dowolne równanie ró$niczkowe wy$szego rzdu<br />

( n) ( n 1)<br />

y = f t, y, y,...,<br />

y <br />

( )<br />

mo$na zapisaG jako uk!ad równa: pierwszego rzdu stosuj>c podstawienie<br />

( n 1)<br />

y1 = y, y2<br />

= y,...,<br />

yn<br />

= y <br />

Wtedy dostaniemy uk!ad n równani ró$niczkowych pierwszego rzdu:<br />

y 1<br />

= y2<br />

y 2<br />

= y3<br />

<br />

<br />

<br />

<br />

y n<br />

= f ( t, y1, y2,...,<br />

yn)<br />

16


Przyk!ad:<br />

W poni$szym przyk!adzie szukamy rozwi>zania numerycznego równania ró$niczkowego<br />

drugiego stopnia van der Pola<br />

2<br />

yµ<br />

1 y y<br />

+ y = 0<br />

( )<br />

1 1 1 1<br />

Przyjmuj>c podstawienie<br />

y 1<br />

= y2<br />

otrzymujemy uk!ad równa: pierwszego stopnia w postaci:<br />

y 1<br />

= y2<br />

2<br />

y2 µ ( 1 y1 ) y2 y1<br />

function dydt = f(t,y,mu) % funkcja w której zapisali-my równanie róLniczkowe<br />

dydt = [y(2); mu*(1-y(1)^2)*y(2)-y(1) ];<br />

>> Mu=100; % przyjmujemy parametr T<br />

>> tspan = [0; max(20,3*MU)]; % przedzia>, dla którego szukamy rozwi/zaP<br />

>> y0 = [2; 0]; %warunki pocz/tkowe<br />

>> [t,y] = ode15s(@f,tspan,y0); % metoda ode15s<br />

>> plot(t,y(:,1)); % zobrazowanie wyników<br />

>> title(['Solution of van der Pol Equation, \mu = ' num2str(MU)]);<br />

>> xlabel('time t');<br />

>> ylabel('solution y_1');<br />

>> axis([tspan(1) tspan(end) -2.5 2.5]);<br />

17


OBSLUGA BLADÓW<br />

Temat 29<br />

Komunikat b!Cdu – funkcja error<br />

Funkcja error wypisuje komunikat b!du: error(‘to jest b!>d’)<br />

W celu wyprowadzenia na ekran komunikatu o b!dzie w postaci okienka nale$y u$yG funkcji<br />

errordlg(´errorstrin´,´dlgname´).<br />

Przyk!ad:<br />

>> error(‘Cos jest nie tak’);<br />

>> errordlg(‘Cos jest nie tak’,’Komunikat o b>4dzie’);<br />

Temat 30<br />

Komunikat ostrzeOenia – funkcja warning<br />

Wypisuje komunikat ostrze$enia.<br />

Przyk!ad:<br />

>> warning(‘to jest ostrzeLenie’);<br />

Temat 31<br />

Zmienne standardowe: nargin, nargout<br />

Liczba parametrów w definicji funkcji mo$e si ró$niG od liczby parametrów, jak> podaje<br />

u$ytkownik. Zmienna standardowa nargin okre7la dla danego wywo!ania funkcji z iloma<br />

parametrami funkcja ta zosta!a wywo!ana. Odpowiednio, zmienna nargout okre7la ile<br />

parametrów wyj7ciowych zostanie pobranych przez u$ytkownika.<br />

Przyk!ad:<br />

function [y1, y2, y3, y4]=funkcja_x(x1, x2, x3, x4)<br />

%% [y1, y2, y3, y4]=funkcja_x(x1, x2, x3, x4)<br />

% y1 ...y4 parametry wyj-ciowe funkcji<br />

% x1....x4 parametry wej-ciowe funkcji<br />

if (nargin1)<br />

y2 = ....<br />

y3= ......<br />

y4= ......<br />

% koniec funkcji<br />

18


Zmienne nargin, nargout mog> byG wykorzystywane do sprawdzania poprawno7ci liczby<br />

wprowadzonych lub wyprowadzanych zmiennych z funkcji.<br />

Przyk!ad:<br />

function funk(x,y)<br />

if nargin ~= 2<br />

error('Wrong number of input arguments')<br />

end<br />

UWAGA: Do wprowadzania i wyprowadzania dowolnej liczby dowolnych elementów do i z<br />

funkcji wykorzystuje si odpowiednio funkcj varargin oraz funkcj varargout.<br />

Temat 32<br />

Reagowanie na nieprawid!owy argument funkcji<br />

Do sprawdzenia czy dana zmienna ma oczekiwan> przez nas postaG wykorzystujemy<br />

operatory typu is*.<br />

Przyk!ad:<br />

ischar<br />

isempty<br />

isequal<br />

isglobal<br />

isinteger<br />

islogical<br />

isnan<br />

isnumeric<br />

isprime<br />

isreal<br />

isscalar<br />

issorted<br />

issparse<br />

isvector<br />

if ~isreal(arg2),<br />

error(‘Zmienna musi by: liczb/ rzeczywist/’)<br />

end<br />

Sprawdza czy dana wej7ciowa jest zmienn> typu char<br />

Sprawdza czy dana wej7ciowa jest zmienn> pust><br />

Sprawdza czy dane 2 macierze s> sobie równe<br />

Sprawdza czy dana wej7ciowa jest zmienn> globaln><br />

Sprawdza czy wszystkie elementy ziennej s> typu integer<br />

Sprawdza czy dana wej7ciowa jest zmienn> logiczn><br />

Znajduje elementy niesko:czone (NaN)<br />

Sprawdza czy dana wej7ciowa jest zmienn> numeryczn><br />

Znajduje elementy bd>ce liczbami pierwszymi<br />

Sprawdza czy wszystkie elementy zmiennej s> typu real<br />

Sprawdza czy dana wej7ciowa jest skalarem<br />

Sprawdza czy dana wej7ciowa jest posortowana<br />

Sprawdza czy dana wej7ciowa jest macierz> rzadk><br />

Sprawdza czy dana wej7ciowa jest wektorem<br />

>> a = 1:20; % zmienna wej-ciowa<br />

>> p = isprime(a); % wektor z 1 tam gdzie dana liczba jest pierwsza<br />

19


GRAFIKA UCHWYTÓW<br />

Temat 33<br />

Uchwyt<br />

Ka$dy element graficzny wy7wietlony w oknie wykresu ma swój uchwyt. Wykorzystuj>c<br />

uchwyty mo$emy mieG dostp do wszystkich elementów okna graficznego.<br />

W celu uzyskania g!ównych uchwytów stosujemy funkcj findobj.<br />

Przyk!ad:<br />

>> plot(1:10,’o-’) % otworzenie okna graficznego i wyrysowanie linii prostej<br />

>> h = findobj; % szukam g>ównych uchwytów<br />

% warto-ci zwrócone przez Matlaba<br />

h = 0<br />

1.0000<br />

73.0011<br />

1.0050<br />

Aby uzyskaG te dane w bardziej zrozumia!ej formie stosujemy nastpuj>c> sk!adni:<br />

>> get(h,’type’)<br />

ans = ’root’<br />

‘figure’<br />

‘axes’<br />

‘line’<br />

W tej chwili wywo!anie np. h(4) daje nam uchwyt do obiektu Line.<br />

Temat 34<br />

Parametry obiektów graficznych<br />

W celu wy7wietlenia listy dostpnych parametrów danego elementu wykresu korzystamy z<br />

funkcji set.<br />

>> set(h(4))<br />

Aby uzyskaG opcje danego sk!adnika pojedynczego elementu graficznego korzystamy z<br />

nastpuj>cej sk!adni:<br />

>> set(h(4),’Marker’) % s>ówko Marker okre-la interesuj/cy nas sk>adnik<br />

Lista parametrów dostpna jest w opisie danego elementu graficznego.<br />

20


Temat 35<br />

Ustawianie parametrów graficznych – funkcja set<br />

Maj>c uchwyt do danego elementu graficznego mo$emy zmieniG jego parametry.<br />

W tym celu korzystamy z funkcji set(uchwyt, parametr,’warto,-)<br />

Przyk!ad:<br />

>> set(h(4), ‘Marker’, ‘s’, ‘MarkerSize’, 16) % kwadratowy marker (‘s’) o wielko-ci 16<br />

Temat 36<br />

Pobieranie bieO-cych parametrów obiektów graficznych – funkcja get<br />

Maj>c uchwyt do danego elementu graficznego mo$emy sprawdziG jego parametry.<br />

W tym celu korzystamy z funkcji get(uchwyt,parametr).<br />

>> get(h(4),’Marker’);<br />

Temat 37<br />

Inne funkcje zwi-zane z grafik- uchwytów<br />

reset<br />

delete<br />

drawnow<br />

findobj<br />

copyobj<br />

Przywraca domy7lne parametry obiektu<br />

Usuwa obiekt<br />

Wykonuje zaleg!e operacje graficzne<br />

Szuka obiektu o zadanych parametrach<br />

Tworzy kopi obiektu<br />

Temat 38<br />

BieO-ce okno graficzne<br />

W przypadku aktywnego okna graficznego Matlab udostpnia 3 predefiniowane uchwyty:<br />

gca<br />

gcf<br />

gco<br />

Uchwyt do osi wspó!rzdnych<br />

Uchwyt do okna graficznego<br />

Uchwyt do bie$>cego obiektu<br />

Temat 39<br />

Inne funkcje zwi-zane z obs!ug- okien graficznych<br />

figure<br />

clf<br />

shg<br />

close<br />

refresh<br />

cla<br />

Utworzenie nowego okna graficznego<br />

Czyszczenie okna graficznego<br />

Pokazuje ostatnie okno graficzne<br />

Zamyka bie$>ce okno graficzne<br />

Od7wie$a zawarto7G bie$>cego okna graficznego<br />

Czy7ci zawarto7G uk!adu wspó!rzdnych<br />

21


GRAFICZNY INTERFEJS UNYTKOWNIKA<br />

Temat 40<br />

Tworzenie graficznego interfejsu uOytkownika – funkcja guide<br />

Pisz>c aplikacje na w!asny u$ytek czsto zapominamy o przyjaznym interfejsie. Jednak ze<br />

wzgldu na funkcjonalno7G, !atwo7G obs!ugi i w przypadku, gdy z naszego programu maj><br />

korzystaG tak$e inni u$ytkownicy dobrze jest dodaG do aplikacji graficzny interfejs<br />

u$ytkownika.<br />

Aby rozpocz>G tworzenia takiego interfejsu nale$y wywo!aG funkcj guide.<br />

Po otworzeniu si okna dialogowego nale$y wybraG rodzaj tworzonego przez nas okna oraz<br />

katalog w którym ma byG ono zapisane.<br />

UWAGA: Matlab automatycznie wygeneruje 2 pliki. W jednym *.fig trzymana jest<br />

informacja o wygl>dzie interfejsu a w drugim *.m szablon funkcji, któr> bdzie wykonywa!<br />

interfejs.<br />

Temat 41<br />

Okno edytora graficznego interfejsu uOytkownika.<br />

Do g!ównych elementów okna edytora graficznego nale$>: menu, pasek narzdzi, elementy<br />

interfejsu oraz obszar roboczy.<br />

Do najwa$niejszych elementów paska narzdzi nale$>:<br />

ikona M-file editor – dostp do kodu tworzonego interfejsu<br />

run – uruchamianie tworzonego interfejsu<br />

Temat 42<br />

Praca nad interfejsem uOytkownika.<br />

Prace nad interfejsem u$ytkownika mo$na podzieliG na kilka etapów. Do najwa$niejszych<br />

nale$>: projektowanie, ustawianie elementów, w!a7ciwo7ci elementów, programowanie,<br />

testowanie.<br />

Temat 43<br />

DostCpne elementy interfejsu uOytkownika.<br />

Matlab oferuje kilka elementów graficznych, które mog> si znaleG w oknie tworzonego<br />

interfejsu u$ytkownika. Nale$> do nich:<br />

push button<br />

slider<br />

radio button<br />

checkbox<br />

edit text<br />

static text<br />

popup menu<br />

list box<br />

toggle button<br />

axes<br />

panel<br />

button group<br />

activeX control<br />

przycisk dzia!aj>cy po naci7niciu go myszk><br />

suwak<br />

wybór 1 opcji z kilku<br />

pole wyboru. Mo$liwy wybór kilku opcji jednocze7nie<br />

pole edycji<br />

tekst bez mo$liwo7ci jego edycji<br />

menu podrczne aktywowane po naci7niciu prawym przyciskiem myszki<br />

rozwijana lista wyboru<br />

przycisk, który mo$na wcisn>G na sta!e<br />

uk!ad wspó!rzdnych<br />

obszar do ustawiania pogrupowanych innych elementów<br />

obszar do ustawiania grupy przycisków tego samego typu<br />

kontrolka activeX<br />

22


Temat 44<br />

Ustawianie elementów i ich w!a)ciwo)ci.<br />

W celu umieszczenia danego elementu interfejsu u$ytkownika na obszarze pola roboczego<br />

nale$y wskazaG ten element a nastpnie nacisn>G (lub przeci>gn>G) w obrbie pola roboczego.<br />

Elementy mo$na przesuwaG i wyrównywaG z innymi. Dostp do parametrów elementu<br />

mo$liwy jest po dwukrotnym klikniciu lub w menu podrcznym danego elementu.<br />

Temat 45<br />

W!a)ciwo)X obiektu Tag<br />

Jednym z najwa$niejszych w!asno7ci ka$dego elementu interfejsu u$ytkownika jest pole Tag.<br />

Warto7G tekstowa wpisana w to pole daje dostp do danego elementu oraz pozwala na<br />

reagowanie na wszelkie akcje zwi>zane z tym elementem (funkcja callback).<br />

Temat 46<br />

ZapamiCtanie interfejsu uOytkownika<br />

Po etapie projektowania interfejsu u$ytkownika wygodnie jest zapamitaG rezultaty naszej<br />

pracy. Matlab automatycznie wygeneruje 2 pliki. W jednym *.fig trzymana jest informacja o<br />

wygl>dzie interfejsu a w drugim *.m szablon funkcji, któr> bdzie wykonywa! interfejs.<br />

Temat 47<br />

Reagowanie na akcje uOytkownika – funkcja callback<br />

Wygenerowane w czasie zapisywania pliki zawieraj> obs!ug wszystkich zdarze: zwi>zanych<br />

z wywo!ywaniem naszego interfejsu i wykonywaniem go w 7rodowisku Matlaba. Pozostaje<br />

teraz zdefiniowaG wszystkie funkcje zwi>zane z interakcj> u$ytkownika z projektowanym<br />

interfejsem i programem.<br />

W tym celu z cz7ci> elementów wystpuj>c> w oknie interfejsu np. przyciskiem nale$y<br />

skojarzyG jak>7 funkcj, która bdzie wykonywana po jego naci7niciu. W tym celu nale$y<br />

dla danego elementu zdefiniowaG funkcj callback.<br />

Mo$na to wykonaG albo w oknie Property Inspektor danego elementu lub po naci7niciu<br />

danego elementu prawym przyciskiem myszki.<br />

Po stworzeniu funkcji callback w kodzie programu pojawi si odpowiadaj>cy jej nag!ówek<br />

funkcji. Rol> projektanta interfejsu jest wpisanie w dalszej cz7ci programu instrukcji jakie<br />

maj> zostaG wykonane.<br />

Przyk!ad:<br />

Za!ó$my, $e w interfejsie u$ytkownika mamy zdefiniowane dwa elementy: PushButton (Tag<br />

= Przycisk) oraz StaticText (Tag = Tekst). Zadaniem elementu tekstowego jest wy7wietlanie<br />

informacji o liczbie naci7niG przycisku.<br />

function Przycisk_Callback(hObject, eventdata, handles)<br />

% hObject handle to Przycisk (see GCBO)<br />

% eventdata reserved - to be defined in a future version of <strong>MATLAB</strong><br />

% handles structure with handles and user data (see GUIDATA)<br />

persistent ile % definicja zmiennej w której trzymamy liczb4 naci-ni4: przycisku<br />

if isempty(ile) % je-li nie ma Ladnej warto-ci to przypisuj4 warto-: 0<br />

ile=0;<br />

end<br />

ile = ile + 1; % reakcja na naci-ni4cie. Zwi4kszam licznik o 1<br />

str=['Liczba nacisniec: ', Int2Str(ile)]; % tekst do wy-wietlenia<br />

set(handles.tekst,'String',str); % przypisanie w>a-ciwo-ci do pola String obiektowi tekst<br />

23


Temat 48<br />

Zmienne w programie<br />

Dobr> praktyk> jest definiowanie tych zmiennych, które maj> ulegaG modyfikacji w trakcie<br />

dzia!ania programu w ramach uchwytów. Funkcje callback maj> pe!ny dostp do wszystkich<br />

elementów programu zdefiniowanych w uchwycie.<br />

Przyk!ad:<br />

% Choose default command line output for untitled1<br />

handles.output = hObject;<br />

% DODANE<br />

handles = guihandles(hObject); % pobranie uchwytu do ca>ego okna interfejsu<br />

handles.ile = 0; % dodanie nowego elementu do uchwytu i nadanie mu warto-ci<br />

% KONIEC DODANEGO<br />

% Update handles structure<br />

guidata(hObject, handles); % zapami4tanie uchwytu<br />

%<br />

function Przycisk_Callback(hObject, eventdata, handles)<br />

% hObject handle to Przycisk (see GCBO)<br />

% eventdata reserved - to be defined in a future version of <strong>MATLAB</strong><br />

% handles structure with handles and user data (see GUIDATA)<br />

handles.ile = handles.ile + 1; % zwi4kszenie licznika o jeden<br />

guidata(hObject, handles); % zapami4tanie nowej warto-ci uchwytu<br />

str=['Liczba nacisniec: ', Int2Str(handles.ile)]; % tekst do wy-wietlenia<br />

set(handles.tekst,'String',str); % przypisanie w>a-ciwo-ci do pola String obiektowi tekst<br />

Temat 49<br />

Wykonanie programu ze zdefiniowanym interfejsem uOytkownika<br />

W celu wykonania programu z interfejsem u$ytkownika nale$y w oknie komend wpisaG<br />

nazw funkcji z interfejsem.<br />

Temat 50<br />

Interfejs graficzny – EditBox<br />

Przyk!ad:<br />

function edit1_Callback(hObject, eventdata, handles)<br />

str = get(handles.edit1, ‘String’); % pobranie tekstu z elementu Edit1<br />

set(handles.edit1, ‘String’, str); % ustawienie tekstu w obiekcie Edit1<br />

24


Temat 51<br />

Interfejs graficzny – ToggleButton<br />

Przyk!ad:<br />

function togglebutton1_Callback(hObject, eventdata, handles)<br />

stan = get(handles.togglebutton1,’Value’); % pobranie stanu przycisku togglebutton1<br />

if stan==0,<br />

… % klawicz wy>/czony<br />

else<br />

… % klawisz w>/czony<br />

end;<br />

Temat 52<br />

Interfejs graficzny – RadioButton<br />

W Matlabie pola RadioButton nie s> ze sob> powi>zane. Oznacza to, $e obs!ug tych<br />

elementów polegaj>c> na w!>czaniu lub wy!>czaniu odpowiednich pól RadioButton musi<br />

przeprowadziG u$ytkownik.<br />

Przyk!ad:<br />

function radiobutton1_Callback(hObject, eventdata, handles)<br />

set(handles.radiobutton1,’Value’,1); % W>/czenie zaznaczenia pola RadioButton1<br />

set(handles.radiobutton2,’Value’,0); % Wy>/czenie zaznaczenia pola RadioButton2<br />

Temat 53<br />

Interfejs graficzny – ListBox<br />

Wszystkie opcje dostpne do wyboru w obiekcie ListBox s> dostpne we w!a7ciwo7ci<br />

‘String’.<br />

Przyk!ad:<br />

function listbox1_Callback(hObject, eventdata, handles)<br />

opcja = get(handles.listbox1, ‘Value’); % pobranie numeru wybranej linii<br />

str = [‘Opcja’, num2str(opcja)]; % zmienna tekstowa z informacj/ o wybranej opcji<br />

tresc = get(handles.listbox1, 'String'); % pobranie wszystkich linii tekstu z listbox1<br />

set(handles.text1, 'String', str(opcja)); % wy-wietlenie w obiekcie text1 (StaticText) tekstu z<br />

% wybranej linii obiektu listbox1<br />

UWAGA: Z podobn> obs!ug> mamy do czynienia w przypadku Pop-up Menu.<br />

Temat 54<br />

Interfejs graficzny – Slide<br />

Po!o$enie suwaka okre7lone jest liczb> z przedzia!u od 0.0 do 1.0.<br />

Przyk!ad:<br />

function slider1_Callback(hObject, eventdata, handles)<br />

polozenie = get(handles.slider1, ‘Value’); % pobranie informacji o po>oLeniu suwaka<br />

25


Temat 55<br />

Interfejs graficzny – Axes<br />

Za!ó$my, $e w oknie interfejsu graficznego mamy 2 elementu. Przycisk (PushButton) i<br />

Wykres (Axes). Naci7nicie przycisku powoduje wy7wietlenie na wykresie okrgu.<br />

Przyk!ad:<br />

function przycisk_Callback(hObject, eventdata, handles)<br />

t=0:0.01:2*pi; x=cos(t); y=sin(t); % dane do wykresu<br />

axes(handles.wykres) % pobranie uchwytu do wykresu<br />

plot(x,y,’r’) % wyrysowanie ko>a<br />

Temat 56<br />

Okna do wprowadzania danych – funkcja inputdlg<br />

Prost> metod> zrobienia prostego interfejsu do wprowadzania danych jest skorzystanie z<br />

funkcji inputdlg.<br />

Przyk!ad:<br />

pyt{1} = ’Zmienna X:’; % Tekst przy polu do wprowadzenia zmiennej 1<br />

pyt{2} = ’Zmienna Y:’; % Tekst przy polu do wprowadzenia zmiennej 2<br />

tytul = ‘Moje Okno’; % nazwa okna<br />

odp = {‘5’,’7’}; % opcjonalne warto-ci domy-lne<br />

wynik = inputdlg(pyt, tytul, 1, odp); % wywo>anie okna dialogowego<br />

26


ZLONONE STRUKTURY DANYCH<br />

Temat 57<br />

Struktury<br />

Struktury w Matlabie s!u$> do przechowywania danych ró$nych typów i ró$nych wielko7ci w<br />

obrbie jednej macierzy. Jest to zbiór takich samych rekordów.<br />

Przyk!ad definiowania struktury danych typu student:<br />

>> student(1).nazwisko = ‘Abacki’;<br />

>> student(1).wiek = ‘20’;<br />

>> student(1).dane = rand(3);<br />

>> student(2).nazwisko = ‘Babacki’;<br />

>> student(2).wiek = ‘22’;<br />

>> student(2).dane = randn(3);<br />

Temat 58<br />

Definiowania struktury przy wykorzystaniu funkcji struct<br />

Do definiowania danych zorganizowanych w struktur wykorzystujemy funkcj struct.<br />

Przyk!ad:<br />

>> student = struct(‘nazwisko’,{‘Abacki’,’Babcki’},…<br />

‘wiek’,{20,22},…<br />

‘dane’,{rand(3),randn(3)});<br />

Takie definiowanie struktury daje mo$liwo7G wcze7niejszej alokacji pamici co wp!ywa na<br />

szybko7G wykonywania operacji:<br />

>> student = repmat(struct('nazwisko',{''},'wiek',{''},'dane',{''}),10,1);<br />

% alokacja pami4ci dla 10 studentów<br />

UWAGA: Funkcja repmat s!u$y do powielania elementów.<br />

Temat 59<br />

Wy)wietlanie danych ze struktury<br />

Ze wzgldu na fakt, $e w pojedynczej strukturze mog> byG zapisane elementy o ró$nym<br />

stopniu zag!bienia, do wy7wietlania poszczególnych danych wykorzystuje si ró$n><br />

sk!adni.<br />

Przyk!ad:<br />

>> student % Nazwa struktury. Wy-wietlenie nazw pól<br />

>> student(1) % Wy-wietlenie danych dla danego rekordu<br />

>> student(2).wiek % Wy-wietlenie konkretnej danej<br />

>> celldisp(student) % Wy-wietlenie ca>o-ci danych dla struktury student<br />

27


Temat 60<br />

Macierz komórek – cell array<br />

G!ówna ró$nica midzy struktur> a macierz> komórek jest fakt, $e w macierzy komórek<br />

odwo!ujemy si do poszczególnych elementów za pomoc> adresu a nie za pomoc> nazwy<br />

elementu.<br />

Macierz komórek mo$na rozumieG jako macierz, gdzie ka$dy element macierzy mo$e byG<br />

inn> macierz>, zmienn> lub struktur>.<br />

Przyk!ad:<br />

>> A = {1:5, pi; rand(3), ‘tekst’}<br />

A =<br />

[1x5 double] [3.1416]<br />

[3x3 double] 'tekst'<br />

Temat 61<br />

Definiowania macierzy komórek przy wykorzystaniu funkcji cell.<br />

Przyk!ad:<br />

>> a = cell(2,2); % definicja macierzy komórek o rozmiarze 2x2 z pustymi komórkami<br />

Takie definiowanie macierzy komórek daje mo$liwo7G wcze7niejszej alokacji pamici, co<br />

wp!ywa na szybko7G wykonywania operacji.<br />

Temat 62<br />

Wy)wietlanie danych z macierzy komórek.<br />

Wy7wietlanie danych z macierzy komórek jest podobne jak przy wy7wietlaniu elementów<br />

zwyk!ej macierzy z t> ró$nic>, $e teraz korzystamy z nawiasów { }.<br />

Przyk!ad:<br />

>> a{1,1} % Wy-wietlenie pojedynczego elementu<br />

>> a{2,:} % Wy-wietlenie kolumny elementów<br />

>> celldisp(a) % Wy-wietlenie ca>o-ci danych<br />

>> cellplot(a) % Graficzne przedstawienie danych<br />

Temat 63<br />

Konwersja typów miCdzy struktur- a macierz- komórek<br />

Przyk!ad:<br />

struct2cell<br />

cell2struct<br />

zamiana struktur na macierz komórek<br />

zamiana macierz> komórek na struktur<br />

>> a = {1:5, pi; 1:10, 4*3}; % Zdefiniowanie macierzy komórek<br />

>> pola = {‘wektor’,’liczba’}; % zdefiniowanie nazwy pól<br />

>> cell2struct(a,pola,2); % Zamiana macierzy komórek na struktur4<br />

28


PROGRAMOWANIE ZORIENTOWANE OBIEKTOWO<br />

Temat 64<br />

Definiowanie klas - konstruktor<br />

Konstruktor danej klasy musi byG umieszczony w funkcji o nazwie nazwa_klasy.m. Musi si<br />

on znajdowaG w osobnym folderze o nazwie @nazwa_klasy. W folderze tym musz> te$<br />

znajdowaG si wszystkie metody (funkcje i operatory) dzia!aj>ce na elementach danej klasy.<br />

Dostp do klasy maj> tylko te funkcje.<br />

Zadaniem konstruktora jest: sprawdzenie czy przy wywo!aniu konstruktora dane s> warto7ci<br />

pól obiektu i je7li nie to stworzenie obiektu pustego, sprawdzenie czy dane s> obiektem danej<br />

klasy, lub wstawienie domy7lnych parametrów do pól tworzonego obiektu.<br />

Przyk!ad:<br />

function c=czlowiek(dane)<br />

% konstruktor cz>owiek.m dla klasy obiektów ‘czlowiek’<br />

% zapisane w katalogu @czlowiek<br />

if nargin==0 % brak parametrów wywo>ania<br />

c.imie = [ ];<br />

c.plec = [ ];<br />

c.wiek = [ ];<br />

c = class(c,’czlowiek’); % utworzenie pustego obiektu ‘cz>owiek’<br />

elseif isa(dane,’czlowiek’) % funkcja isa sprawdza czy dana naleLy do klasy czlowiek<br />

c = dane; % dane wej-ciowe s/ obiektem typu ‘czlowiek’<br />

else<br />

c.imie = dane(1);<br />

c.plec = dane(2);<br />

c.wiek = dane(3);<br />

c = class(c,’czlowiek’); % tworzony obiekt ‘czlowiek’ z polami wype>nionymi danymi ‘dane’<br />

end<br />

Temat 65<br />

Tworzenie obiektu<br />

>> Jacek = cz>owiek({‘Jacek’,’m’,26});<br />

Temat 66<br />

Hermetyzowanie danych<br />

Dostp do danych w polach obiektu i mo$liwo7ci operowania nimi maj> tylko wy!>cznie<br />

metody danej klasy.<br />

Do wy7wietlenia nazwy pól obiektu wykorzystuje si funkcj fieldnames.<br />

Przyk!ad:<br />

>> fieldnames(Jacek) % wy-wietli nazwy pól obiektu Jacek<br />

>> Jacek.plec % BefD, brak dost4pu do danych<br />

29


Temat 67<br />

Metody obs!ugi obiektów<br />

Zadaniem metody emeryt jest sprawdzenie czy dany cz!owiek jest w wieku emerytalnym.<br />

Metoda musi byG zapisana w tym samym katalogu, co konstruktor czyli @czlowiek.<br />

function emeryt(czlowiek)<br />

p = czlowiek.plec;<br />

w = czlowiek.wiek;<br />

if p==’m’<br />

if w>=65<br />

display(‘EMERYT’)<br />

else<br />

display(‘NIE EMERYT’)<br />

else<br />

if w>=60<br />

display(‘EMERYT’)<br />

else<br />

display(‘NIE EMERYT’)<br />

end<br />

>> Anna = cz>owiek({‘Anna’,’k’,54}); % utworzenie obiektu<br />

>> emeryt(Anna) % wywo>ania funkcji emeryt<br />

Temat 68<br />

Przeci-Oanie funkcji i operatorów<br />

Warunkiem przeci>$enia operatora lub funkcji jest dostp do folderów klas, dla których je<br />

definiujemy. Ka$dy operator obs!ugiwany jest przez odpowiedni> funkcj. Np. dodawanie +<br />

wykonywane jest przez funkcj plus. Przeci>$enie operatora polega na zdefiniowaniu jak<br />

dany operator ma dzia!aG dla obiektów, które zdefiniowali7my.<br />

Przyk!ad:<br />

function w=gt(a,b)<br />

% przeci/Lenie operatora gt(a,b) odpowiednik a>b<br />

% porównuje wiek 2 obiektów klasy ‘czlowiek’<br />

p = a.wiek - b.wiek;<br />

if p >= 0<br />

w = 1;<br />

else<br />

w = 0;<br />

end;<br />

30


Temat 69<br />

Dziedziczenie klas obiektów<br />

W programowaniu obiektowym mo$na tworzyG hierarchi klas. Na podstawie jednych klas<br />

tworzyG nowe klasy o np. bardziej zaw$onym charakterze.<br />

Przyk!ad:<br />

function s=student(dane)<br />

% klasa ‘student’ jest potomkiem klasy ‘czlowiek’<br />

if nargin==0 % brak parametrów wywo>ania<br />

c=cz>owiek;<br />

o.ocena = [ ];<br />

s = class(o,’student’,c); % utworzenie pustego obiektu ‘student’<br />

elseif isa(dane,’student’) % sprawdzenie czy zmienna dana naleLy do klasy ‘student’<br />

s = dane; % dane wej-ciowe s/ obiektem typu ‘student’<br />

else<br />

c = czlowiek({dane(1), dane(2), dane(3)});<br />

o.ocena = dane(4);<br />

s = class(o,’student’,c); % tworzony obiekt ‘student’ z polami wype>nionymi danymi ‘dane’<br />

end<br />

31


OBLICZENIA SYMBOLICZNE W <strong>MATLAB</strong>IE<br />

Temat 70<br />

Definiowanie danych symbolicznych – funkcja sym.<br />

Do definiowania zmiennych lub sta!ych symbolicznych s!u$> funkcje sym i syms.<br />

Przyk!ady:<br />

>> x = sym(‘x’); % definicja zmiennej x<br />

>> a = sym(‘5’); % definicja sta>ej a=5<br />

>> rho = sym('(1+sqrt(5))/2'); % definicja zmiennej symbolicznej okre-laj/cej z>oty -rodek<br />

>> syms y z % definicja dwu zmiennych y, z<br />

Uwaga: Wszystkie zmienne, wykorzystywane w obliczeniach symbolicznych musz> byG<br />

wcze7niej zdefiniowane.<br />

Temat 71<br />

Symboliczne rozwi-zywanie równa% i uk!adów równa% – funkcja solve<br />

Symboliczne rozwi>zywanie równa: mo$liwe jest dziki wykorzystaniu funkcji solve(). Dla<br />

przyk!adu rozwi>zania równania kwadratowego szukamy w nastpuj>cy sposób:<br />

>> x = sym(‘x’); % zdefiniowanie zmiennej symbolicznej<br />

>> y = solve(‘a*x^2+b*x+c=0’); % x jest domy-ln/ zmienn/<br />

Funkcj solve mo$na równie$ wywo!ywaG w inny sposób:<br />

>> y = solve(‘a*x^2+b*x+c’,x); % równowaLne poprzedniemu wywo>aniu, podana zmienna x<br />

>> y = solve(‘a*x^2+b*x+c’); % domy-lnie przyj4te, Le lewa strona równania równa si4 0<br />

Podobnie postpujemy przy uk!adach równa: gdzie kolejne równania wpisujemy rozdzielone<br />

przecinkami.<br />

Przyk!ad:<br />

>> syms x y % zdefiniowanie 2 zmiennych symbolicznych<br />

>> [x,y] = solve(‘x^2+y^2=1’,’x+2*y=2’); % rozwi/zanie. Wynik w postaci 2 wektorów<br />

>> s = solve(‘x^2+y^2=1’,’x+2*y=2’); % rozwi/zanie. Wynik w postaci struktury z 2 wektorami<br />

Temat 72<br />

Upraszczanie wyraOe% symbolicznych – funkcja simplify()<br />

Czsto wynik operacji symbolicznych jest trudny do interpretacji. Uproszczenie wyniku<br />

uzyskujemy dziki zastosowaniu funkcji simplify.<br />

Przyk!ad:<br />

>> simplify(exp(x)*exp(y)) % =exp(x+y)<br />

32


Temat 73<br />

Zmiana postaci wyraOenia symbolicznego<br />

W zale$no7ci od zastosowa: wiele wyra$e: matematycznych mo$na przedstawiG w ró$nych<br />

formach. Matlab oferuje kilka funkcji, których zadaniem jest takie przedstawienie wyniku,<br />

aby spe!nia!o nasze kryteria:<br />

collect<br />

expand<br />

horner<br />

factor<br />

postaG wielomianowa, grupowanie zmiennych<br />

rozwija mno$enia i sumowania<br />

postaG zag!bionych iloczynów<br />

wielomiany w postaci iloczynowej<br />

Temat 74<br />

Inne moOliwe przedstawienia wyniku – funkcja simple()<br />

W przypadku, gdy nie mo$emy si zdecydowaG, które przedstawienie jest najodpowiedniejsze<br />

do naszych celów wygodnym mo$e byG wykorzystanie funkcji simple(), która dane wyra$enie<br />

matematyczne wypisuje we wszystkich mo$liwych formach.<br />

Temat 75<br />

Warto)ci liczbowe w obliczeniach symbolicznych – funkcja subs()<br />

Gdy znamy warto7ci liczbowe poszczególnych zmiennych wynik liczbowy oblicze:<br />

symbolicznych uzyskujemy dziki funkcji subs.<br />

Przyk!ad:<br />

>> syms a b c x % definicja 4 zmiennych symbolicznych<br />

>> y = solve(a*x^2+b*x+c); % rozwi/zanie równania wzgl4dem zmiennej x<br />

>> a=3; b=2; c=1; % Przypisanie warto-ci liczbowych<br />

>> w = subs(y) % Warto-: liczbowa y<br />

Uwaga: Je7li wynik oblicze: jest ju$ liczb> ale przedstawion> w ma!o zrozumia!ej formie w<br />

celu uzyskania jej warto7ci liczbowej wystarczy napisaG: double(x).<br />

Funkcja subs() wykorzystywana jest te$ do zamiany jednego wyra$enia na inne.<br />

Przyk!ad:<br />

>> syms a b x % definicja 3 zmiennych symbolicznych<br />

>> subs(a+b,{a,b},{sin(x),exp(x)}) % = sin(x)+exp(x)<br />

Temat 76<br />

Zmiana wygl-du wy)wietlanych wyników – funkcja pretty()<br />

Wyniki uzyskiwane w Matlabie, nawet po uproszczeniach dziki ró$nym funkcjom czsto s><br />

trudne w odbiorze. Aby wy7wietliG bardziej skomplikowane wyra$enia w formie zbli$onej do<br />

tej jak zapisuje to cz!owiek Matlab oferuje funkcj pretty.<br />

Przyk!ad:<br />

>> a = sym('sin(x)/(2*cos(y))'); % definicja wyraLenia symbolicznego<br />

>> pretty(a) % wy-wietlenie w przyjaznej formie<br />

UWAGA: Funkcja ta ma swoje zastosowanie zarówno do wyra$e: jak i do macierzy.<br />

33


Temat 77<br />

RóOniczkowanie symboliczne – funkcja diff<br />

Do ró$niczkowania symbolicznego wykorzystujemy funkcj diff(funkcja, rz>d), przy, czym<br />

rz>d pochodnej domy7lnie równa si 1.<br />

Przyk!ad:<br />

>> syms x n % definicja 2 zmiennych symbolicznych<br />

>> diff(x^n) % róLniczkowanie symboliczne<br />

Temat 78<br />

Pochodne cz-stkowe.<br />

W przypadku funkcji wielu zmiennych mo$liwe jest liczenie pochodnych cz>stkowych. W<br />

tym celu tak$e korzystamy z funkcji diff() z wywo!aniem: diff(funkcja, zmienna)<br />

Przyk!ad:<br />

>> syms s t % definicja 2 zmiennych symbolicznych<br />

>> f = sin(s*t); % definicja funkcji 2 zmiennych<br />

>> diff(f,t) % pochodna funkcji po zmiennej t<br />

Temat 79<br />

Ca!kowanie symboliczne – funkcja int()<br />

W Matlabie mo$na ca!kowaG zarówno ca!ki oznaczone jak i nieoznaczone. W przypadku<br />

ca!ki nieoznaczonej stosujemy wywo!anie funkcji w postaci: int(funkcja)<br />

W przypadku ca!ki oznaczonej wywo!anie ma nastpuj>c> postaG: int(funkcja, dolne<br />

ograniczenie, górne ograniczenie).<br />

Przyk!ad:<br />

>> int(‘x’); % ca>ko nieoznaczona<br />

>> int(‘sqrt(tan(x))’,0,1); % ca>ka oznaczona<br />

34


Temat 80<br />

Symboliczne rozwi-zywanie równa% róOniczkowych – funkcja dsolve()<br />

Równania ró$niczkowe dowolnego rzdu rozwi>zujemy przy wykorzystaniu funkcji dsolve,<br />

której u$ycie jest podobne do u$ycia funkcji solve. Szczególne znaczenie w symbolicznym<br />

rozwi>zywaniu równa: ró$niczkowych ma zmienna D (du$e D), która okre7la ró$niczk<br />

pierwszego stopnia, i podobnie D2 to ró$niczka stopnia drugiego, itd.<br />

Przyk!ad:<br />

>> dsolve('Dy = a*x'); % róLniczka pierwszego stopnia<br />

W przypadku uk!adu równa:, kolejne równania oddzielamy przecinkami. Podobnie warunki<br />

brzegowe, podajemy po wszystkich równaniach, tak$e oddzielone przecinkami:<br />

dsolve(równanie 1, równanie 2, …, warunek 1, warunek 2, …)<br />

Przyk!ad:<br />

>> dsolve('D2y = -a^2*y', 'y(0) = 1', 'Dy(pi/a) = 0'); % róLniczka stopnia drugiego z warunkami<br />

brzegowymi<br />

Temat 81<br />

Inne funkcje Matlaba wykorzystywane do oblicze% symbolicznych<br />

limit<br />

taylor<br />

jacobian<br />

symsum<br />

granica<br />

szeregiTtaylora<br />

macierz Jacobiego<br />

sumowanie szeregów<br />

Temat 82<br />

Symboliczne odpowiedniki funkcji Matlaba<br />

Cz7G funkcji Matlaba wykorzystywana w obliczeniach numerycznych ma swe odpowiedniki<br />

symboliczne. Do najwa$niejszych nale$>:<br />

diag<br />

inv<br />

det<br />

eig<br />

expm<br />

macierz diagonalna<br />

macierz odwrotna<br />

wyznacznik macierzy<br />

warto7ci w!asne<br />

potgowanie macierzy<br />

Temat 83<br />

Obliczenia o zmiennej precyzji – funkcja vpa<br />

W przypadku gdy interesuje nas warto7G liczbowa z dok!adno7ci> wiksz> ni$ oferuje<br />

zmienna double mo$emy podaG ile cyfr znacz>cych danej zmiennej ma byG wy7wietlanych:<br />

vpa(zmienna, ilo7G cyfr);<br />

Przyk!ad:<br />

>> vpa(pi,50) % wypisuje 50 cyfr znacz/cych liczby pi<br />

35


WSPÓLPRACA <strong>MATLAB</strong>A Z INNYMI<br />

YRODOWISKAMI PROGRAMISTYCZNYMI<br />

Temat 84<br />

Kompilator<br />

Zadaniem kompilatora Matlaba jest zamiana funkcji zapisanej w pliku typu M-file na wersj<br />

wykonywaln>, bibliotek MEX plik lub kod programu w C czy C++.<br />

Kompilator generuje kilka rodzajów plików:<br />

- kod w jzyku C do budowania plików typu MEX<br />

- kod w jzyku C lub C++<br />

- wykonywaln> aplikacj><br />

- biblioteki dynamiczne i statyczne<br />

Dziki wykorzystaniu kompilatora uzyskujemy przyspieszenie pracy aplikacji, ukrycie kodu<br />

przed innymi u$ytkownikami oraz mo$liwo7G budowy niezale$nych aplikacji.<br />

Temat 85<br />

Wywo!anie kompilatora – funkcja mcc<br />

Sk!adnia wywo!ania funkcji:<br />

mcc [-opcja] funkcja [funkcja2 …] [mex1 … mexN] [mlib1 … mlibN]<br />

Gdzie:<br />

W nawiasach kwadratowych umieszczone parametry opcjonalne,<br />

opcja – litery oznaczaj>ce ró$ne opcje kompilatora<br />

funkcja – nazwa funkcji poddawana kompilacji,<br />

max – nazwa pliku typu MEX<br />

mlib – nazwa biblioteki<br />

Najwa$niejsze opcje:<br />

-c Generuje kod C<br />

-p Generuje kod C++ oraz dzia!aj>c> aplikacj<br />

-x Generuje plik typu MEX<br />

-t Generuje kod w C lub w C++<br />

-T W zale$no7ci od opcji generuje ró$ne pliki:<br />

codegen<br />

compile:mex<br />

compile:exe<br />

compile:lib<br />

link:mex<br />

link:exe<br />

link:lib<br />

Przyk!ad:<br />

>> mcc –x funkcja % generuje plik typu MEX na podstawie pliku funkcja.m<br />

>> mcc –m funkcja % generuje wykonywaln/ aplikacj4 na podstawie pliku funkcja.m<br />

>> mcc –p funkcja % generuje kod w C++ i wykonywaln/ aplikacj4<br />

>> mcc –t –L C % generuje kod w C na podstawie pliku funkcja.m<br />

>> mcc –t –L Cpp % generuje kod w C++ na podstawie pliku funkcja.m<br />

>> mcc –m funkcja1 funkcja2 % generuje wykonywalne aplikacje na podstawie plików<br />

funkcja1.m oraz funkcja2.m<br />

>> mcc –T compile:exe funkcja % generuje wykonywaln/ aplikacj4<br />

>> mcc –t W lib:a –T link:lib a0 a1 % generuje bibliotek4 dynamiczn/ „a” na podstawie plików<br />

a0.m oraz a1.m<br />

36


Temat 86<br />

Ograniczenia uOycia funkcji kompilatora<br />

Kompilator pracuje tylko na funkcjach zapisanych w plikach typu M. Nie kompiluje<br />

skryptów.<br />

Kompilacji nie podlegaj> funkcje wykorzystuj>ce obiekty.<br />

Kompilacji nie podlegaj> funkcje korzystaj>ce z polece: input, eval je7li te dzia!aj> na<br />

zmiennych z workspace oraz operuj>ce na zmiennych globalnych.<br />

Uwaga: Kompilacji nie podlegaj> funkcje matlabowe, które nie maj> swojego pliku typu M.<br />

Temat 87<br />

Wspó!prace Matlaba z Excelem<br />

Do wczytania danych z programu Microsoft Excel wygodnie jest wykorzystaG okno importu<br />

danych dostpne z menu Matlaba.<br />

Do zapisania zmiennych z Matlaba w formie !atwej do otworzenia w Excelu nale$y<br />

skorzystaG z funkcji xlswrite.<br />

Przyk!ad:<br />

>> x=rand(5); % generacja przyk>adowej macierzy<br />

>> xlswrite(‘dane’,x) % zapisuje w pliku Excelowym dane.xls zmienn/ x<br />

37

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!