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 ' )