Programowanie w Octave Podstawy języka Zmienne Wyniki obliczeń można przypisywać do zmiennych. Nazwy zmiennych powinny zaczynać się od liter (nie mogą zaczynać się od cyfr, mogą od niektórych innych znaków). Przypisanie wyniku do zmiennej „a”: octave3.2:1 > a=2+2 a=4 Wpisanie nazwy zmiennej spowoduje wyświetlenie jej wartości (mozna to potraktować jak działanie 0-argumentowe o nazwie takiej, jak nazwa zmiennej). Nazwy zmiennych są wrażliwe na wielkość liter – zmienna „a” to nie to samo co zmienna „A”. octave3.2:4 > a a=4 octave3.2:5 > A error: ‘A’ undefined near line 5 column 1 W tej sytuacji Octave wyświetlił komunikat o błędzie. Można też nadać zmiennej wartość wprost, aby potem użyć jej w obliczeniach. octave3.2:2 > k=7 k=7 oc t ave 3.2:3 > k^2 ans = 49 ans też jest zmienną, tyle, że tworzoną automatycznie przez program. Na niej również można wykonywać obliczenia, co bywa przydatne, zwłaszcza z użyciem historii poleceń: octave3.2:17 > 3 ans = 3 octave3.2:1 8 > ans^2 ans = 9 octave3.2:1 9 > ans^2 ans = 81 octave3.2:20 > ans^2 ans = 6561 Nazwy zmiennym można nadawać bardzo dowolnie. Można nawet nadać zmiennej nazwę istniejącej funkcji: octave3.2:5 > cos=7 cos = 7 octave3.2:6 > i =5 i=5 W takiej sytuacji, aby znów mieć mozliwość skorzystania z funkcji cos czy jednostki urojonej, należy wyczyścić zmienne poleceniem clear: octave3.2:9 > clear i cos octave3.2:1 0 > i ans=0+1 i Zmienne do wyczyszczenia należy wpisywać po słowie clear, oddzielone spacjami. Aby wyczyścić wszystkie zmienne, należy wpisać clear all. Wydanie polecenia ze znakiem średnika na końcu spowoduje, że wynik nie zostanie wyświetlony. Można też wydać kilka komend na raz, w jednej linii, oddzielonych przecinkami (wynik widoczny) lub średnikami (wynik niewidoczny): octave3.2:18 > a=2; b=a+2 , c=b*2 ; b=4 octave3.2:19 > c c=8 Polecenia Oprócz wspomnianych exit i clear, Octave zawiera jeszcze kilka poleceń niedotyczących bezpośrednio obliczeń. Są to m. in. quit (to samo, co exit), close – do zamykania okien z wykresami (używa się tak samo, jak clear – „all” zamyka wszystkie), clc – czyści ekran programu, who – wyświetla listę wszystkich zmiennych, whos – wyświetla szczegółową listę wszystkich zmiennych, what – wyświetla listę plików .m w bieżącym katalogu, oraz trzy dla nas najważniejsze: diary – uruchamia „pamiętnik”, format – zmiana sposobu wyświetlania wyników i help – pomoc programu. „Pamiętnik” to plik, w którym Octave zapisuje wszystko to, co widać w jego oknie – zarówno polecenia, jak i odpowiedzi. Wpisanie diary on włącza, a diary off wyłącza zapis. Domyślnie, plikiem pamiętnika jest plik diary w katalogu roboczym Octave’a. Można też nakazać zapis w innym pliku, wpisując np. „diary pamietnik.txt”. Należy pamiętać, że plik pamiętnika jest zapisywany na dysku dopiero w momencie wydania polecenia o zakończeniu zapisu (lub zamknięciu programu), oraz że przy ponownym włączeniu zapisu w tym samym pliku, nowa zawartość zostanie zapisana na końcu starej. W przypadku rozwiązywania zadań z algebry liniowej przydatne bywa, aby wyniki były przybliżane za pomocą liczb wymiernych. W tym celu należy wydać komendę „format rat”. Innym przydatnym formatem jest format optymalnie dopasowujący wyświetlanie każdej liczby z osobna: „ format short g”. Dla macierzy liczb zespolonych przydatny może być także „ format free” wyświetlający liczby w postaci par (x, y), gdzie z = x+i·y. Wpisanie samego polecenia format powoduje powrót do domyślnego formatowania wyników: octave3.2:3 > pi ans = 3.1416 octave 3.2:4 > format rat octave3.2:5 > pi ans = 355/113 octave3.2:6 > format octave3.2:7 > pi ans = 3.1416 Więcej informacji na temat polecenia format znajduje się w pomocy. Wykonanie polecenia help powoduje wyświetlenie ogólnego tekstu pomocy, „help komenda” wyświetla natomiast pomoc do danej komendy, czyli np. help format wyświetli opis wszystkich możliwych formatów. Zazwyczaj w pomocy do danej komendy wymienione są polecenia o podobnym działaniu, albo działające odwrotnie. Aby zamknąć pomoc (jak równiez zmienne niemieszczące się na ekranie oraz okna wykresów), należy nacisnąć przycisk „Q” na klawiaturze. Aby wykonać wybrane polecenie lub działanie, należy wpisać odpowiednią komendę i nacisnąć ENTER. Polecenia są zapamiętywane – wciśnięcie strzałki w górę na klawiaturze powoduje pokazanie ostatnio wpisanego polecenia, strzałkami góra/dół można przeglądać całą zapisaną historię poleceń. Wpisanie ciągu znaków i naciśnięcie strzałki w górę spowoduje przeglądanie tylko tych zapamiętanych komend, które zaczynały się od tego wpisanego ciągu znaków, np. wpisanie „ex” i naciśnięcie strzałki w górę pokaże tylko komendy zaczynające się od „ex”, np. exit i exp(2). Octave obsługuje też autouzupełnianie poleceń. Wpisanie „ex” i dwukrotne naciśnięcie klawisza TAB wyświetli listę wszystkich poleceń zaczynających się od „ex”. Jeśli wpisany zostanie taki ciąg znaków, który jest prefiksem tylko jednego polecenia, to autouzupełnianie po prostu uzupełni tę nazwę. Polecenia systemowe Kilka poleceń służy do porozumienia się z systemem operacyjnym. pwd pokazuje katalog roboczy Octave’a, czyli katalog, w którym będzie on szukał plików (przede wszystkim skryptów i funkcji użytkownika), ls pokazuje zawartość tego folderu, a cd pozwala zmienić katalog roboczy na inny. Takie same polecenia funkcjonują w systemach linuksowych. Działanie poleceń widoczne jest w poniższym przykładzie. octave3.2:39 > pwd ans = /home/q octave3.2:40 > ls apro.m document.tex man .m octave czasy.m Dokumenty mojaFunkcja.m obrazki .m diary Lab12.Pdf Obrazy Pulpit diary.txt octave3.2:41 > cd Dokumenty octave3.2:42 > pwd ans = /home/q/Dokumenty octave3.2:43 > cd . . octave3.2:44 > pwd ans = /home/q Tablice GNU Octave daj dużą swobodę jeżeli chodzi o operowanie na wektorach i macierzach. Do ich reprezentacji służy podstawowa w tym programie struktura danych czyli tablica. Najprostszym sposobem utworzenia nowego wektora jest wymienienie wszystkich jego elementów octave:5> v1 = [1,0,0] v1 =1 0 0 Otrzymujemy w ten sposób wektor wierszowy v1 = [1, 0, 0] Aby otrzymać wektor kolumnowy 1 0 0 konieczne jest wykonanie operacji transponowania. Jest ona reprezentowana za pomocą apostrofu ’. octave:6> v1’ ans = 1 0 0 Podobnie możemy zdefiniować nową macierz oddzielając kolejne wiersze średnikami. octave:7> Id = [1,0,0;0,1,0;0,0,1] Id = 1 0 0 0 1 0 0 0 1 Niektóre macierze mogą być zbudowane poprzez wywołanie funkcji GNU Octave. Przykładem są macierze złożone z samych zer lub z samych jedynek. Aby uzyskać macierz o wymiarach 3 na 3 wypełnioną zerami wystarczy napisać octave:8> zeros(3,3) ans = 000 000 000 Analogicznie funkcja ones wypełnia macierz o zadanych rozmiarach jedynkami. Funkcje ta są przydatna w sytuacji gdy chcemy najpierw zbudować macierz o zadanym kształcie, którą w kolejnych krokach wypełniamy w określony sposób. Instrukcja warunkowa if Instrukcja warunkowa if pozwala na wykonanie bloku kodu jeżeli spełniony zostanie zadany warunek. Konstrukcja ta ma składnię przypominającą składnię języka programowania C. W poniższym przykładzie wybierany jest jeden z dwóch warunków (x > 5 bądź x ≤5). octave:1> x = pow2 (2); octave:2> if (x > 5) > x = x - 10; > else > x = x + 10; > endif Znaki > oznaczają tu kontynuację wpisywanej komendy po naciśnięciu klawisze ENTER . Pogram sygnalizuje w ten sposób oczekiwanie na zakończenie rozpoczętej konstrukcji, takiej jak instrukcja if, bądź zamknięcie nawiasów. Jeżeli chcemy rozróżnić pomiędzy większą ilością możliwości, to możemy zastosować konstrukcję if-elseif tak jak w poniższym przykładzie octave:3> x = pow2 (4); octave:4> y = sin (pow2(10)); octave:5> if (y > 0 ) > y = pow2(sin(5)) > elseif (y < 0 && x < 10) > y = cos(5) > endif Komenda endif oznacza zamknięcie konstrukcji. Instrukcja switch Drugim sposobem warunkowego wykonywania komend jest instrukcja switch. Pozwala ona na wyszczególnienie co ma być wykonane w zależności od tego do jakiego zbioru należy zmienna. W poniższym przykładzie zmienna test ma wartość 2, wykonane zostanie przypisanie x = 0. octave:29> test = 2 octave:30> switch test > case { 1 2 3 7 8 9 } >x=0 > case { 4 5 6 } >x=1 > otherwise > x = -1 > endswitch Pętla for Do poruszania się po tablicach służy pętla for. Do wypisania kwadratów liczb od 1 do 10 służy polecenie octave:1> for i=1:10 > i^2 > endfor znaki > oznaczają, iż program czeka na wprowadzenie komendy endfor, który oznacza zamknięcie pętli for. Pętla while Jeżeli chcemy wykonywać jakiś zestaw poleceń tylko dla danych spełniających określony warunek, octave:25> i=1 i=1 octave:26> while (i^2<1000) > i^2 > i=i+1 > endwhile Funkcje W Octavie, podobnie jak w innych językach programowania jest możliwość definiowania swoich własnych funkcji. Własne funkcje piszemy gdy chcemy aby program składał się 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ętrznym pliku funkcyjnym może być wielokrotnie wywoływana przez różne programy. Zmienne występujące w funkcjach mają charakter lokalny. Oznacza to że zmienne występujące w danej funkcji nie będą widziane w innej funkcji. Komunikacja pomiędzy funkcją, a programem ją wywołującym odbywa się poprzez parametry_wejscia i parametry_wyjscia (parametry formalne). Funkcja może być wywoływana przez inne funkcje. Funkcję zapisujemy w plikach tekstowych o nazwie nazwa_funkcji.m. Definicja funkcji posiada następującą strukturę: function parametry_wyjscia = nazwa_funkcji(parametry_wejscia) instrukcje; . . . endfunction Przykłady Funkcja obliczająca sumę dwóch liczb: % Funkcja suma_liczb wyznacza sume dwóch liczb ’a + b’ function wynik = suma_liczb(a,b) wynik = a + b; endfunction Następnie w środowisku Octave zdefiniuj zmienne a, b i wywołaj funkcję 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ępuje 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 obliczająca wartość n!: % Funkcja silnia wyznacza watość n! function [wynik]= silnia(n) wynik=1; for i=1:n wynik=wynik*i; end endfunction Następnie w środowisku Octave wywołaj funkcję silnia z różnymi wartościami: octave:2> silnia(2) ans = 2 octave:3> silnia(4) ans = 24 octave:4> silnia(5) ans = 120 Dodatkowe pakiety w Octave Pakiet przed użyciem trzeba : 1. zainstalować 2. załadować Instalacja Najpierw ściągamy z http://octave.sourceforge.net/packages.php plik z pakietem. Zapisujemy go w katalogu roboczym. Instalujemy poleceniam : pkg install package_file_name.tar.gz Pakiet jest kopiowany do odpowiedniego katalogu. Ładowanie Ładowanie zainstalowanych pakietów : pkg load package_name Sprawdzanie Lista zainstalowanych pakietów uzyskamy za pomocą pkg list Przykładowe pakiety: Pakiet bim Pakiet do rozwiązywania równań różniczkowych cząstkowych. Pakiet communications Komunikacja cyfrowa, korekta błędów w kodzie (kod kanału), funkcje kodu źródłowego, modulacja oraz ciało skończone. Pakiet Control Komputerowe wspomaganie Control System Design (CACSD) Narzędzia GNU Octave, oparte na sprawdzonej Bibliotece SLICOT. Pakiet database Interfejs do baz danych SQL, obecnie tylko przy użyciu postgreSQL libpq. Pakiet dicom Komunikacja cyfrowa w medycynie (DICOM) plików Wyjścia/Wejścia. Pakiet general Ogólne narzędzia do Octave. Pakiet financial Symulacja Monte Carlo, opcje cenowe rutyny, manipulacje finansowe, funkcje kreślenia. Wykonali: Ambroziak Robert, Bartkowski Radosław, Gałus Michał, Popławski Konrad, Telakowiec Robert, Zychowicz Sebastian KONIEC Dziękujemy za uwagę.