zapis dziesiętny: 12.25=1x10^1+2x10^0+2x10^(-1)+5x10^(-2) zapis binarny: 1100.01=1x2^3+1x2^2+0x2^1+0x2^0+0x2^(-1)+1x2^(-2) (=12.25) Tak jak 1/3 nie może być zapisana w skończonym zapisie dziesiętnym Tak też 1/5 nie może być zapisana w skończonym zapisie binarnym 0.2=0.0011001100... Dlatego 1-0.2-0.2-0.2-0.2-0.2=5.5511e-017 1 Polecenia terminala: pwd print working directory (pokazuje sciezke folderu roboczego) cd H:/Octave - change directory to H:/Octave (zmienia folder roboczy na H:/Octave, jesli taki istnieje) cd .. cofa sie o jeden stopien w hierarchii folderow (np. jestem w H:/Octave/zajecia1 a po wpisaniu cd .. bede w H:/Octave) cd ~/ - wraca do wyjsciowego folderu roboczego ls - print directory listing - wyswietla foldery i pliki znajdujace sie w danym folderze roboczym mkdir name - make directory - tworzy nowy nowy folder w folderze roboczym o nazwie name 2 Podstawowe polecenia Octave: clc - clear the screen - czysci ekran w terminalu clear all - czysci wszystko: zmienne, etc. whos - podaje informacje, jakie sa zdefiniowane zmienne help - wyswietla pomoc help NAME - wyswietla pomoc dotyczaca komendy NAME [Ctrl C] - przerywa obliczenia (jesli sa dlugie albo sie cos zawiesilo) quit - wychodzi z Octave format short - fixed point format with 5 digits format long - fixed point format with 15 digits ceil (x) - najblizsza liczba calkowita nie mniejsza niz x floor(x) - najblizsza calkowita nie wieksza niz x round(x) - najblizsza x liczba calkowita 3 Polecenia macierzowe 3a) Tworzenie macierzy A = [1, 2; 3, 4] lub A = [1 2; 3 4] podanych skladowych, ';' oznacza nowy oznacza nowa kolumne B = [A [5; 7]] - dodawanie kolumny do C = [A; [5 7]] - dodawanie wiersza do tworzy macierz 2x2 o wiersz, ',' lub spacja macierzy macierzy 3b) Indeksowanie aij = A(i,j) - element macierzy wiersz i kolumna j ri = A(i,:) - i-ty wiersz macierzy A cj = A(:,j) - j-ta kolumna macierzy A B = A(i:k, j:l) - podmacierz zlozona z wierszow od i do k macierzy A oraz z kolumn od j do l macierzy A A(3,:) = 5 - jesli 3 wiersz nie istnieje to jest dodawany do macierzy A A(2,:) = [] - drugi wiersz macierzy A bedzie skasowany indices = 1:6 - zwraca wektor wierszowy [1, 2, 3, 4, 5, 6] steps = 13:-3:1 - zwraca wektor wierszowy [13, 10, 7, 4, 1] x = linspace(0,10,100) - zwraca wektor wierszowy o 100 elementach rowno rozmiezczonych pomiedzy 0 a 10 3c) Rozmiary macierzy nr = size(A,1) lub nr = rows(A) - zwraca ilosc wierszy macierzy A nc = size(A,2) lub nc = columns(A) - zwraca ilosc kolumn macierzy A [nr nc] = size(A) - zwraca obie rzeczy naraz w wektorze wierszowym l = length(A) - zwraca wieksze z nr i nc numel(A) - zwraca ilosc elementow A 3d) Operacje na macierzach C = A*B - mnozenie macierzy (nxk) z macierza (kxm) D = A.*B - mnozenie element po elemencie macierzy o tych samych wymiarach (to samo z dodawaniem, potega i dzieleniem) B = A' - transpozycja macierzy B = inv(A) - odwracanie macierzy d = det(A) - determinant macierzy A A/B lub A*inv(B) - dzielenie z prawej strony macierzy A przez B B\A lub inv(B)*A - dzielenie z lewej strony macierzy A przez B [v lambda] = eig(A) - dekompozycja macierzy na macierz digonalna wartosci wlasnych lambda oraz macierz wektorow wlasnych v 3e) Operacje wektorowe s = x'*x - iloczyn scalarny wektora x sum(v) - liczy sume elementow wektora v cumsum(v) - liczy kumulatywna sume wektora v, czyli wektor [v_1; v_1+v_2; v_1+v_2+v_3; ...] prod(v), cumprod(v) - to samo dla mnozenia diff(v) - wylicza roznice miedzy kolejnymi elementami wektora [v_2-v_1;v_3-v_2; ...] mean(v) - wylicza srednia z elementow wektora std(v) - wylicza odchylenie standardowe elementow wektora min(v), max(v) - zwraca element minimalny oraz maksymalny wektora sort(v, 'ascend'), sort(v,'descend') - sortuje rosnaco i malejaco elementy wektora 3f) Macierze specjalne A = zeros(m,n) - zwraca macierz zer o wymiarach mxn B = ones(m,n) - zwraca macierz jedynek o wymiarach mxn I = eye(n) - zwraca macierz jedynkowa o wymiarach nxn D = diag([a b c]) - zwraca macierz diagonalna, gdzie a, b i c sa elementami na przekatnej macierzy R = rand(m,n) - macierz mxn o elementach z rozkladu jednostajnego miedzy 0 a 1 N = randn(m,n) - macierz mxn o elementach z rozkladu normalnego o sredniej 0 i warancji 1 v = randperm(n) - wektor wierszowy z losowa permutacja liczb od 1 do n 4) Wykresy Przykladowy programik zapisany jako name.m x=linspace(0,1,100); % Tworzymy 100 rownorozmieszczonych punktow miedzy 0 a 1 y=x.*cos(x); % Mnozymy element po elemencie te punkty przez cosinus tych punktow z=x.*sin(x); % To samo dla sinusa plot(x,y,x,z) % Wykres obu funkcji na jednym wykresie title('Some innocent plottings.') % Tytul wykresu xlabel('domain') ylabel('values') legend('x*sin(x)','x*cos(x)') % Podpis pod osia x % Podpis pod osia y % Legenda figure(2) % Otwiera okienko dla nowego wykresu subplot(1,2,1) % Tworzy poziomo obok siebie dwa miejsca na wykresy i ogniskuje sie w lewym miejscu plot(x,y) % Rysuje subplot(1,2,2) % Teraz ogniskuje sie na prawym miejscu plot(x,z) % Rysuje figure(3) plot3(x,y,z) grid on 5) Wielomiany % Otwiera okienko dla nastepnego wykresu % Trojwymiarowy wykres % wlacza linie siatki p = conv([1 0 3],[1 1 -3]) - mnozenie dwoch wielomianow polyval([1 0 .5 -4],3) - wartosc wielomianu dla x=3 roots([1 0 .5 -4]) - szuka pierwiastkow wielomianu Przykladowy programik zapisany jako name.m x=linspace(1,50,301); % tworzy wektor wierszowy o 301 elementach rowno rozmieszczonych pomiedzy 0 a 50 y=polyval([1 0 .5 -4],x); % wartosci wielomianu dla tych 301 punktow z=2*rand(1,301).*polyval([1 0 .5 4],x); % kazda z tych wartosci wielomianu jest w sposob losowy "zaburzana" curve=polyfit(x,z,3) % Dopasowujemy MNK do tych "zaburzonych" wartosci wielomian o stopniu 3 plot(x,z,x,polyval(curve,x),x,y); % Wykres wyjsciowego, zaburzonego oraz dopasowanego wielomianu legend('data','fitted','undistorted') % Legenda 6) Wpisywanie tekstow fprintf('A Matlab program. \nThe author is anonymous.') % Wpisuje jako tekst, \n przechodzi do nowej linii fprintf('e=%g\npi=%g', exp(1),pi) % wpisuje tekst i podstawia pod %g wartosci, ktore sa za apostrofem tellme=input('Give me a number:'); % Wpisuje tekst w apostrofie i czeka na odpowiedz fprintf('The number you gave me is %g.', tellme) % Zwraca odpowiedz z numerem, ktory zostal podany 7) Petla for for indeks=ciag albo zbior instrukcje; end Przykladowy programik dla ciagu indeksow (plik nazwa.m) frpintf('\nThis program calculates n factorial (n!).\n'); % Wpisuje na poczatku informacje o programie n=input('Specify n.'); % Program bedzie czekac na wpisanie wartosci n przez uzytkownika factorial=1; % Wartosc poczatkowa for i=n:-1:2 % n:-1:2 ma zaczac od n % pozniej cofac sie za kazdym % razem o jeden az dojdzie do 2 factorial=factorial*i; % Pomnoz dotychczasowa wartosc % przez nastepna liczbe end; frpintf('\n%g!\n\n', n, factorial); % Na koniec przedstawiany % jest rezultat Przykladowy programik dla zbioru indeksow (plik nazwa.m) % Program liczy sume liczb pierwszych nizszych niz 20 sum=0; % Wartosc poczatkowa sumy for i=[2,3,5,7,11,13,17,19] % [2 3 5 7 11 13 17 19] zbior indeksow czyli liczb pierwszych <20 sum=sum+i; % do dotychczasowej wartosci sumy dodaj % nastepna liczbe end; sum Przykladowy programik z dwoma petlami zagniezdzonymi (plik nazwa.m) % Programik uzyskuje macierz 10x10 z kolejnymi liczbami % od 1 do 100 idac rzedami matrix=zeros(10,10); % Poczatkowa macierz zer for i=1:10 for j=1:10 matrix(i,j)=(i-1)*10+j; % We wierszu i kolumnie j % wstaw wartosc (i-1)*10+j end; end; disp(matrix) % Pokaz macierz koncowa Przykladowy programik z dwoma petlami z losowa liczba indeksow (plik nazwa.m) % Program zwraca macierz o wymiarach x na x, % gdzie x jest liczba losowa od 1 do 10. % W macierzy tej elementy sa po prostu kolejnymi liczbami % calkowitymi od 1 do x*x x=ceil(10*rand(1,1)); % Liczba losowa od 0 do 10 jest % zaokraglana w gore do najblizszej % liczby calkowitej matrix=zeros(x); % macierz x na x zlozona z samych zer sum=0; for i=1:length(matrix) % Indeks od jeden do x, % gdzie x jest losowe for j=1:length(matrix) matrix(i,j)=sum+1; % Element macierzy sum=matrix(i,j); % Wartosc sumy do nowego kroku petli end; end; disp(matrix) 8) Petla while i petla if while warunek instrukcje; end if warunek instrukcje; elseif warunek instrukcje; else instrukcje; end Warunek jest kategoria logiczna tzn. Octave sprawdza, czy jest to falsz czy prawda, dlatego stosuje sie inne oznaczenia niz w przypadku definiowania zmiennych (na przyklad porownaj x = y oraz x == y ponizej): x == y x rowna sie y x ~= y or x != y x nie rowna sie y x <= y, x >=y x nie wieksze od y, x nie mniejsze od y (x > 5) & (x<100) x nalezy do (5,100) ('&' oznacza 'i') mod(i+1,3) == 0 | mod(i+2,3) == 0 i+1 jest podzielna przez 3 lub i+2 jest podzielna przez 3 ('|' oznacza 'lub') xor(mod(i,2) == 0, mod(i+1,2) == 0) albo i jest podzielne przez 2 albo i+1 jest podzielne przez 2 ('xor()' oznacza 'lub rozlaczne') all(x) any(x) prawdziwe, jesli wszystkie elementy x sa niezerowe prawdziwe, jesli przynajmniej jeden element jest niezerowy Przykladowy programik z petla while oraz petla if (plik nazwa.m) fprintf('\nTen program znajduje liczbe, ktorej silnia jest najblizsza liczbie n, ktora podaje uzytkownik'); n=input('\nEnter n. '); factorial=1; i=1; % Poczatkowa wartosc indeksu while factorial<n % dopoki silnia<n i=i+1; % Wartosc indeksu do nastepnego kroku factorial=factorial*i; % Kolejna wartosc end; if abs(n-factorial)<=abs(factorial/i-n) fprintf('The solution is %g.', i); else fprintf('The solution is %g.', i-1); end Przykladowy programik z petla if i for (plik nazwa.m) % Program, ktory wypisuje wszystkie liczby calkowite n % od 1 do 100 takie, ze n jest podzielne przez 4, % zas n+1 lub n+2 jest podzielne przez 3 licznik=1; wektor=[]; % Zdefiniowany wektor pusty czyi bez % okreslonych wymiarow; for i=1:100 if mod(i,4)==0&(mod(i+1,3)==0|mod(i+2,3)==0) wektor(licznik)=i; licznik=licznik+1; endif endfor ret=wektor; 9) Procedura switch Zamiast pisac wiele razy "if zmienna=pierwsza wartosc", "if zmienna=druga wartosc", ....etc., jest procedura switch: zmienna=input('Zadanie odpowiedzi od uzytkownika') albo liczba losowa switch zmienna case pierwsza wartosc instrukcje; case druga wartosc instrukcje; otherwise instrukcje; end Przykladowy programik z procedura switch % Program, ktory pyta o dzien tygodnia zaczynajacy sie od T %(po angielsku) answer=input('Name a day of the week that starts with T.\n','s'); switch answer case {'tue','Tue','tuesday','Tuesday','thu','Thu','thursday','Thursd ay'} fprintf('Yep, that"s one. You sure know your weekdays.'); otherwise fprintf('Either you misspelled the day you meant, '); frpintf('or you should take a hard look at your calendar.'); end 10) Funkcje Trzeba zapisac plik o nazwie 'nazwafunkcji.m', ktory wyglada nastepujaco: % Komentarz w pierwszych linijkach bedzie wyswietlal sie po % wywolaniu 'help nazwafunkcji' function [ outputvars ] = nazwafunkcji (arguments) instrukcje; y=outputvars Przykladowa funkcja (plik o nazwie smart_urdmv.m) - przyklad uzycia petli if % Funkcja, ktora bierze jako input liczbe wierszy r, % liczbe kolumn c oraz ropietosc d i zwraca macierz rxc % o elementach bedacych liczbami losowymi miedzy 0 a d % Opcjonalnie mozna podac tylko dwa argumenty: % wymiar wektora c oraz rozpietosc d i wtedy funkcja zwraca % wektor c-elementowy o elementach bedacych % liczbami losowymi miedzy 0 a d function y=smart_urdmv(d,r,c); if nargin==3 % Jesli liczba argumentow funkcji rowna sie 3 y=rand(r,c); % create the matrix y=d*y; % adjust the interval and display the matrix elseif nargin==2 % Jesli liczba argumentow funkcji rowna sie 2 c=r; % reassign input variables y=rand(1,c); % create the vector y=d*y; % adjust and display else % Jesli liczba argumentow zgloszonych do funkcji % nie rowna sie ani 2 ani 3 y=0; end Przykladowa funkcja (plik maks.m) - przyklad uzycia petli for i if % Funkcja, ktora podaje maksymalny element macierzy function [ wartosc ] = maks (A) m=size(A)(1); n=size(A)(2); dotychczas=A(1,1); for i=1:m for j=1:n if A(i,j)>dotychczas dotychczas=A(i,j); endif endfor endfor wartosc=dotychczas; endfunction Przykladowa funkcja (plik onedim.m) - przyklad zagniezdzonych petli if z nargin % Funkcja, ktora liczy pochodna z funkcji w punkcie, % gdzie podac mozna funkcje, punkt, w ktorym ma byc % liczona pochodna oraz dokladnosc epsilon i informacja czy ma % byc liczona pochodna centralna czy prawostronna % 0 oznacza prawostronna a 1 oznacza centralna % Jesli podanych jest 3 argumentow, przyjmuje sie centralna % pochodna, jesli podanych jest dwa argumenty % przyjmnuje sie dokladnosc = 0.0001 function [ ret ] = onedim (funkcja,x0,epsilon,czy_centralna) if nargin<4 czy_centralna=1; if nargin<3 epsilon=0.0001; endif endif if czy_centralna ret=(feval(funkcja,x0+epsilon)-feval(funkcja,x0epsilon))/2/epsilon; else ret=(feval(funkcja,x0+epsilon)feval(funkcja,x0))/epsilon; end; endfunction