You are on page 1of 11

Metody optymalizacji - laboratorium 2

Wstp do Octave. Joanna Dys 28 padziernika 2010

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:

Wtorki, 12-13, sala F-24.


1

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

Jak si nauczy Octave?

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

Octave jako kalkulator

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):

x=linspace(0,2*pi,1000); y=sin(x); plot(x,y)

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

Skrypty optymalizacyjne w Octave


Znalezienie przedziau, w ktrym jest minimum

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

Zoty podzia odcinka

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

Dychotomiczny podzia odcinka

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

Metoda podziau odcinka na p

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

You might also like