4. Tworzenie plików funkcyjnych
Plik typu funkcyjnego pełni rolę funkcji o zadawanych wartościach parametrów wejściowych w momencie wywołania.
Zmienne
występujące wewnątrz pliku funkcyjnego mają charakter lokalny i nie są dostępne w obszarze roboczym poza tym plikiem.
Jeżeli zmienne mają być użyte poza funkcją, to należy je zadeklarować jako globalne za pomocą polecenia global wszędzie tam gdzie będą używane.
Plik funkcyjny w Matlabie ma następującą strukturę:
• linia definiująca funkcję,
• pierwsza linia pomocy H1,
• tekst pomocy w postaci komentarza,
• ciało funkcji w postaci poleceń i instrukcji wraz z komentarzami.
Linia
definiująca zawiera następujące elementy:
• słowo kluczowe function ,
• argumenty wyjściowe rozdzielone przecinkami i ujęte w nawiasy kwadratowe,
• nazwa funkcji,
• argumenty wejściowe w nawiasach zwykłych.
Przykładowo
function [y1,y2,...] = nazwa_funkcji(x1, x2, ...) Jeżeli funkcja posiada jeden argument wyjściowy, wówczas nie występuje on w nawiasach kwadratowych, np.
function r = roots(c)
Jeżeli funkcja nie zwraca żadnych argumentów wyjściowych, to może być zapisana następująco
function nazwa_funkcji(arg_wej)
Funkcja może nie mieć zarówno argumentów wyjściowych jak i wejściowych function nazwa_funkcji
Nazwa funkcji podlega tym samym ograniczeniom, co nazwy zmiennych w danej wersji Matlaba, np. do 31 znaków. W wersji 4.2 Matlaba wskazane jest, aby nazwa
33
miała najwyżej 8 znaków i była taka sama jak nazwa pliku, w którym pamiętana jest ta funkcja. Ponadto nazwa powinna rozpoczynać się literą.
Jeżeli nazwa funkcji różni się od nazwy pliku, to "zwycięża" nazwa pliku, a wewnętrzna nazwa funkcji występująca po słowie function jest ignorowana.
Jeżeli nazwy funkcji powtórzą się, to Matlab wykona tę funkcję, którą znajdzie jako pierwszą.
Pierwsza linia pomocy H1 występuje bezpośrednio po linii definiującej funkcji.
Jest ona odszukiwana i wyświetlana po podaniu polecenia lookfor. Z tego powodu linia H1 powinna zawierać najważniejsze informacji o funkcji, najlepiej sposób wywołania, wymagane argumenty wejściowe, wyprowadzane zmienne.
Tekst pomocy obejmuje linie komentarza, aż do pierwszej wykonywalnej instrukcji.
Ciało funkcji to zasadnicza część funkcji wykonująca zadane obliczenia i przekazująca argumenty wyjściowe. W ciele funkcji mogą znajdować się wywołania innych funkcji, konstrukcje programowe realizujące operacje wejścia/wyjścia, obliczenia, komentarze, przypisania i linie puste.
Przykłady prostych funkcji
function [a,b] = wewy
% function [a,b] = wewy
% funkcja wewy czyta z klawiatury 2 liczby
% funkcja jest zapamietana w pliku wewy.m
a=input('podaj a = ');
b=input('podaj b = ');
disp('KONIEC funkcji wewy');
return
function y=srednia(x)
% function y=srednia(x)
% funkcja srednia jest zapamietana w pliku srednia.m
% funkcja oblicza srednia arytmetyczna elementow wektora x n=length(x); % liczba elementow wektora
y=sum(x)/n; % obliczanie sredniej arytmetycznej
return
Skrypt lub funkcja wykorzystująca funkcję srednia() musi być zapamiętany w innym pliku niż funkcja. Przykładowo może to być funkcja usrednij() zapamiętana w pliku usrednij.m.
W
żadnym przypadku w nazwie skryptów i funkcji nie wolno używać polskich ogonków. Musi być srednia zamiast średnia, usrednij zamiast uśrednij !
function sr = usrednij
% function sr = usrednij
% funkcja usrednij korzysta z funkcji srednia()
% funkcja usrednij czyta wektor a z pliku a.dat
% i oblicza srednia arytmetyczna
load a.dat; % czytanie wektora a z pliku tekstowego
disp(‘ Elementy wektora a’); disp(a);
sr=srednia(a); % obliczanie sredniej
return
Przykład funkcji obliczającej pierwiastki zespolone równania kwadratowego function [x1,x2] = rkw
% function [x1,x2] = rkw
% funkcja rkw oblicza pierwiastki rownania kwadratowego
% a*x^2+b*x+c=0
% przy czym
% - wspolczynniki a,b,c podawane sa z klawiatury
% - funkcja sprawdza czy oba rozwiazania sa zespolone
% - funkcja wyprowadza na ekran tylko pierwiastki zespolone
%
disp('Wprowadz kolejno wspolczynniki rownania kwadratowego'); a=input('Podaj a = ');
b=input('Podaj b = ');
c=input('Podaj c = ');
delta=b*b-4*a*c; % obliczanie wyroznika rownania kwadratowego if a~=0
if
delta>=0
disp('BRAK ROZWIAZAN ZESPOLONYCH');
else
disp('Oto pierwiastki zespolone rownania kwadratowego'); x1=(-b+sqrt(delta))/(2*a)
x2=(-b-sqrt(delta))/(2*a)
end
else
disp('Rownanie jest rownaniem liniowym');
disp('Wspolczynnik "a" musi byc rozny od zera'); disp('Sprobuj
ponownie');
end
disp('KONIEC OBLICZEN');
return
35
Zmienna liczba argumentów funkcji
Funkcje Matlaba posiadają własność, której często brakuje funkcjom w innych językach programowania. Funkcje Matlaba mogą być wywoływane ze zmienną liczbą argumentów. Umożliwia to zmienna nargin.
Funkcja Matlaba może też generować różną liczbę argumentów wyjściowych -
decyduje o tym zmienna nargout.
Zmienna
nargin użyta wewnątrz ciała funkcji zwraca liczbę argumentów wejściowych funkcji.
Polecenie
nargin('nazwa_funkcji') zwraca liczbę zadeklarowanych argumentów.
Przykład funkcji obliczania obwodu 3-fazowego niskiego napięcia Dany jest obwód prądu 3-fazowego niskiego napięcia jak na rys. 4.1. Należy obliczyć napięcia na zaciskach odbiornika.
EL1
IA
ZL1
UL1
EL2
I
ZL2
B
L2
NE
NZ
UL2
EL3
IC
ZL3
UL3
ZN
IN
UN
Rys. 4.1. Odbiornik 3-fazowy niesymetryczny zasilany z symetrycznego źródła napięcia
Jak wiadomo liczby zespolone można zapisać w jednej z równoważnych postaci z = a +jb
-
postać algebraiczna
z = z⋅ (cos(fi )+ j sin(fi) )
- postać trygonometryczna
z = z⋅ exp(j⋅ fi) -
postać wykładnicza
Sem
zasilające są symetryczne i w zapisie wykładniczym mogą być w Matlabie zapisane następująco
E = 400/sqrt(3);
j=sqrt(-1);
w=2*pi*50;
ea = E*sqrt(2)*exp(j*w*t);
eb = E*sqrt(2)*exp(j*(w*t – 2*pi/3) );
ec = E*sqrt(2)*exp(j*(w*t + 2*pi/3) );
Przyjmijmy,
że impedancja przewodu neutralnego wynosi
ZN = (0.1 + j0) ohm
. W pracy normalnej odbiornik ma taka samą impedancję w każdej fazie, np.
ZL1 = ZL2 = ZL3 = Zodb = (10+j20) ohm
i wówczas przewodem neutralnym nie płynie prąd.
Należy obliczyć prądy i napięcia w obwodzie w przypadku, gdy obciążenie zmieni się z symetrycznego na niesymetryczne
ZL1 = Zodb, ZL2 = 0.8 Zodb,
ZL3 = 0.5 real(Zodb)
Przyjmując węzeł odniesienia w punkcie neutralnym źródła NE otrzymujemy z metody potencjałów węzłowych
Y
E
+ Y E + Y E
L1
L1
L 2
L2
L3
L3
U
=
(4.1)
N
Y
+ Y + Y + Y
L1
L2
L3
N
gdzie
YL1 = 1/ZL1 ,
YL2 = 1/ZL2 ,
YL3 = 1/ZL3
Prądy i napięcia w obwodzie wynikają z praw Ohma i Kirchhoffa
UL1 = EL1 – UN
IL1 = YL1 UL1
UL2 = EL2 – UN
IL2 = YL2 UL2
UL3 = EL3 – UN
IL3 = YL3 UL3
Należy opracować funkcję o nazwie o3f.m /o3f - obwód 3-fazowy/ o następującym zakresie działania.
• Ustalenie wartości parametrów wejściowych funkcji: Esk – skuteczna wartość sem źródła, Zodb = Rodb + jXodb – impedancja zespolona odbiornika o wartości takiej samej dla każdej fazy, ZN=Zn – zespolona impedancją przewodu neutralnego.
37
• Zastosować oznaczania a=L1, b=L2, c=L3
• Wyznaczyć wartości parametrów wyjściowych funkcji: wektor napięć i prądów fazowych odbiornika.
• Obliczenia wykonać w jednostkach względnych odniesionych do wczytanych wartości Esk oraz abs(Zodb), czyli Up = Esk, Zp = abs(Zodb).
• Przedstawić wektory napięć i prądów fazowych odbiornika na wykresie.
function [U,I]= o3f(Esk,Zodb,Zn)
%[U,I]=o3f(Esk,Zodb,Zn) oblicza 3-fazowy obwod elektryczny
% skladajacy sie z:
% zrodla idealnego 3-fazowego
% niesymetrycznego odbiornika 3-fazowego
% przewodu neutralnego
%Dodatkowo za pomoca compass() rysowany jest wykres wektorowy:
% - napiec 3-fazowych odbiornika
% - pradow 3-fazowych odbiornika
%Funkcja compass(a,b) rysuje wektor o skladowych a,b
%Wywolanie compass(z) dla z=a+j*b oznacza compass(a,b) if nargin < 3
Zn=0.1; % domyslna wartosc impedancji przewodu neutralnego end
if nargin < 2
Zodb=10+20i; % domyslna wartosc impedancji odbioru
end
if nargin < 1
Esk=400/sqrt(3); % domyslna wartosc skuteczna sem zrodla end
j=sqrt(-1); % definicja operatora czesci urojonej
w=2*pi*50; % pulsacja pradu 3-fazowego
% jednostki podstawowe
Up=Esk; Zp=abs(Zodb); Ip=Up/Zp;
%
za=1+j*1; % obciazenie 100%
zb=0.8+j*0.8; % obciazenie 80%
zc=0.5; % obciazenie rezystancyjne 50%
zn=Zn/Zp;
% obliczenia pradow i napiec
Ea = sqrt(2);
Eb = sqrt(2)*exp(j*( -2*pi/3) )
Ec = sqrt(2)*exp(j*( 2*pi/3) )
ya=1/za; yb=1/zb; yc=1/zc;
yn=1/zn;
Un = (ya*Ea+yb*Eb+yc*Ec)/(ya+yb+yc+yn);
Ua=Ea-Un; Ub=Eb-Un; Uc=Ec-Un;
Ia=ya*Ua; Ib=yb*Ub; Ic=yc*Uc;
% wykresy wektorowe
U=[Ua Ub Uc]
compass(U), title('napiecia fazowe');
disp(' Dalej? Wcisnij ENTER'); pause;
I=[Ia Ib Ic]
compass(I), title('prady fazowe');
disp(' Dalej? Wcisnij ENTER'); pause;
disp('prady fazowe');
disp(' Ia, A '); Ia*Ip
disp(' Ib, A '); Ib*Ip
disp(' Ic, A '); Ic*Ip
disp('napiecia fazowe');
disp(' Ua, V '); Ua*Up
disp(' Ub, V '); Ub*Up
disp(' Uc, V '); Uc*Up
U=U*Up; % wartosci w V
I=I*Ip; % wartosci w A
disp('KONIEC funkcji []=o3f()');
return
Wynik działania funkcji o3f() pokazano na rys. 4.2 i 4.3
napiecia fazowe
90 1.5
120
60
1
150
30
0.5
180
0
210
330
240
300
270
Rys. 4.2. Wykres wektorowy napięć fazowych odbioru
39
prady fazowe
90 3
120
60
2
150
30
1
180
0
210
330
240
300
270
Rys. 4.3. Wykres wektorowy prądów fazowych odbioru
Aby
wkleić do dokumentu otrzymane wykresy wektorowe należy z menu File obiektu Figure wybrać opcję export. Następnie należy zapisać eksportowane rysunki pod własnymi nazwami z rozszerzeniem *.emf w wybranym katalogu, np. i.emf oraz u.emf. Po otwarciu dokumentu, w którym rysunki mają być wklejone należy znaleźć miejsce w tekście, w którym mają się pojawiać rysunki. Następnie wybrać opcję Wklej/ Rysunek/ Z pliku.
Zadania do samodzielnego rozwiązania
Zadanie 1
Dane jest równanie kwadratowe ax2+bx+c=0. Napisać funkcję [x1,x2]=rkw(a,b,c) wywoływaną ze zmienną liczbą argumentów,
• czytającą z klawiatury współczynniki (a), (a,b) lub (a,b,c) w zależności od liczby podanych parametrów wejściowych,
• sprawdzającą, czy wczytane współczynniki odnoszą się do równania liniowego, czy kwadratowego, /uwzględnić przypadek a=b=c=0/,
• wyprowadzającą na ekran wartości wyliczonych pierwiastków.
Zadanie 2
Wzorując się na funkcji o3f() napisać funkcję, która oblicza napięcia i prądy fazowe w obwodzie na rys. 4.1 w przypadku, gdy impedancje odbiornika są połączone w trójkąt.