Laboratorium 5
Transkrypt
Laboratorium 5
Laboratorium Metod Optymalizacji 2016 Metody Optymalizacji Laboratorium nr 5 Minimalizacja funkcji nieliniowych bez ograniczeń – metody gradientowe, metoda Neldera-Meada 1. W sposób analityczny wyznaczyć oraz zbadać punkty krytyczne funkcji: 𝑓1 (𝒙) = 𝑥14 + 𝑥24 − 8𝑥12 − 2𝑥22 + 5 2. Pokazać w sposób analityczny, że funkcja Rosenbrocka ma minimum globalne w punkcie (1,1) 𝑓2 (𝒙) = 100(𝑥2 − 𝑥12 )2 + (1 − 𝑥1 )2 3. (1) (2) Dla podanych powyżej funkcji przeprowadzić procedurę optymalizacji z wykorzystaniem środowiska Matlab przy użyciu algorytmu: a) zaufanego obszaru (ang. trust region lub dużej skali), nie podając analitycznej postaci gradientu, b) zaufanego obszaru (ang. trust region lub dużej skali), podając analityczną postać gradientu, c) zaufanego obszaru (ang. trust region lub dużej skali), podając analityczną postać hesjanu, d) quasi newtonowskiego (ang. quasi-newton lub średniej skali), podając analityczną postać gradientu, wykorzystując metodę: i. Broydena – Fletchera – Goldfarba – Shanno (bfgs), ii. Davidona – Fletchera – Powella (dfp), iii. największego spadku (steepdesc), e) quasi newtonowskiego (ang. quasi-newton lub średniej skali), nie podając analitycznej postaci gradientu, wykorzystując metodę: i. Broydena – Fletchera – Goldfarba – Shanno (bfgs), ii. Davidona – Fletchera – Powella (dfp), iii. największego spadku (steepdesc), f) Neldera-Meada (fminsearch) Stworzyć funkcję: function [x_opt, f_opt, gradient, hessian, iter, x_val, f_val, grad_val] = minimalizacja(x0,alg) gdzie: x_opt – znalezione minimum, f_opt – wartość funkcji celu w minimum, gradient – wartość gradientu w minimum, hessian – wartość hesjanu w minimum, iter – liczba iteracji, x_val – wektor otrzymanych rozwiązań w danej iteracji, f_val – wektor wartości funkcji celu w danej iteracji, Opracował: Łukasz Kuczkowski Strona 1 Laboratorium Metod Optymalizacji 2016 grad_val – wektor wartości gradientu w danej iteracji, alg – rodzaj wykorzystywanego algorytmu (wpisanie odpowiedniej litery wybiera opcję od 3a do 3e, np. alg = 3dii – metoda quasi newtonowska, podając analityczną postać gradientu, dfp), x0 – punkt startowy Do przeprowadzenia optymalizacji wykorzystać funkcję fminunc. Funkcja minimalizacja powinna zawierać: funkcję celu wykładnicza i Rosenbrock wraz z gradientem i Hessianem, funkcję outFunction zapisującą do odpowiednich wektorów wartości x, f(x) oraz ∇𝑓(𝑥) w kolejnych iteracjach, definicję opcji (optimoptions) zmienianą w zależności od argumentu alg, wywołanie funkcji fminunc z odpowiednimi parametrami i punktem startowym Na podstawie otrzymanych danych w funkcji minimalizacja sporządzić wykresy: wartości funkcji celu w danej iteracji od numeru iteracji (zbieżność algorytmu), dla przypadku w którym nie podano analitycznej postaci gradientu – różnicy faktycznej wartości gradientu od wartości wyliczanej metodą różnic skończonych w danej iteracji, zwizualizować działanie algorytmu na trójwymiarowym wykresie funkcji celu, zaznaczając kolejne kroki wykonane przez algorytm (kolejne punkty zapisane w wektorze x_val i f_val nanieść na trójwymiarowy wykres funkcji celu i połączyć liniami). Sprawozdanie powinno zawierać: analityczne rozwiązanie zadania 1 oraz 2, kompletny kod programu wykorzystany do przeprowadzenia optymalizacji w zadaniu 3 (definicje, poszczególnych funkcji i m-plików), kod programu wykorzystany do tworzenia wykresów, wykresy dla każdej metody, porównanie zastosowanych metod, wnioski i spostrzeżenia. Opracował: Łukasz Kuczkowski Strona 2 Laboratorium Metod Optymalizacji 2016 Pomoc: Problem optymalizacji nieliniowej bez ograniczeń Problem optymalizacji nieliniowej bez ograniczeń polega na znalezieniu wektora x minimalizującego lokalnie skalarną funkcję 𝑓(𝒙): min𝑥 𝑓(𝒙) (3) Metoda obszaru zaufania (trust-region method) dla zagadnienia minimalizacji bez ograniczeń Rozważmy problem minimalizacji funkcji skalarnej 𝑓(𝒙) bez ograniczeń. Załóżmy, że punkt x znajduje się w n-wymiarowej przestrzeni i chcemy przejść z punktu x do punktu 𝒙’ takiego, że wartość funkcji celu 𝑓(𝒙′ ) < 𝑓(𝒙). Metoda obszaru zaufania polega na przybliżaniu funkcji f inną, prostszą funkcją q, która w pewnym stopniu oddaje przebieg funkcji f w sąsiedztwie N punktu x. Sąsiedztwo to nazywamy obszarem zaufania. Krok próbny s jest wyliczany przez minimalizację w obszarze N. Tak zdefiniowany problem nazywamy podproblemem obszaru zaufania: min𝑠 {𝑞(𝑠), 𝑠 ∈ 𝑁} (4) Przejście z punktu x do punktu x + s następuje tylko jeżeli: 𝑓(𝑥 + 𝑠) < 𝑓(𝑥) (5) W innym przypadku punkt x pozostaje niezmieniony, obszar zaufania N ulega zawężeniu, a krok próbny zostaje powtórzony. W standardowej metodzie obszaru zaufania funkcja f jest aproksymowana przez wielomian drugiego stopnia q definiowany jako dwa pierwsze wyrazy szeregu Taylora. Sąsiedztwo N jest zazwyczaj sferyczne lub elipsoidalne. Matematycznie podproblem obszaru zaufania można zapisać jako: 1 min𝑠 {2 𝑠 𝑇 𝐻𝑠 + 𝑠 𝑇 𝑔 takie, że ‖𝐷𝑠‖ ≤ ∆} (6) gdzie: g –gradient funkcji f w punkcie x H – macierz Hessego w punkcje x D – macierz diagonalna skalowań ∆ - skalarna wartość dodatnia ||.|| - norma euklidesowa Algorytmy zastosowane w środowisku Matlab zakładają uproszczenie podproblemu obszaru zaufania do dwuwymiarowej przestrzeni S. Przestrzeń S jest określana za pomocą metody gradientów sprzężonych. Algorytm definiuje S jako przestrzeń liniową ograniczoną przez s1 i s2, gdzie: Opracował: Łukasz Kuczkowski Strona 3 Laboratorium Metod Optymalizacji 2016 s1 – kierunek określony przez gradient g, s2 – kierunek poszukiwań (określony w metodzie Newtona lub przez krzywiznę krzywej). Podsumowując, metodę obszaru zaufania można przedstawić w postaci algorytmu: 1. określić dwuwymiarowy podproblem obszaru zaufania, 2. rozwiązać równanie (6) w celu określenia kroku próbnego s, 3. jeżeli 𝑓(𝑥 + 𝑠) < 𝑓(𝑥) to 𝑥 = 𝑥 + 𝑠, 4. uaktualnić ∆. Metody quasi-newtonowskie Zgodnie z informacjami podanymi na wykładzie z przedmiotu Metody Optymalizacji. Dodatkowe informacje o opisanych metodach można znaleźć w pomocy Matlab: http://www.mathworks.com/help/optim/ug/unconstrained-nonlinear-optimizationalgorithms.html#brnoxxo Metoda różnic skończonych Metoda różnic skończonych jest metodą numeryczną pozwalającą na rozwiązywanie równań różniczkowych przez przybliżanie ich równaniami różnicowymi, w których różnice skończone przybliżają pochodne. Metoda różnic skończonych jest więc metodą dyskretyzacji. Przybliżenie uzyskane metodą ma charakter lokalny i odnosi się tylko do wybranego punktu lub jego bliskiego sąsiedztwa. Poniżej przedstawiono przykład wyznaczenia pochodnej funkcji w punkcie x0 za pomocą metody różnic skończonych. Załóżmy, że funkcja 𝑓(𝑥) spełnia założenia twierdzenia Taylora. Możemy więc rozwinąć ją w szereg zgodnie ze wzorem: 𝑓(𝑥0 + ℎ) = 𝑓(𝑥0 ) + 𝑓′(𝑥0 ) 1! ℎ+ 𝑓 (2) (𝑥0 ) 2! ℎ2 + ⋯ + 𝑓 (𝑛) (𝑥0 ) 𝑛! ℎ𝑛 + 𝑅𝑛 (𝑥) (7) gdzie: 𝑓 (𝑛) (𝑥) – pochodna funkcji 𝑓(𝑥) n-tego rzędu, 𝑅𝑛 (𝑥) – reszta (Peano) we wzorze Taylora. Przybliżenie pochodnej funkcji f wyprowadzamy z rozwinięcia do drugiego wyrazu szeregu Taylora: 𝑓(𝑥0 + ℎ) = 𝑓(𝑥0 ) + 𝑓 ′ (𝑥0 )ℎ + 𝑅1 (𝑥) (8) Dzieląc obustronnie przez h otrzymujemy: 𝑓(𝑥0 +ℎ) ℎ Opracował: Łukasz Kuczkowski = 𝑓(𝑥0 ) ℎ + 𝑓 ′ (𝑥0 ) + 𝑅1 (𝑥) ℎ (9) Strona 4 Laboratorium Metod Optymalizacji 2016 Zapisując równanie względem 𝑓′(𝑥0 ): 𝑓 ′ (𝑥0 ) = 𝑓(𝑥0 +ℎ)−𝑓(𝑥0 ) ℎ − 𝑅1 (𝑥) (10) ℎ Zakładając, że 𝑅1 (𝑥) jest pomijalnie mały otrzymujemy wzór na pochodną w punkcje x0: 𝑓 ′ (𝑥0 ) ≈ 𝑓(𝑥0 +ℎ)−𝑓(𝑥0 ) ℎ (11) fminunc Funkcja fminunc służy do rozwiązywania zagadnień minimalizacji nieliniowej bez ograniczeń. Funkcja jest wywoływana za pomocą komendy: [x,fval,exitflag,output,grad,hessian] = fminunc(@fun, x0, options) gdzie: x fval exitflag output grad hessian fun x0 options – wyznaczone minimum, – wartość funkcji celu dla minimum, – flaga informująca o przyczynie zatrzymania algorytmu, – struktura zawierająca informacje o procesie optymalizacji, – wartość gradientu w minimum, – wartość hesjanu w minimum, – uchwyt do zdefiniowanej funkcji celu, – punkt początkowy, – struktura ustawień algorytmu definiowana za pomocą polecenia optimoptions Dokładny opis wszystkich wartości zwracanych oraz przyjmowanych argumentów znajduje się w pliku pomocy Matlab: http://www.mathworks.com/help/optim/ug/fminunc.html?searchHighlight=fminunc Definiowanie funkcji celu fminunc wymaga podania funkcji celu w postaci skalarnej. Skalarna funkcja celu przyjmuje jedno wejście, np. x, które może być skalarem, wektorem lub macierzą. Funkcja może zwracać więcej niż jedną wartość. Funkcja celu może być zapisana na kilka sposobów: Załóżmy, że funkcja celu 𝑓(𝑥) = 10𝑥 5 + 10𝑦 5 + 5𝑥 3 + 5𝑦 3 + 𝑥 2 + 𝑦 2 (12) 1. W postaci osobnego m-pliku a) zapisać funkcję przyjmującą wektor we = [x, y] oraz zwracającą wartość f w samodzielnym m-pliku w postaci: Opracował: Łukasz Kuczkowski Strona 5 Laboratorium Metod Optymalizacji 2016 function f = funkcjaCelu(we) f = 10*we(1).^5 + 10*we(2).^5 + 5*we(1).^3 + 5*we(2).^3 + we(1).^2 + we(2).^2; b) zapisać m-plik w folderze roboczym Matlab pod nazwą funkcjaCelu.m (nazwa funkcji musi być taka sama jak nazwa m-pliku) c) sprawdzić działanie funkcji przez wywołanie z linii komend: wartosc = funkcjaCelu([1 1]) 2. W postaci funkcji lokalnej lub zagnieżdżonej: Funkcje mogę być tworzone wewnątrz innych plików lub jako funkcje lokalne w innych funkcjach. Pozwala to na zmniejszenie liczby m-plików oraz dostęp do dodatkowych parametrów w postaci zmiennych globalnych. Załóżmy, że chcemy stworzyć funkcję, która zwraca wynik minimalizacji dwóch różnych funkcji celu dla tego samego punktu początkowego. Zamiast zapisywać funkcje celu w osobnych m-plikach, można to zrobić w wykorzystaniem funkcji lokalnych: function [x, fval] = optymalizacja(x0) [x1, f1val] = fminunc(@funkcja1, x0); [x2, f2val] = fminunc(@funkcja2, x0); x = [x1; x2]; fval = [f1val; f2val]; function f1 = funkcja1(x) f1 = 10*x(1).^5 + 10*x(2).^5 + 5*x(1).^3 + 5*x(2).^3 + x(1).^2 + x(2).^2; function f2 = funkcja2(x) f2 = x(2).^3 + x(1).^2 + x(2).^2 + x(1); Wywołać funkcję optymalizacja(x0) z linii komend: [x, fval] = optymalizacja([1, 1]) 3. Za pomocą funkcji anonimowej: Jeżeli funkcje celu nie jest skomplikowana, może zostać zapisana w postaci funkcji anonimowej w dowolnym miejscu w m-pliku poprzedzającym jej wywołanie: funkcjaCelu = @(x)(10*x(1).^5 + 10*x(2).^5 + 5*x(1).^3 + 5*x(2).^3 + x(1).^2 + x(2).^2); Uwzględnianie analitycznej postaci gradientu i hesjanu Używając funkcji fminunc istnieje możliwość podania analitycznej postaci gradientu i hesjanu wraz z funkcją celu. Dla zapewnienia większej elastyczności kodu zaleca się stosowanie zapisu warunkowego. Oznacza to, że liczba wyjść zwracanych przez funkcję może się różnić w zależności od ustawień algorytmu. Napisanie funkcji bezwarunkowej powoduje błąd w przypadku nieprawidłowego wywołania, np. funkcja celu zapisana z Opracował: Łukasz Kuczkowski Strona 6 Laboratorium Metod Optymalizacji 2016 gradientem – wywołanie fminunc z ustawieniami niewykorzystującymi informacji o gradiencie. Dla funkcji celu (12): Aby uwzględnić analityczną postać gradientu należy napisać funkcję celu, która: jako pierwsze wyjście zwraca wartość funkcji celu, jako drugie wyjście zwraca wartość wektora gradientu. function [f, g] = funkcjaCelu(we) f = 10*we(1).^5 + 10*we(2).^5 + 5*we(1).^3 + 5*we(2).^3 + we(1).^2 + we(2).^2; if nargout > 1 g = [50*we(1).^4 + 15*we(1).^2 + 2*we(1); 50*we(2).^4 + 15*we(2).^2 + 2*we(2)]; end gdzie: nargout – sprawdza liczbę argumentów wyjściowych z jaką została wywołana funkcja Aby uwzględnić analityczną postać hesjanu należy napisać funkcję celu, która: jako pierwsze wyjście zwraca wartość funkcji celu, jako drugie wyjście zwraca wartość wektora gradientu, jako trzecie wyjście zwraca wartość macierzy Hessego. function [f, g, H] = funkcjaCelu(we) f = 10*we(1).^5 + 10*we(2).^5 + 5*we(1).^3 + 5*we(2).^3 + we(1).^2 + we(2).^2; if nargout > 1 g = [50*we(1).^4 + 15*we(1).^2 + 2*we(1); 50*we(2).^4 + 15*we(2).^2 + 2*we(2)]; if nargout > 2 H = [200*we(1).^3 + 30*we(1) + 2, 0; 0, 200*we(2).^3 + 30*we(2) + 2]; end end Niepodanie analitycznej postaci gradientu skutkuje przybliżeniem jego wartości za pomocą metody różnic skończonych. Podanie gradientu pozwala na zmniejszenie czasu obliczeń (w niektórych przypadkach, przy skomplikowanej funkcji celu obliczenie wartości gradientu metodą różnic skończonych może być szybsze) oraz uzyskanie większej dokładności. Niepodanie postaci analitycznej hesjanu skutkuje jego przybliżeniem za pomocą metody różnic skończonych (algorytm trust-region), a wyliczona wartość może znacząco różnić się od faktycznej, co spowoduje wydłużenie obliczeń. Ustawienie optimoptions Polecenie optimoptions tworzy strukturę ustawień dla danego algorytmu optymalizacji. Aby stworzyć domyślną strukturę ustawień należy utworzyć obiekt za pomocą polecenia optimoptions jako argument podając nazwę funkcji, np.: Opracował: Łukasz Kuczkowski Strona 7 Laboratorium Metod Optymalizacji 2016 options = optimoptions(‘fminunc’); Wywołanie obiektu options z linii poleceń wypisze użyte ustawienia: options = fminunc options: Options used by current Algorithm ('trust-region'): (Other available algorithms: 'quasi-newton') Set properties: No options set. Default properties: Algorithm: CheckGradients: Display: FiniteDifferenceStepSize: FiniteDifferenceType: FunctionTolerance: HessianFcn: HessianMultiplyFcn: MaxFunctionEvaluations: MaxIterations: OptimalityTolerance: OutputFcn: PlotFcn: SpecifyObjectiveGradient: StepTolerance: SubproblemAlgorithm: TypicalX: 'trust-region' 0 'final' 'sqrt(eps)' 'forward' 1.0000e-06 [] [] '100*numberOfVariables' 400 1.0000e-06 [] [] 0 1.0000e-06 'cg' 'ones(numberOfVariables,1)' Show options not used by current Algorithm ('trust-region') Możliwe jest również tworzenie struktury options podając od razu własne ustawienia. W takim przypadku po nazwie funkcji należy podać parametry, np.: options = optimoptions('fminunc','Display','iter','MaxIterations',1000); options = fminunc options: Options used by current Algorithm ('trust-region'): (Other available algorithms: 'quasi-newton') Set properties: Display: 'iter' MaxIterations: 1000 Default properties: Algorithm: CheckGradients: FiniteDifferenceStepSize: FiniteDifferenceType: FunctionTolerance: Opracował: Łukasz Kuczkowski 'trust-region' 0 'sqrt(eps)' 'forward' 1.0000e-06 Strona 8 Laboratorium Metod Optymalizacji 2016 HessianFcn: HessianMultiplyFcn: MaxFunctionEvaluations: OptimalityTolerance: OutputFcn: PlotFcn: SpecifyObjectiveGradient: StepTolerance: SubproblemAlgorithm: TypicalX: [] [] '100*numberOfVariables' 1.0000e-06 [] [] 0 1.0000e-06 'cg' 'ones(numberOfVariables,1)' Show options not used by current Algorithm ('trust-region') W powyższym przykładzie sposób wyświetlania został zmieniony na iter, a maksymalna liczba iteracji na 1000. Jeżeli obiekt options został wcześniej utworzony za pomocą polecenia optimoptions, jego pola mogą być modyfikowane bezpośrednio za pomocą operatora wyłuskania, np. options.MaxIterations = 500 options = fminunc options: Options used by current Algorithm ('trust-region'): (Other available algorithms: 'quasi-newton') Set properties: Display: 'iter' MaxIterations: 500 Default properties: Algorithm: CheckGradients: FiniteDifferenceStepSize: FiniteDifferenceType: FunctionTolerance: HessianFcn: HessianMultiplyFcn: MaxFunctionEvaluations: OptimalityTolerance: OutputFcn: PlotFcn: SpecifyObjectiveGradient: StepTolerance: SubproblemAlgorithm: TypicalX: 'trust-region' 0 'sqrt(eps)' 'forward' 1.0000e-06 [] [] '100*numberOfVariables' 1.0000e-06 [] [] 0 1.0000e-06 'cg' 'ones(numberOfVariables,1)' Show options not used by current Algorithm ('trust-region') Wykaz ważniejszych ustawień: Nazwa ustawienia Możliwe stany Opis Algorithm trust-region' (default) 'quasi-newton' Wybór algorytmu optymalizacji, metoda obszaru zaufania (domyślnie) lub quasi-newtona Opracował: Łukasz Kuczkowski Strona 9 Laboratorium Metod Optymalizacji 2016 Diagnostics Display MaxIterations OutputFcn 'off' (default) 'on' 'off' or 'none' 'iter' 'iter-detailed' 'notify' 'notify-detailed' 'final-detailed' liczba uchwyt do funkcji SpecifyObjectiveGradient false (0) true (1) HessianFcn [] 'objective' Wyświetla informacje diagnostyczne o funkcji, która ma być minimalizowana Zmienia sposób (liczbę) wyświetlanych informacji (dokładny opis każdej z opcji w pomocy Matlab) Maksymalna liczba iteracji Uchwyt do funkcji, która ma być wywołana po każdej iteracji Wyznaczenie wartości gradientu na podstawie postaci analitycznej z funkcji celu (true) lub za pomocą metody różnic skończonych (false) Tylko dla trust-region Wyznaczenie wartości hesjanu na podstawie postaci analitycznej z funkcji celu ('objective') lub za pomocą metody różnic skończonych ([]) Tylko dla quasi-newton HessUpdate 'bfgs'(default) 'dfp' Metoda uaktualnienia wartości hesjanu 'steepdesc' Po wprowadzeniu ustawień należy uwzględnić obiekt options przy wywoływaniu fminunc: [x, fval] = fminunc(@fun1, [10 10], options) Dokładny opis wszystkich ustawień znajduje się w pomocy Matlab: http://www.mathworks.com/help/optim/ug/optimoptions.html?searchHighlight=optimoptions http://www.mathworks.com/help/optim/ug/fminunc.html#inputarg_options Funkcja wyjściowa (Output Function) Pole ustawień OutputFcn pozwala na zdefiniowanie funkcji, które zostaną wywołane na koniec każdej iteracji algorytmu. Pozwalają one na odczytywanie stanu algorytmu, nie umożliwiają jednak żadnej zmiany ustawień. Aby dodać funkcję wyjściową należy: napisać funkcję w formie osobnego m-pliku lub jako funkcję lokalną, ustawić pole struktury optimoptions Outputfcn na uchwyt do funkcji: options = optimoptions(@solvername,'OutputFcn', @outfun); wywołać funkcję optymalizującą, np. fminunc z podanymi ustawieniami. Definicja funkcji wyjściowej musi być podana w następującej formie: function stop = outfun(x,optimValues,state) Opracował: Łukasz Kuczkowski Strona 10 Laboratorium Metod Optymalizacji 2016 gdzie: x – wartości x wyznaczone w danej iteracji, optimValues – struktura zawierająca dane z aktualnej iteracji (patrz pomoc Matlab), state – aktualny stan algorytmu, stop – flaga określająca czy algorytm ma się zatrzymać (true) czy działać dalej (false), Przykład: Poniżej przestawiono przykład funkcji, która wykorzystując funkcje lokalne i funkcję wyjściową zwraca wektor rozwiązań i wartości funkcji celu dla każdej iteracji funkcji fminunc: function [xval, fval] = myfminunc xval = []; fval = []; x0 = [-1 1]; options = optimoptions(@fminunc,'Algorithm','trust-region',... 'Display','iter',... 'SpecifyObjectiveGradient',true,... 'HessianFcn','objective',... 'OutputFcn',@outfun,... 'MaxIterations',1000); solution = fminunc(@objfun,x0,options); function stop = outfun(x,optimValues,~) stop = false; fval = [fval; optimValues.fval]; xval = [xval; x]; end function [f, g, H] = objfun(we) f = 10*we(1).^5 + 10*we(2).^5 + 5*we(1).^3 + 5*we(2).^3 + we(1).^2 + we(2).^2; if nargout > 1 g = [50*we(1).^4 + 15*we(1).^2 + 2*we(1); 50*we(2).^4 + 15*we(2).^2 + 2*we(2)]; if nargout > 2 H = [200*we(1).^3 + 30*we(1) + 2, 0; 0, 200*we(2).^3 + 30*we(2) + 2]; end end end end Dokładny opis funkcji wyjściowych znajduje się w pomocy Matlab: http://www.mathworks.com/help/optim/ug/outputfunction.html?searchHighlight=Output%20Function http://www.mathworks.com/help/optim/ug/output-functions.html Opracował: Łukasz Kuczkowski Strona 11