Wykład 2 1. Instrukcje sterujące 2. M-pliki: skrypty i funkcje. Przykłady skryptów.
Download
Report
Transcript Wykład 2 1. Instrukcje sterujące 2. M-pliki: skrypty i funkcje. Przykłady skryptów.
Wykład 2
1. Instrukcje sterujące
2. M-pliki: skrypty i funkcje. Przykłady skryptów. Globalność
zmiennych. Metody debuggowania.
3. Funkcje
a. Struktura funkcji
b. Zmienne nargin, nargout, zmienne lokalne, zmienne
globalne
c. Subfunkcje i funkcje prywatne.
d. Pseudokompilacje funkcji, usuwanie funkcji z pamięci
4. Przykłady funkcji
5. Kolejne funkcje własne Matlab’a
Przykład 1- life
C:\Matlab\toolbox\matlab\demos
PODSTAWOWE FUNKCJE I STAŁE
MATEMATYCZNE
Funkcja
opis
sin(z), cos(z), tan(z), cot(z)
Sinus, cosinus, tangens,
cotangens; argument funkcji
w radianach;
asin(z), acos(z), atan(z), acot(z)
Funkcje cyklometryczne;
wynik w radianach;
Funkcje hiperboliczne;
argument w radianach;
sinh(z), cosh(z), tanh(z), coth(z)
sqrt(z)
Pierwiastek z ; z<0 – wynik
zespolony;
exp(z)
ez
log(z)
ln(z); z<0 – wynik
zespolony;
log2(z)
log2z; z<0 – j.w.
abs(z)
wartość bezwzględna lub
e moduł liczby zespolonej;
z
angle(z)
argument liczby zespolonej;
real(z), imag(z)
część rzeczywista i urojona
liczby z
conj(z)
liczba zespolona sprzężona;
complex(x,y)
utworzenie liczby zespolonej;
ceil(z)
zaokrąglenie liczby w górę;
floor(z)
zaokrąglenie liczby w dół;
fix(z)
zaokrąglenie liczby dodatniej
w dół, ujemnej w górę;
round(z)
rem(x,y); mod(x,y)
zaokrąglenie do najbliższej
liczby całkowitej;
reszta z dzielenia x przez y;
sign(x)
funkcja signum;
FUNKCE OPERUJĄCE NA WEKTORACH
(na MACIERZACH podane wcześniej)
max(x)
największy element wektora x;
min(x)
najmniejszy element wektora x;
sum(x)
sumę elementów wektora x;
prod(x)
iloczyn elementów wektora x;
mean(x)
średnia arytmetyczna elementów
wektora x;
długość wektora
length(x)
1.
Kolejne funkcje własne Matlab’a
type – type mój %wyświetla zawartość skryptu moj
disp – wyświetla zmienną bez jej nazwy,
num2str – numeryczna -> string
disp(z), disp(‘obliczenia zakończone a=’); disp (a), greckie litery
nie działają.
pause – zatrzymuje wykonywanie m-pliku do wciśnięcia klawisza,
pause(n)- na n sekund, pause on, pause off, umożliwia lub
uniemożliwia ponowne wykorzystanie tej funkcji
input – podanie zmiennej input(‘podaj a, a=’) lub a= input(‘podaj a,
a=’)
error – komunikat błędu wewnątrz funkcji, przerwanie f-cji i
przekazanie sterowania do okna poleceń ... error(‘za mało
argumentów’)
menu – zwraca numer wyboru:
K = menu('Choose a color','Red','Blue','Green') (uwaga: istnieje
również funkcja uimenu w GUI)
keyboard – przerywa wykonywanie funkcji i wraca do okna
poleceń „>>K”. Po wpisaniu „return” wraca do funkcji.
plot - wykresy: plot (x,y) - najprostsze zastosowanie, gdzie np.
x=[…], y=funkcja([x])
clock – zwraca 6-elementowy wektor zawierający obecną datę i
czas w formie dziesiętnej c=clock => c=[rok, miesiąc, dzień,
godzina, minuty, sekundy]
find – znajduje indeksy elementów spełniających podany warunek
X=[ find(X~=0);
Przykład: Usuwanie elementów zerowych X=[9 0 5 0 4 3 0];
index=find(X~=0); nowy=X(index) =>[9 5 4 3 ];
size – rozmiar macierzy
all – czy wszystkie elementy wektora są niezerowe lub w
kolumnie macierzy,
isnan – czy liczba jest NaN => 0 lub 1 (0/0=>NaN)
isinf– czy liczba jest Inf => 0 lub 1
finite– czy liczba jest skończona
rem – reszta z dzielenia rem(6,4)=>2
roots – oblicza miejsca zerowe wielomianu.
Algorytm w oparciu o obliczenie wartości własnych macierzy
współczynników (patrz help)
przykład: s3-6s2-72s-27 p=[1 –6 –72 –27]; r=roots(p)
=>12.1229; –5.7345; –0.3884
prod – mnożenie elementów wektora lub elementów kolumn
macierzy
cross – cross(A x B) – iloczyn wektorowy
dot – iloczyn skalarny
eval , feval (przy łańcuchach znaków) !!!!!
>> R=input(‘co robic’,'s'); eval(R)
>> F = @foo, feval(F,9.64) foo(9.64)
INSTRUKCJE POMOCNICZE
error(‘tekst’) – opuszczenie programu
lasterr – zwraca ostatni komunikat o błędzie, często używana z
funkcją eval
try wyrażenie catch zrób_gdy_wyrażenie_niegramatyczne
end
- Obsługa błędu składni
return- opuszczenie danego skryptu lub funkcji, a następnie
powrót do wywołującego ją programu
warning (‘tekst’)- wyświetla tekst podobnie jak disp, ale może
tego uniknąć poprzez polecenie Warning off (Warning on).
Warning backtrace – wyświetla tekst podając dodatkowo
ścieżkę i nazwę pliku, skąd jest „warning”.
Instrukcje sterujące
IF
if n>0
…….. (instrukcje)
elseif n = = 0
…….. (instrukcje)
else
…….. (instrukcje)
end
Relacje i wyrażenia logiczne
Operatory porównania (przy instrukcji if ..):
A= =B
A~ =B
A<B
A<=B
A>B
A>=B
WHILE
while prod(1:n)<10^100
n=n+1
end
FOR
for i=1:n % i=[1:n]
x(i)=0
end
!!! przykład nieefektywnego programowania zeros(1:n)
SWITCH:
SWITCH zmienna
CASE wartość zmiennej,
polecenia
CASE {wartość1, wartość2,…}
polecenia
...
OTHERWISE,
polecenia
END
Uwaga: W przeciwieństwie do języka C Matlab wykonuje tylko
pierwszy pasujący przypadek i nie sprawdza pozostałych. Dlatego
nie jest używana instrukcja „break”
Przykład:
w=4; s=0.5; operator=’*’;
switch operator
case ‘+’
w=w+s;
case ‘{‘*’,’.*’}
w=w*s;
case ‘/’
w=w/s
otherwise
w=w-s;
end
Skrypty
Wywołanie skryptu poprzez nazwę. Zmienne skryptu są
przechowywane w pamięci jako zmienne globalne. Debuggowanie –
menu edytora Debug lub Breakpoints. Ewentualne wyświetlanie
wartości zmiennych (brak średnika).
Funkcja
Ciało funkcji:
function b=oblicz(x)
% pomoc (help) do uzyskania po poleceniu „help oblicz”
% j.w
(wolna linia)
% komentarz programisty
% chcemy uzyskać funkcję f(x)=sin(x2)/(x2-x)
b=sin(x.^2)./(x.^2-x); % średnik zapobiega podwójnemu wyświetleniu
wyniku
wywołanie:
>> oblicz(3)
>> u=oblicz([1,3,8,7])
Uwagi:
a) Bardzo ważna jest nazwa pliku, a nie nazwa f-cji
zadeklarowana wewnątrz pliku (nazwa funkcji do 31 znaków).
b) Funkcja lookfor rozpoznaje słowa tylko z I linii.
c) Wszystkie zmienne w funkcji są lokalne (zapominane po
wyjściu – sprawdzić na ćw.).
d) Nie można wewnątrz funkcji odwoływać się do zmiennych
zewnętrznych. Z (c) i (d) wynika, że można dublować nazwy
zmiennych
e) Funkcję można wywoływać rekurencyjnie, ale patrz (c).
Można zmienną zmienić na globalną. Należy wewnątrz
funkcji zadeklarować global nazwa_zmiennej. Wówczas
zmienna jest pamiętana w kolejnych wywołaniach funkcji, ale nie
jest pamiętana w przestrzeni roboczej i innych funkcjach lub
skryptach. Można to uzyskać deklarując global nazwa_zmiennej
również tam. Wówczas jest to sama zmienna.
clear global – usuwa wszystkie zmienne globalne.
Funkcja może mieć kilka argumentów wejściowych (input
arguments)
Ilość argumentów wejściowych może być zmienna
Funkcja może zwracać kilka argumentów wyjściowych
(output arguments) przykład: [X,Y]=fun2(3), gdzie X i Y mogą
być macierzami o innych wymiarach.
Funkcja ze zmienną globalną:
function nasza1(x)
global a;
b=a+x;
function nasza2(x)
global a;
b=a-x;
>> global a; a=7;
>>nasza1(4)*nasza2(3) =>11*4=44
Można teraz zmieniać zmienną a bezpośrednio z przestrzeni roboczej bez
konieczności edycji obu funkcji.
Funkcja zwracająca 2 wartości:
function [mean,stdev]=stat(x)
[m,n]=size(x)
if m= =1
m=n
end
mean=sum(x)/m
stdev=sqrt(sum(x.^2)/(m-mean)
wywołanie:
>> [M,S]=stat(rand(10,1000))
Funkcje o zmiennej ilości argumentów wej/wyjściowych
nargin (number of input arguments)
nargout (number of output arguments)
Przykład:
function y=wiele(x1,x2)
if nargin= = 1
x2=10;
end
y=sin(x1*x2);
>> wiele(pi,2) =>sin(2 pi)=0
>> wiele(pi/20) =>sin(pi/2)=1
nargout dotyczy sposobu wywołania funkcji w innej funkcji lub
oknie poleceń.
W przypadku kiedy w deklaracji funkcji nie chcemy określić
maksymalnej liczby argumentów wejściowych lub wyjściowych
można użyć funkcji:
varargin
varargaout
Przykład:
function wynik=zmienna2(varargin)
a=1;
z=varargin{2};
wynik=a+z;
>> zmienna2(2,6,11) =>7
Przestrzeń robocza funkcji:
Każda funkcja ma przydzieloną pamięć odseparowana od
przestrzeni roboczej Matlab’a. Dlatego funkcje operuja na
zmiennych lokalnych. Po wywołaniu funkcji Matlab przekształca
funkcję w pseudokod i zapamiętuje go, co przyspiesz
wykonywanie funkcji. Pseudokod można usunąć z pamięci
komputera poleceniem:
clear nazwa_funkcji
clear functions – usuwa wszystkie funkcje
clear all – usuwa wszystkie funkcje i zmienne
Pseudokompilacja funkcji
Do przyspieszenia działania dużych programów z rozbudowanym
GUI (lub ukrycia kodu). Uruchomienie funkcji z Matlab’a t.j mplik, ale nie można po kompilacji zmieniać nazwy pliku
zewnętrznie.
pcode nazwa_funkcji => p-plik
Powstaje plik nazwa_funkcji.p
Subfunkcje
M-pliki mogą zawierać kody więcej niż jednej funkcji.
Funkcja zapisana jako pierwsza jest funkcją główna i jej nazwa
pokrywa się z nazwą m-pliku.
Zmienne wszystkich funkcji z tego samego m-pliku są nadal
lokalne dla tych funkcji.
Subfunkcje mogą być wywołwane tylko przez funkcje z
tego samego m-pliku.
Przykład (Higham):
function max_err=poly1err(n)
% POLY1ERR(N) Błąd w interpolacji liniowej dowolnej funkcji
(p=a*x+c; a=(f1-f0)/(1-0); c=f0)
max_err=0;
f0=f(0); f1=f(1);
for x=linspace(0,1,n);
p=x*f1+(1-x)*f0;
err=abs(f(x)-p);
max_err=max(max_err,err);
end;
% Subfunkcja
function y=f(x)
% Function to be interpolated, F(x)
y=sin(x);
Ta sama funkcja z optymalnym wykorzystaniem
operacji wektorowych:
function max_err=poly2err(n)
f0=f(0); f1=f(1);
x=linspace(0,1,n);
p=x*f1-(x-1)*f0;
err=abs(f(x)-p);
max_err=max(err);
% Subfunkcja
function y=f(x)
% Function to be interpolated, F(x)
y=sin(x);
Przykład – funkcja PEAKS
Przykład – funkcja PEAKS
function [xz,y,z] = peaks(arg1,arg2);
%PEAKS A sample function of two variables.
% PEAKS is a function of two variables, obtained by translating and
% scaling Gaussian distributions, which is useful for demonstrating
% MESH, SURF, PCOLOR, CONTOUR, etc.
% There are several variants of the calling sequence:
%
%
Z = PEAKS;
Z = PEAKS(N); Z = PEAKS(V);
%
Z = PEAKS(X,Y); PEAKS;
PEAKS(N);
%
PEAKS(V);
[X,Y,Z] = PEAKS;
%
[X,Y,Z] = PEAKS(N);
PEAKS(X,Y);
[X,Y,Z] = PEAKS(V);
function [xz,y,z] = peaks(arg1,arg2);
if nargin = = 0
[x,y] = meshgrid(-3:dx:3);
elseif nargin = = 1
if length(arg1) = = 1
[x,y] = meshgrid(-3:6/(arg1-1):3);
% grafika3D
else
[x,y] = meshgrid(arg1,arg1); % grafika3D
end
else
x = arg1; y = arg2;
end
z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) - 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...
- 1/3*exp(-(x+1).^2 - y.^2);
if nargout > 1
xz = x;
elseif nargout = = 1
xz = z;
else
% Self demonstration
disp('z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ... ')
disp(' - 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ... ')
disp(' - 1/3*exp(-(x+1).^2 - y.^2) ')
surf(x,y,z)
% grafika3D
axis([min(min(x)) max(max(x)) min(min(y)) max(max(y)) ...
min(min(z)) max(max(z))])
xlabel('x'), ylabel('y'), title('Peaks')
end
ŚRODOWISKO MATLABA
• Okno poleceń. Funkcje obsługujące okno
poleceń.
lit
Powtórzenie ostatniego polecenia lub
ostatniego polecenia zaczynającego się od
„lit”
clc
wyczyszczenie okna poleceń i
umieszczenie kursora w jego lewym górnym
rogu;
home
umieszczenie wiersza poleceń i kursora w
lewym górnym rogu okna poleceń;
Ctrl+C
przerwanie obliczeń
echo on/echo off
włącza/wyłącza wysyłanie na ekran
treści wykonywanych poleceń;
more on/more off
włącza/wyłącza stronicowanie
tekstów wysyłanych na ekran;
diary plik
polecenia i teksty (bez grafiki)
wysyłane na ekran będą zapisywane
w pliku o podanej nazwie;
diary off/on
przełącznik funkcji diary
loose/compact
zmiana interlinii w wyświetlanym
tekście
• Formaty liczb. Do określenia sposobu wyświetlania liczb
rzeczywistych w oknie służy funkcja format. Użycie
funkcji nie ma wpływu na dokładność wykonywanych
obliczeń, a tylko na widok liczby na ekranie.
UWAGA: Przed każdym poleceniem dopisać format
Format
Opis
Wynik dla 1/23
short
5-cyfr.liczba stałopozycyjna
(format domyślny);
short e
5-cyfr.liczba zmiennopozycyjna; 4,3478e-002
long
15-cyfr.liczba stałopozycyjna;
0,0435
0,0347826086957
long e
short g
15-cyfr.liczba zmiennopozycyjna;
5 znaczących cyfr liczby stało- lub
zmiennopozycyjnej;
4,347826086956522e-002
long g
15 znaczących cyfr liczby stało- lub
zmiennopozycyjnej;
liczba szestnastkowa;
0,0434782608695652
drukuje znak + dla liczb dodatnich,dla ujemnych, spację dla zera;
format walutowy
przybliża liczbę ułamkami małych
liczb całkowitych;
+
hex
+
bank
rat
0,043478
3fa642c8590b2164
0,04
1/23
STAŁE MATEMATYCZNE
stałe
pi
przybliżenie wartości
eps
względna dokładność zmiennoprzecinkowa;
i lub j
Inf lub inf
NaN lub
nan
opis
pierwiastek z liczby –1;
nieskończoność (ang. Infinity); jest rezultatem
operacji, która przekracza zakres arytmetyki
komputera, np.dzielenie przez 0;
nie liczba; jest wynikiem matematycznie
niezdefiniowanych operacji;
Reprezentacja zmiennych i format
wyświetlania
zmienne typu "double precision", domyślnie wyświetla
4 miejsca po przecinku.
Zmiana formatu wyświetlania – "format"
a=13/3
a =
4.3333
format long
a
a =
4.33333333333333
format short – 4 miejsc (stało-przecinkowa) – domyślny
format – powrót do domyślnego
long – 15 (stało)
short e – 5
(zmienno-przecinkowa)
long e – 15 (zmienno)
rat – w postaci ułamka
format rat
a
a =
13/3
format
a
a =
4.3333
compact – pomijanie pustych linii przy wyświetlaniu
loose – wprowadzenie pustych linii przy wyświetlaniu
UWAGA NA NAZWY: Zmienne specjalne i stałe
realmax
realmin – najmniejsza liczba, która można dodać do 1 I otrzymać
większa od 1)
realmin
0/0
NaN
9/0
Inf
ans
beep
pi
eps
i lub j
nargin (ile we argumentów funkcji)
nargout (ile wy wartości funkcji)
Największa użytkowa dodatnia liczba całkowita
bitmax
varargin – zmienna ilość arg. we funkcji
varargout – zmienna ilość wartości wy funkcji
Przykład 1- life
C:\Matlab\toolbox\matlab\demos
n = [m 1:m-1];
e = [2:m 1];
s = [2:m 1];
w = [m 1:m-1];
while get(axHndl,'UserData')==play,
% How many of eight neighbors are alive.
N = X(n,:) + X(s,:) + X(:,e) + X(:,w) + ...
X(n,e) + X(n,w) + X(s,e) + X(s,w);