Professional Documents
Culture Documents
Uzupenienie
0.1 Warunki zaliczenia
Zgodnie ze wstpn zapowiedzi zaliczenie wicze ksztatuje si nastpujco: 10 pkt - kolokwium na ostatnim laboratorium 5 punktw - kartkwka na 4. laboratorium pozostae punkty mona uzyska za aktywno na zajciach (zazwyczaj po 2 punkty za zadanie). Moliwa liczba punktw do zdobycia przekracza 5, zatem liczba wyliczonych punktw za aktywno (WPA) bdzie nastpujc funkcj rzeczywistych punktw za aktywno (RPA): RP A, jeli RP A 6 1 W P A = 6 + 2 (RP A 6), jeli 6 < RP A 10 8, jeli RP A > 10. Jak nietrudno zauway, moliwych punktw do zdobycia jest wicej ni 20. Ostateczna liczba punktw za wiczenia bdzie wic postaci ostateczne.punkty = min(20, zdobyte.punkty).
0.2
Uaktualnienia
Nowa strona wykadowcy: http://www.tomaszkuszewski.pl Polecam te stron dra Michaa Lewandowskiego: http://michallewandowski.eu S ju moje godziny konsultacji:
Wstp do Octave
Octave jest programem i rodowiskiem oblicze przeznaczonym do oblicze numerycznych, rozprowadzanym na licencji GNU GPL. Strona oprogramowania: http://www.octave.org
1.1
W ramach zaj, jak i poniszych notatek, przerobimy tylko podstawowe komendy pgramu Octave, w ramach potrzebnych nam do zaj z Metod Optymalizacji. Po wicej informacji odsyam do tutoriali: WikiBooks (angielski) - prostszy WikiBooks (polski) - trudniejszy Dr. P.J.G. Long (Cambridge) Introduction to Octave - prawdopodobnie najlepszy. Innym rdem wiedzy jest sam program. Jeli znamy nazw funkcji, wystarczy wpisa: help nazwa_funkcji Na przykad: help sqrt
1.2
Proste obliczenia mona wpisywa bezporednio w konsoli. Uwaga! % jest znakiem komentarza. 2+2 sqrt(3) sin(pi/2)+exp(3) % Przypisanie zmiennych a=5 % eby nie wypisywa za kadym razem wartoci, mona dostawi rednik: b=6; b^2 % acuchy znakw: wyraz=kopytko
1.3
Wektory i macierze
. Podstawowym obiektem w Octave jest macierz w szczeglnoci wektor. Zapis wektora jest intuicyjny: % Wektory: x=[2,3,-1] % albo: y=[1 1 0] % Transpozycja x % Mnoenie - wyprbujcie obie funkcje: x*y x.*y length(x) % Poyteczne wektory: podzialka_liniowa=linspace(0,3,20) podzialka_log=logspace(0,3,20) % Macierze: A=[2,3; 1,0] B=[1 0 0 1] % Operacje: size(B) A+B A*B rank(B) C=[A,B] D=[A;B] % Wypisywanie D(2:3,:) 3
D(:,1) % Wypisywane wiersze nie musz ze sob ssiadowa: D([1,4],:) D([4,1],:) % Poyteczne macierze M=eye(4) M=zeros(4) M=ones(4) M=rand(3) M=randn(3) A % Uwaga! Operacja " " formalnie nie jest transpozycj, tylko sprzeniem. % Dla macierzy rzeczywistych - nie ma rnicy. % Dla macierzy zespolonych - jest!
1.4
Skrypty i funkcje
Najczciej uwyajc Octave nie chcemy wpisywa wszystkich polece do konsoli. Jest to zwaszcza problematyczne, gdy chcemy kilkakrotnie wykona du liczb polece w ramach pewnego algorytmu. W taki przypadku przydadz nam si skrypty. Skrypty do Octave mona tworzy z pomoc dowolnego edytora tekstu, np. Notatnika. Skrypty zapisujemy z rozszerzeniem *.m. Przykadowy wygld skryptu (zapisany pod nazw pierwszy skrypt.m) clear; a=3; b=4; suma=a+b Zadanie: Napisz dowolny cig komend octaveowych i zapisz go w postaci skryptu. Aby uruchomi skrypt, wystarczy wpisa jego nazw i ewentualnie lokalizacj. Przydadz nam si zatem polecenia: % Odczytanie biecej lokalizacji folderu roboczego pwd % Zmiana lokalizacji: cd nowa_lokalizacja % Na przykad: cd C:\skrypty 4
Gdy umiecimy plik we waciwej lokalizacji, moemy si odwoa do anszego skryptu, wpisujc jego nazw: >pierwszy_skrypt suma=7
Specjalnym rodzajem skryptw s funkcje. Pliki zawierajce funkcje zaczynaj si sowem function i musz mie t sam nazw co funkcja, ktr deniuj. Ponisza funkcja jest wic zapisana w pliku kwadrat.m. function y=kwadrat(x) % podnosi liczbe do kwadratu y=x^2;
Podobnie jak dla skryptu, odwoujemy si do funkcji za pomoc jej nazwy: >a=kwadrat(12) a = 144 Funkcje wielu wartoci i agrumentw deniujemy podobnie, z tym, e zbir wartoci naley wzi w nawias kwadratowy: function [suma, iloczyn] = dzialania(a,b,c) suma=a+b+c; iloczyn=a*b*c; end Najprociej odwoa si do takich wartoci, wpisujc je na wektor: >[x,y]=dzialania(2,3,-1) suma = 4 iloczyn = -6 Jeli chcemy policzy na szybko funkcj wg zadanego wzoru (np. wielomian), moemy zrobi to bezporednio w konsoli, komend inline. % Funkcje na szybko (z palca). f=inline(x^2+3*x) Pamitajcie o cudzysowie! 5
1.5
Rysowanie (opcjonalne):
1.6
Podstawy programowania:
Instrukcja warunkowa if # Oglnie if warunki dziaania; else inne dziaania; end Na przykad: if a>0 b=sqrt(a); else b=sqrt(-a); end Instrukcja warunkowa while % Oglnie: while warunki dziaania; end Na przykad: a=2; b=1; epsilon=0.01; k=1 while (a-b)>epsilon b=b+1/2^k; k=k+1; end 6
Instrukcja ptli for % Oglnie for zmienna = poczatek : interwa : koniec dziaania end Na przykad: n=5; silnia=1; for i=1:n silnia=silnia*i; end
2
2.1
function [lewykoniec, prawykoniec] = przedzial(funkcja,x0,delta) % Przydatna operacja przy pisaniu funkcji: nargin % - pozwala pomin niektre parametry funkcji if nargin<3 delta=1; if nargin<2 x0=0; end end % Inicjalizacja: okreslenie znaku delty, tj. kierunku, w ktrym bdziemy przeszukiwa % wartoci funkcji if feval(funkcja,x0-delta)<feval(funkcja,x0+delta) delta=-delta; end % Zadanie zmiennych. W kadym kroku k musimy zapamita 3 wartoci x(k-1), x(k), x(k+1). % Bdziemy je oznacza zmiennymi a,b,c, tzn. a=x(k-1), b=x(k), c=x(k+1). 7
% Na pocztku definiujemy zgodnie z zaleceniem z zaj: a=x0-delta; b=x0+delta; delta=2*delta; c=b+delta; % ptla while feval(funkcja,c)<feval(funkcja,b) a=b; b=c; % przepisanie znanych wartoci x(k-1) i x(k) delta=2*delta; c=b+delta; % obliczenie x(k+1) end % po wyjciu z ptli okrelamy koce przedziau: lewykoniec=min(a,c); prawykoniec=max(a,c); end
2.2
function [min_szac] = zloty_podzial(funkcja,a,b,epsilon) % Znowu funkcja nargin: if nargin<4 epsilon=0.01; if nargin<3 [a,b]=przedzial(funkcja); end end % Inicjalizacja zmiennych fi=(sqrt(5)-1)/2; lewy=b-fi*(b-a); prawy=a+fi*(b-a); % Ptla while (b-a)>2*epsilon
if feval(funkcja,lewy)<feval(funkcja,prawy) % minimum jest z lewej. Zatem ograniczamy si do przedziau [a,prawy]: b=prawy; prawy=lewy; lewy=b-fi*(b-a); else % minimum jest z prawej. Ograniczamy si do przedziau [lewy,b] a=lewy; lewy=prawy; prawy=a+fi*(b-a); end end % Za kocowe przyblienie szukanego minimum wemiemy rodek otrzymanego przedziau: min_szac=(a+b)/2; end
2.3
function [min_szac] = dychot_podzial(funkcja,a,b,epsilon) % Okrelenie parametrw wejciowych, jeli nie s podane. if nargin<4 epsilon=0.01; if nargin<3 [a,b]=przedzial(funkcja); end end % Inicjalizacja zmiennych delta=0.001 lewy=(a+b-delta)/2 prawy=(a+b+delta)/2 % Ptla while (b-a)>2*epsilon if feval(funkcja,lewy)<feval(funkcja,prawy) % minimum jest z lewej. Zatem ograniczamy si do przedziau [a,prawy]: 9
b=prawy; lewy=(a+b-delta)/2; prawy=(a+b+delta)/2; else % minimum jest z prawej. Ograniczamy si do przedziau [lewy,b] a=lewy; lewy=(a+b-delta)/2; prawy=(a+b+delta)/2; end end % Za kocowe przyblienie szukanego minimum wemiemy rodek otrzymanego przedziau: min_szac=(a+b)/2; end
2.4
function [min_szac] = podzial_na_pol(funkcja,a,b,epsilon) % Okrelenie parametrw wejciowych, jeli nie s podane. if nargin<4 epsilon=0.01; if nargin<3 [a,b]=przedzial(funkcja); end end % Inicjalizacja zmiennych
x1=a+(b-a)/4; x2=(b+a)/2; x3=b-(b-a)/4; % Ptla while (b-a)>2*epsilon if (feval(funkcja,x1)<=feval(funkcja,x2)) & (feval(funkcja,x2)<=feval(funkcja,x3)) % minimum jest w lewej pwce b=x2; 10
x2=x1; x1=a+(b-a)/4; x3=b-(b-a)/4; else if (feval(funkcja,x1)>=feval(funkcja,x2)) & (feval(funkcja,x2)>=feval(funkcja,x3)) % minimum jest w prawej powce a=x2; x2=x3; x1=a+(b-a)/4; x3=b-(b-a)/4; else % trzeci przypadek: minimum jest w rodkowej pwce a=x1; b=x3; x1=a+(b-a)/4; x3=b-(b-a)/4; end end end % Za kocowe przyblienie szukanego minimum wemiemy rodek otrzymanego przedziau: min_szac=(a+b)/2; end
11