MATLAB tworzenie własnych funkcji Definiowanie funkcji anonimowych Własne definicje funkcji możemy tworzyć bezpośrednio w Command Window, są to tzw. funkcje anonimowe; dla funkcji jednej zmiennej składnia jest następująca: nazwa=@(argument) wyrazenie; Przykład definicji wraz z wykorzystaniem funkcji: funk4 = @(x) sin(x) + 2*x; z=funk4(10); użycie funkcji dla pojedynczego argumentu y=funk4(x); użycie funkcji dla wektora plot(x,y) Jeżeli jako argumentem funkcji jest wektor, a funkcja zawiera mnożenie, dzielenie lub potęgowanie członów zawierających argument, przy operatorach powinniśmy pisać kropkę (operacja definiowana nie na tablicy jako całości, a na poszczególnych jej elementach), patrz poniżej: funk5 = @(x) x^2*sin(x); funk5(1) działa y=funk5(x); dla wektora NIE działa! funk6 = @(x) x.^2.*sin(x); funk6(1) działa y=funk6(x); dla wektora działa! y Mając zdefiniowaną jedną funkcję anonimową, możemy wykorzystać ją do zdefiniowania następnej: a=2; funk4 = @(x) sin(x) + a*x; funk41 = @(x) funk4(x)+100; funk4(10) funk41(10) Bez problemu możemy tworzyć funkcje większej liczby argumentów: funk7 = @(x,y) 100*x+y; funk7(1,2) for i=1:5
for j=1:5 Z(i,j)=funk7(i,j); Z Funkcje anonimowe wykorzystujemy tylko w oknie roboczym, możemy je usuwać poleceniem clear, po wyłączeniu Matlaba zostają zapomniane. Definiowanie funkcji plikowych Inny sposób definiowania funkcji to zapisywanie ich w m-plikach. Takie funkcje zostają zachowane po zakończeniu pracy Matlaba. Klikamy File potem New i wybieramy Function (albo od razu ikonkę białej strony z gwiazdką New Script). Otworzy się edytor; składnia prostej funkcji jest następująca: function zmienna=nazwa(argument) zmienna=wyrażenie; Użyta tu zmienna jest tylko parametrem do zdefiniowania wyniku. Plik należy zapisać, domyślna nazwa jest taka sama, jak nazwa funkcji + rozszerzenie.m. Przykład: function w=fp1(x) w=2*x.^2+10*sin(x); Plik zapisujemy jako fp1.m, od tej pory możemy korzystać z funkcji fp1(x): z=fp1(10); y=fp1(x); plot(x,y) użycie funkcji dla pojedynczego argumentu użycie funkcji dla wektora W powyższym przykładzie kropka przy operatorze potęgowania umożliwiła poprawne wykorzystanie wektora jako argumentu funkcji. Jeżeli mamy zdefiniowaną jedną funkcję, możemy wykorzystać ją do zdefiniowania innej: function w=fp2(x) w=2*fp1(x); Mamy zatem już dwie funkcje w plikach fp1.m i fp2.m z1=fp1(10) z2=fp2(10)
Funkcje plikowe możemy też wykorzystać w definicjach funkcji anonimowych, ale nie działa to w drugą stronę; przykłady: mamy plik fp1.m z funkcją fp1(x), definiujemy funkcję anonimową i z niej korzystamy: funk42 = @(x) fp1(x)-50; funk42(10) y=funk42(x); y Wszystko zadziałało poprawnie. Teraz zdefiniujmy najpierw funkcję anonimową: funk43 = @(x) x.^3-exp(x); i wykorzystajmy ją do zdefiniowania funkcji plikowej function w=fp3(x) w=funk43(x)+200; Po zapisaniu pliku, spróbujmy użyć funkcji fp3(x): fp3(10) Próba ta zakończy się niepowodzeniem. Bez większych trudności tworzymy funkcje plikowe większej liczby argumentów: function w=fp4(x,y) w=x.^2+y.^3; W oknie roboczym możemy ją przetestować: fp4(10,10) x=1:5; y=1:5; Z=fp4(x,y) elementy wektorów x i y brane parami, Z będzie wektorem for i=1:5 for j=1:5 M(i,j)=fp4(x(i),y(j)); M
W jednym pliku możemy definiować więcej niż jedną funkcję, ale wówczas funkcje następujące po pierwszej funkcji służą jako pomoc do jej zdefiniowania i nie mogą być wykorzystane w Command Window. Stórzmy plik fp5.m: function w=fp5(x) w=kwadrat(x)+szescian(x); function w=kwadrat(x) w=x.^2; function w=szescian(x) w=x.^3; W oknie roboczym możemy skorzystać z fp5(x): fp5(10) ale nie uda się próba skorzystania z funkcji pomocniczej: kwadrat(10) Jeżeli funkcja plikowa korzysta ze zmiennych wykorzystywanych też w oknie roboczym, warto używać zmiennych globalnych. Napiszmy w Command Window : global a; global b; można też definiować naraz: global a b; A teraz stwórzmy funkcję plikową function w=fp6(x) global a b; w=a*x+b; i sprawdźmy: a=1; b=2; fp6(10) a=10; b=20; fp6(10)
Wartości zmiennych globalnych mogą być zmieniane przez funkcje plikowe. W Matlabie wynikiem funkcji nie musi być jedna wartość. Stwórzmy plik: function [w1, w2]=fp7(x) w1=x.^2; kwadraty w2=x.^3; sześciany Wykorzystajmy tę funkcję w oknie roboczym: fp7(10) pokaże się tylko jedna wartość z=fp7(10) z tylko jedna wartość [u,v]=fp7(10) zmienne u i v będą miały po jednej wartości y=fp7(x) y wektor zbudowany tylko z kwadratów x [u,v]=fp7(x) powstaną 2 wektory z kwadratami i z sześcianami albo pętla for i = 1:length(x) [y(i),z(i)]=fp7(x(i)); powstaną 2 wektory z kwadratami i z sześcianami Przy takiej definicji funkcji mamy na wyjściu dwie pojedyncze wartości. Możemy funkcję tak definiować, aby wartości te od razu tworzyły pewien wektor: function w=fp8(x) w=[x.^2; x.^3]; fp8(10) z=fp8(10) [u,v]=fp8(10) y=fp8(x) pokaże się kolumna z dwiema wartościami z wektor (kolumna) z dwiema wartościami niepoprawne wykorzystanie y macierz z dwoma wierszami Taki sposób definiowania funkcji bardzo się nam przyda przy rozwiązywaniu zagadnień z równaniami różniczkowymi drugiego rzędu. Zadania: 1. Stwórz i przetestuj funkcję: 10 f (x, y)= (nx+ y n ). n=1
2. Stwórz i przetestuj funkcję: n f (n, x)= i=1 i x i. Przykładowe rozwiązania: 1. W edytorze Matlaba tworzymy nowy plik z zawartością: function wynik=f4(x,y); wynik=0; for n=1:10; wynik=wynik+n*x+y/n; ; W oknie roboczym możemy napisać: f4(0,0) f4(1,0) f4(1,0.5) 2. W edytorze Matlaba tworzymy nowy plik z zawartością: function wynik=f5(n,x); wynik=0; for i=1:n wynik=wynik+i./x.^i; W oknie roboczym testujemy, np.: f5(1,1) f5(2,1) f5(3,2)