mokpm a
Transkrypt
mokpm a
MATERIAŁY DO LABORATORIUM Z MATEMATYKI OBLICZENIOWEJ I KOMPUTEROWYCH PAKIETÓW MATEMATYCZNYCH CZĘŚĆ A Prowadzący: dr A. Maciuk 1. Za pomocą programu Matlab (lub GNU Octave) utworzyć (czysty) m-plik i przekopiować do niego następujący kod. X=0:.01:3*pi; hold on plot(x,x.*sin(2*x),’r’) plot(x,x,’pb’,x,-x,’om’) hold of Następnie zapisać ten plik (nazywając go np. xsin.m) i w programie MATLAB (lub GNU OCTAVE) wpisać jako komendę nazwę pliku (czyli np. xsin – bez końcówki .m). Zmodyfikować ten m-plik tak, aby wykres zawierał inny, większy przedział. Korzystając z zakładki z górnego paska menu File/Open sprawdzić gdzie został zapisany utworzony m-plik. Za pomocą zakładki File/Seth Path… sprawdzić w jakich katalogach program MATLAB wyszukuje polecenia, oraz dodać do ścieżki przeszukiwania inny katalog. 2. Za pomocą programu MATLAB (lub GNU Octave) utworzyć m-plik zawierający następujący kod. Ważne: m-plik z funkcją musi mieć tą samą nazwę co funkcja. Przetestować działanie tej funkcji, np. za pomocą komend srednia(magic(3)) oraz help srednia. Zmodyfikować treść wyświetlanej pomocy np. przez zamieszczenie innego przykładu. function x = srednia(A) %srednia liczy średnią arytmetyczną z elementów macierzy % Przykład: srednia([2 1;-2 0]) -> 0.25 y=A(:); x=sum(y)/length(y); end 3. Komendy programu MATLAB takie jak fuction, for, if czy while nie będą działać bez wskazania „ich końca” za pomocą słowa end (w programie GNU OCTAVE zakończenie komendy function zaznacza się wpisując endfunction, komendę for wpisując endfor, itd.). Poniższy kod zawiera pewien formalny błąd uniemożliwiający jego poprawne działanie. function y = plusminus(X) % A=X(:); n=length(A); plus=0; minus=0; for i=1:n if A(i)>0 plus=plus+A(i); else minus=minus+A(i); end end y=[plus,minus]; end end Przed uruchomieniem odpowiedniego skryptu znaleźć ten błąd i go wyeliminować oraz przewidzieć efekt wykonania w programie MATLAB komendy plusminus([1,-2,3,-2,2]). Następnie uruchomić odpowiedni m-plik (uruchamiając w programie GNU OCTAVE słowa end trzeba zmienić na endif, endfor, endfunction). Jaką rolę w tym skrypcie pełnią średniki? Zmodyfikować plik poprzez usunięcie średnika w różnych miejscach i sprawdzić działanie tak zmodyfikowanej funkcji. Jak zmieni się działanie tej funkcji jeśli fragment for i=1:n zastąpimy kodem for i=n:-1:1? 4. Utworzyć funkcję (wykorzystując np. rozwiązania z poprzedniego zadania i instrukcję mod(i,2)) która oblicza sumę osobno wyrazów o parzystym i nieparzystym indeksie. ଵ 5. Moment próbkowy zbioru = {ଵ , ଶ , … , } rzędu k oblicza się według wzoru = ∑ୀଵ . Utworzyć plik moment.m zawierający poniższy kod, następnie uzupełnić go (w miejscach oznaczonych znakiem …) wykorzystując rozwiązania analogiczne do rozwiązań zastosowanych w z zadaniu 2 tak, aby funkcja moment(X,k) obliczała moment próbkowy rzędu k (gdzie > 0) dla zbioru utworzonego z elementów macierzy X. Przetestować działanie tej funkcji wykonując komendy takie jak: moment([2 1;1 0],2), moment([1 2 3]), moment([1 2 3],-2) oraz moment(). function Y = moment(X,k) % … if nargin<1 disp('brak argumentów'); return; elseif nargin==1 k=1; end if k<=0 disp('moment ma być dodatni'); else y=A(:); x=sum(y.^k)/…; … end 6. Utworzyć funkcję mediana(X) w pliku mediana.m obliczającą medianę zbioru wg. algorytmu: 1. Sprawdzić, czy został określony zbiór X, jeśli nie wyświetlić komunikat o braku i zakończyć algorytm; 2. Posortować elementy zbioru X w kolejności rosnącej w postaci wektora Y. Za n podstawić liczbę elementów tego wektora; 3. Jeśli n jest liczbą nieparzystą za medianę zbioru przyjąć element zbioru Y o indeksie (n+1)/2, w przeciwnym razie za medianę przyjąć średnią arytmetyczną elementów zbioru Y o indeksach n/2 i n/2+1. 7. M-plik pierwiastki.m zawierający poniższy kod ma liczyć pierwiastki równania ଶ + + = 0. function [x1,x2] = pierwiastki(a,b,c) % % d=delta(a,b,c); if d>0 x1=(-b-sqrt(d))/(2*a); x2=(-b+sqrt(d))/(2*a); if nargout<2 [x1,x2] end elseif d==0 x1=-b/(2*a); if nargout<2 [x1,x1] end else disp('brak pierwiastków'); end end function d=delta(a,b,c) d=b^2-4*a*c; end Utworzyć odpowiedni m-plik i przetestować jego działanie pierwiastki(1,-2,0), [x1,x2]=pierwiastki(1,-2,0), przy pomocy poleceń takich jak pierwiastki(1,-4,4). Następnie uzupełnić opis oraz poprawić ten kod tak, aby jego nieodpowiednie wywołanie, takie jak pierwiastki(1,-3) informowało potencjalnego użytkownika jaki błąd popełnił. Uwaga: skrypt ten zawiera dwie funkcje: pierwiastki – to tak zwana funkcja nadrzędna, delta – funkcja podrzędna, czyli funkcja wykorzystywana przez funkcję nadrzędną. 8. Następująca funkcja sprawdza, czy dana macierz jest macierzą dodatnio określoną. function c = czydodatnia(A) %czydodatnia bada czy dana macierz jest macierzą dodatnio określoną % czydodatnia(A) A jest macierzą dodatnookreśloną->1 nie jest->0 % czydodatnia([2,1;1,3]) ans=1 [n,m]=size(A); if n~=m disp('macierz nie jest macierzą kwadratową'); else if ~isequal(A,A') disp('macierz nie jest symetryczna') else t=zeros(1,n); for i=1:n t(i)=det(A(1:i,1:i)); end c=all(t>0); end end end Wykorzystując powyższe rozwiązania utworzyć m-plik zawierający funkcję nadrzędną okreslonosc(A) i funkcję podrzędną czydodatnia(A) dającą trzy możliwe odpowiedzi: 1 – jeśli macierz A jest macierzą dodatnio określoną, -1 jeśli macierz –A jest macierzą dodatnio określoną (czyli równoważnie gdy A jest macierzą ujemnie określoną) i 0 w pozostałych przypadkach. 9. Ciąg określony iteracyjnie ଵ = i = (/ିଵ + ିଵ )/2 jest zbieżny do √, dla dowolnej dodatniej liczby . Zależność tą wykorzystuje poniższy kod. function [b,n] = pierwiastek(a) % pierwiastek(a) liczy iteracyjnie pierwiastek z liczby dodatniej a % np [x,n]=pierwiastek(8) x-> pierwiastek z a, n-> liczba iteracji if nargin<1 disp('brak paramatrów'); else if a<=0 disp('argument musi być dodatni'); else b=1; epsilon=.1;n=0; while epsilon>.001 b=(a/b+b)/2 n=n+1 epsilon=abs(b^2-a) end end end a) Stworzyć odpowiedni m-plik i przetestować jego działanie za pomocą komend takich jak pierwiastek(8), [a,b]=pierwiastek(81) i [a1,a2]=pierwiastek(.0001) oraz help pierwiastek. Poprawić ten kod w ten sposób, żeby nie wyświetlały się zbyteczne wartości. b) Obliczenia są dokonywane z dokładnością do „trzech miejsc po przecinku”. Za pomocą konstrukcji function [b,n] = pierwiastek(a,c) oraz if c<=0 c=3; else (…) end i while epsilon>10^-c zmodyfikować kod tej funkcji tak, aby móc zadać dowolnie bliską zeru dokładność. Następnie przeprowadzić analizę zależności liczby potrzebnych iteracji od precyzji obliczeń i wielkości pierwiastkowanej liczby. Dla wartości bliskich zeru funkcja oparta na tym kodzie daje rezultaty o wiele gorsze niż dla wartości dużych czy bardzo dużych (sprawdzić). Jaka jest tego przyczyna? PRZYDATNE POLECENIA disp('tekst') wyświetla tekst, disp(X) wyświetla wartość zmiennej X isequal(A,B,C) porównuje czy dane macierze są sobie równe nargin określa ile jest zmiennych wejściowych, nargout określa ile ma być zmiennych wyjściowych sort(X) sortuje wektor/kolumny macierzy X od elementu najmniejszego do największego break polecenie wyjścia z pętli, return polecenie wyjscia/zakończenia procedury Jako uzupełnienie i utrwalenie tego materiału zapoznać się z podrozdziałami strony internetowej wskazanej w linku poświęconym instrukcjom sterującym i definiowaniu funkcji. http://el.us.edu.pl/ekonofizyka/index.php/Programowanie_Środ_Matlab W szczególności: 10. Przekopiować do osobnego m-pliku i przestudiować działanie kodu zaczynającego się od polecenia disp('ILOCZYN LICZB NATURALNYCH - SAMOUCZEK ' )