Funkcje w Octave

advertisement
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
Download