Funkcje w Octave Tomasz Żebro Kraków, 05 maj 2008 1 Wst˛ep W Octavie, podobnie jak w innych j˛ezykach programowania jest możliwość definiowania swoich własnych funkcji. Własne funkcje piszemy gdy chcemy aby program składał si˛e z bloków funkcjonalnych o ściśle określonym działaniu, co czyni program lepiej zrozumiałym i jest szczególnie zalecane w przypadku długich programów. Dodatkowo raz zapisana funkcja w zewn˛etrznym pliku funkcyjnym może być wielokrotnie wywoływana przez różne programy. Zmienne wyst˛epujace ˛ w funkcjach maja˛ charakter lokalny. Oznacza to że zmienne wyst˛epujace ˛ w danej funkcji nie b˛eda˛ widziane w innej funkcji. Komunikacja pomi˛edzy funkcja,˛ a programem ja˛ wywołujacym ˛ odbywa si˛e poprzez parametry_wejscia i parametry_wyjscia (parametry formalne). Funkcja może być wywoływana przez inne funkcje. Funkcj˛e zapisujemy w plikach tekstowych o nazwie nazwa_funkcji.m. Definicja funkcji posiada nast˛epujac ˛ a˛ struktur˛e: function parametry_wyjscia = nazwa_funkcji(parametry_wejscia) instrukcje; .. . endfunction 2 Przykłady Funkcja obliczajaca ˛ sum˛e dwóch liczb Utwórz plik o nazwie suma_liczb.m, w którym wpisz poniższy kod źródłowy: % Funkcja suma_liczb wyznacza sume dwóch liczb ’a + b’ function wynik = suma_liczb(a,b) wynik = a + b; endfunction nast˛epnie w środowisku Octave zdefiniuj zmienne a, b i wywołaj funkcj˛e suma_liczb: octave:1> a=1 a = 1 octave:2> b=2 b = 2 octave:3> suma_liczb(a,b) ans = 3 W linii nr 3 nast˛epuje wywołanie funkcji suma_liczb, jako parametry przekazujemy dwie zmienne, których suma ma zostać policzona, jako parametry można podać również konkretne liczby np. suma_liczb(3, 4). Funkcja obliczajaca ˛ sum˛e dwóch wektorów Powyższa funkcja może być łatwo rozszerzona, tak aby obliczała sum˛e dwóch wektorów, dodatkowo został dodany warunek, który sprawdza czy dwa wektory można dodać do siebie. Utwórz plik o nazwie suma_wek.oct, w którym wpisz poniższy kod źródłowy funkcji wraz z danymi do testowania funkcji: 1 % Funkcja suma_wek wyznacza sume dwóch wektorow ’a + b’ function [Z] = suma_wek(A,B) if length(A)==length(B) Z = A + B; elseif printf(’Wymiary wektorów nie zgadzaja˛ si˛ e \n’); Z=0; end endfunction A = [1 2 3]; B = [3 4 5]; C = suma_wek(A,B) w wierszu poleceń wpisz polecenie octave − q suma_wek.oct. Nast˛epnie zmień dane testujace ˛ tak aby wymiary wektorów były różne i ponownie uruchom obliczenia. Funkcja obliczajaca ˛ wartość wyrażenia arytmetycznego Korzytajac ˛ z odpowiednio zdefiniowanej funkcji obliczyć wartości zmiennych a, b, c: a= x2 + 1 √ 1+x , 2.5 + x √ , x4 + 1 + x2 sin(x) p c= . 2 sin x + 1 + sin(x) b= Zadanie to rozwia˛żemy definiujac ˛ sobie funkcj˛e fun_z, która b˛edzie obliczać wartość nast˛epujacego ˛ wyrażenia: 1 z= 2 √ . y + 1+y function z=fun_z(y) z= 1.0/(y^2 + sqrt(1+y)); endfunction zauważajac, ˛ że: a = fun_z(x), b = (2.5 + x) ∗ fun_z(x2 ), c = (sin(x)) ∗ fun_z(sin(x)), możemy obliczyć wartości zmiennych a, b, c wywołujac ˛ funkcj˛e fun_z z odpowiednim parametrem: x = 2 octave:7> a=fun_z(x) a = 0.17446 octave:8> b=(2.5+x)*fun_z(x^2) b = 0.24676 octave:9> c=sin(x)*fun_z(sin(x)) c = 0.41171 Funkcja obliczajaca ˛ podstawowe charakterystyki przekroju prostokatnego ˛ Poniższy przykład zostanie zapisany w dwóch plikach tekstowych. W pierwszym o nazwie prog_glowny.oct zapiszemy kod źródłowy głównego programu, który b˛edzie wczytywać dane, wywoływać odpowiednia˛ funkcj˛e obliczajac ˛ a˛ charakterystyki przekroju i drukować wyniki. W drugim pliku o nazwie char_prost.m zapiszemy kod źródłowy funkcji char_prost, która b˛edzie obliczała pole powierzchni oraz główne momenty bezwładności dla prostokata. ˛ Kod źródłowy programu głównego: 2 % Program oblicza podstawowe charakterystyki dla prostokata ˛ o bokach b, h % korzystajac z funkcji zewnetrznej char_prost. b = input("Podaj szerokosc przekroju b: "); h = input("Podaj wysokosc przekroju h: "); [P, Ix, Iy] = char_prost(b,h); printf("Pole powierzchni P = %g\n", P); printf("Moment bezwładności Ix = %g\n", Ix); printf("Moment bezwładności Iy = %g\n", Iy); Kod źródłowy funkcji char_prost: % Funkcja oblicza: % P - pole powierzchni, % Ix - moment bezwładnosci wzgl˛ edem osi x, % Iy - moment bezwładnosci wzgl˛ edem osi y, % dla prostokata ˛ o bokach b, h function [P, Ix, Iy]=char_pros(b,h) P = a*b; Ix = (b*h^3)/12; Iy = (b^3*h)/12; endfunction Prgram uruchamiamy wpisujac ˛ w wierszu poleceń: octave − q prog_glowny.oct. Przykładowy listing z działania programu: Podaj szerokosc przekroju : 2 Podaj wysokosc przekroju : 4 Pole powierzchni P = 8 Moment bezwładności Ix = 10.6667 Moment bezwładności Iy = 2.66667 Funkcja obliczajaca ˛ wartość n! Jako ostatni został podany przykład funkcji obliczajacej ˛ warość n!: n! = n Y i = 1 · 2 · 3 · . . . · (n − 1) · n. i=1 Utwórz plik o nazwie silnia.m, w którym wpisz poniższy kod źródłowy funkcji: % Funkcja silnia wyznacza watość n! function [wynik]= silnia(n) wynik=1; for i=1:n wynik=wynik*i; end endfunction nast˛epnie w środowisku Octave wywołaj funkcj˛e silnia z różnymi warościami: octave:2> silnia(2) ans = 2 octave:3> silnia(4) ans = 24 octave:4> silnia(5) ans = 120 3 3 Zadania do samodzielnego wykonania 1. Napisz funkcj˛e, która porównuje ze soba˛ dwie liczby i zwraca wartość 1 w przypadku gdy sa˛ sobie równe i wartość 0 w przypadku gdy sa˛ różne. 2. Napisz funkcj˛e, która obliczy sum˛e elementów wektora A. 3. Napisz funkcj˛e, która dla zadanego promienia R oblicza pole i obwód koła. 4. Napisz funkcj˛e, która oblicza iloczyn skalarny dwóch wektorów A i B. 5. Napisz funkcj˛e, która oblicza z zadana˛ dokładnościa˛ przybliżenie funkcji f (x) = ex korzystajac ˛ z jej rozwini˛ecia w szereg Taylora, n ex = 1 + X xi x2 x3 x + + + ... ∼ = 1! 2! 3! i! i=0 4