Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania Struktury i Algorytmy Wspomagania Decyzji Zapoznanie z narzędziami optymalizacyjnymi w środowisku MATLAB Materiały pomocnicze do zajęć projektowych Opracowanie: Kazimierz Duzinkiewicz, dr hab. inż. Robert Piotrowski, dr inż. Arkadiusz Cimiński, mgr inż.
. Wprowadzenie W środowisku MATLAB a dostępne są biblioteki (ang. toolbo) z procedurami wspomagającymi obliczenia numeryczne znajdujące różne zastosowania. Jedną z takich bibliotek jest Optimization Toolbo, która dostarcza szereg narzędzi i funkcji do optymalizacji.. Wybrane funkcje biblioteki Optimization Toolbo a). fminbnd poszukiwanie minimum funkcji jednej zmiennej postaci: z ograniczeniami postaci: min f () (), i skalary, f() funkcja celu zmiennej zwracająca wartość w postaci skalara. = fminbnd(fun,,) = fminbnd(fun,,,options) [,fval] = fminbnd(...) [,fval,eitflag] = fminbnd(...) [,fval,eitflag,output] = fminbnd(...) szukane rozwiązanie zadania fun funkcja celu zmiennej,, odpowiednio dolne i górne ograniczenie na zmienną, options zmienna w postaci struktury z zapisanymi informacjami o procesie rozwiązywania zadania optymalizacji (strukturę tę modyfikuje się wykorzystując polecenie optimset), fval wartość funkcji celu dla rozwiązania zadania eitflag flaga wyjściowa, czyli komunikat wyjściowy o stanie solver a, Przykład Znajdź minimum funkcji y z przedziału <-3,0>. Przykładowy m-plik może być postaci:
Function wyj=myfun() wyj=.^-; Workspace: =fminbnd(@myfun,-3,0) b). fmincon poszukiwanie minimum nieliniowej funkcji wielu zmiennych postaci: min f (3) z liniowymi i nieliniowymi oraz z równościowymi i nierównościowymi ograniczeniami postaci: c ceq 0 A b 0 Aeq beq lb ub wektor zmiennych o wymiarze [m], gdzie m liczba zmiennych zadania b, beq wektory odpowiednio o wymiarach [n ] i [k ], lb, ub ograniczenia na zmienne w postaci wektorów o wymiarach [m], A, Aeq macierze ograniczeń liniowych nierównościowych i równościowych o wymiarach odpowiednio [m n] oraz [m k], c(), ceq() - ograniczenia nieliniowe w postaci układów równań odpowiednio nierównościowych i równościowych w postaci funkcji zwracających wartości ograniczeń w postaci wektorów dla danego argumentu, f() - jest funkcja celu zwracającą wartość w postaci skalara dla danego wektora argumentów. (4) = fmincon(fun,0,a,b) = fmincon(fun,0,a,b,aeq,beq) = fmincon(fun,0,a,b,aeq,beq,lb,ub) = fmincon(fun,0,a,b,aeq,beq,lb,ub,nonlcon) = fmincon(fun,0,a,b,aeq,beq,lb,ub,nonlcon,options) [,fval] = fmincon(...) [,fval,eitflag] = fmincon(...) [,fval,eitflag,output] = fmincon(...) szukane rozwiązanie zadania fun nieliniowa funkcja celu wektora zmiennych, 3
0 wektor startowy, którego wielkość zależy od liczby zmiennych zadania b, beq wektory odpowiednio o wymiarach [n ] i [k ], lb, ub ograniczenia na zmienne w postaci wektorów o wymiarach [m], A, Aeq macierze ograniczeń liniowych nierównościowych i równościowych o wymiarach odpowiednio [m n] oraz [m k], nonlcon funkcja opisująca ograniczenia nieliniowe równościowe i nierównościowe, options zmienna w postaci struktury z zapisanymi informacjami o procesie rozwiązywania zadania optymalizacji (strukturę tę modyfikuje się wykorzystując polecenie optimset), fval wartość funkcji celu dla rozwiązania zadania eitflag flaga wyjściowa, czyli komunikat wyjściowy o stanie solver a, Przykład Znajdź takie, które minimalizuje funkcję f 3, punkt startowy 0 = [0; 0; 0] i spełnia ograniczenia: 0 3 7. Przykładowa funkcja celu zapisana w postaci m-pliku: function f = myfun() f = -() * () * (3); Ograniczenia są liniowe więc można przedstawić je w postaci macierzy A i b:,, ;,, b 0, 7 A, Następnie określamy wektor startowy jak w poleceniu: 0 0; 0; 0. Wywołując poniższą komendę otrzymamy rozwiązanie zadania optymalizacji: [,fval] = fmincon(@myfun,0,a,b) c). fminsearch poszukiwanie minimum funkcji wielu zmiennych bez ograniczeń (metoda gradientowa) postaci: min f (5) wektor zmiennych, którego wielkość zależy od liczby zmiennych zadania f() - jest funkcja celu zwracającą wartość w postaci skalara dla danego wektora argumentów. 4
= fminsearch(fun,0) = fminsearch(fun,0,options) [,fval] = fminsearch(...) [,fval,eitflag] = fminsearch(...) [,fval,eitflag,output] = fminsearch(...) szukane rozwiązanie zadania fun nieliniowa funkcja wielu zmiennych zależna od, 0 wektor startowy, którego wielkość zależy od liczby zmiennych zadania options zmienna w postaci struktury z zapisanymi opcjami rozwiązania zadania optymalizacji (strukturę tę modyfikuje się wykorzystując polecenie optimset), fval wartość funkcji celu dla rozwiązania zadania eitflag flaga wyjściowa, czyli komunikat wyjściowy o stanie solver a, Przykład 3 Znajdź takie, dla której poniższa funkcja osiągnie minimum: Przyjmij dowolny wektor startowy. 00 f Przykładowy m-plik może być postaci: Function ban = banana() ban = 00*(()-()^)^+(-())^; Wywołując poniższą komendę otrzymamy rozwiązanie zadania optymalizacji: [,fval] = fminsearch(banana,0) d). quadprog poszukiwanie minimum funkcji kwadratowej wielu zmiennych postaci: T T min H f (6) z liniowymi ograniczeniami równościowymi i nierównościowymi postaci: A b Aeq beq lb ub (7) 5
wektor zmiennych o wymiarze [m], gdzie m liczba zmiennych zadania b, beq wektory odpowiednio o wymiarach [n ] i [k ], lb, ub ograniczenia na zmienne w postaci wektorów o wymiarach [m], A, Aeq macierze ograniczeń liniowych nierównościowych i równościowych o wymiarach odpowiednio [m n] oraz [m k], f - jest funkcja celu w postaci wektora o wymiarze [m ] zwracającą wartość w postaci skalara dla danego wektora argumentów. H macierz wagowa o wymiarze [m m]. = quadprog(h,f,a,b) = quadprog(h,f,a,b,aeq,beq) = quadprog(h,f,a,b,aeq,beq,lb,ub) = quadprog(h,f,a,b,aeq,beq,lb,ub,0) = quadprog(h,f,a,b,aeq,beq,lb,ub,0,options) [,fval] = quadprog(...) [,fval,eitflag] = quadprog(...) [,fval,eitflag,output] = quadprog(...) H macierz wagowa, wektor zmiennych, którego wielkość zależy od liczby zmiennych zadania b, beq wektory, których wielkość zależy od liczby ograniczeń liniowych, odpowiednio nierównościowych i równościowych, lb, ub ograniczenia na zmienne w postaci wektorów, których wielkość zależy od wielkości wektora, A, Aeq macierze ograniczeń liniowych odpowiednio nierównościowych i równościowych, c(), ceq() - ograniczenia nieliniowe w postaci układów równań odpowiednio nierównościowych i równościowych w postaci funkcji zwracających wartości ograniczeń w postaci wektorów dla danego argumentu, f() - jest funkcja celu zwracającą wartość w postaci skalara dla danego wektora argumentów. options zmienna w postaci struktury z zapisanymi opcjami rozwiązania zadania optymalizacji (strukturę tę modyfikuje się wykorzystując polecenie optimset), fval wartość funkcji celu dla rozwiązania zadania eitflag flaga wyjściowa, czyli komunikat wyjściowy o stanie solver a, Przykład 4 Znajdź takie, dla której poniższa funkcja osiągnie minimum: f ( ) 6 6
spełniające ograniczenia: Przyjmij dowolny wektor startowy., 0 Powyższy problem należy najpierw zapisać w notacji macierzowej: H, f -, -6 Przykładowy m-plik może być postaci: H = [ -; - ]; f = [-; -6]; A = [ ; - ; ]; b = [; ; 3]; lb = zeros(,); [,fval,eitflag] = quadprog(h,f,a,b,[],[],lb) e). linprog poszukiwanie minimum liniowej funkcji wielu zmiennych postaci: min f T (8) z liniowymi, równościowymi i nierównościowymi ograniczeniami postaci: A b Aeq beq lb ub wektor zmiennych o wymiarze [m], gdzie m liczba zmiennych zadania b, beq wektory odpowiednio o wymiarach [n ] i [k ], lb, ub ograniczenia na zmienne w postaci wektorów o wymiarach [m], A, Aeq macierze ograniczeń liniowych nierównościowych i równościowych o wymiarach odpowiednio [m n] oraz [m k], f - jest funkcja celu w postaci wektora o wymiarze [ m] zwracającą wartość w postaci skalara dla danego wektora argumentów. = linprog(f,a,b) = linprog(f,a,b,aeq,beq) = linprog(f,a,b,aeq,beq,lb,ub) (9) 7
= linprog(f,a,b,aeq,beq,lb,ub,0) = linprog(f,a,b,aeq,beq,lb,ub,0,options) [,fval] = linprog(...) [,lambda,eitflag] = linprog(...) [,lambda,eitflag,output] = linprog(...) wektor zmiennych, którego wielkość zależy od liczby zmiennych zadania b, beq wektory, których wielkość zależy od liczby ograniczeń liniowych, odpowiednio nierównościowych i równościowych, lb, ub ograniczenia na zmienne w postaci wektorów, których wielkość zależy od wielkości wektora, A, Aeq macierze ograniczeń liniowych odpowiednio nierównościowych i równościowych, c(), ceq() - ograniczenia nieliniowe w postaci układów równań odpowiednio nierównościowych i równościowych w postaci funkcji zwracających wartości ograniczeń w postaci wektorów dla danego argumentu, f - jest funkcja celu w postaci wektora zwracającą wartość w postaci skalara dla danego wektora argumentów. options zmienna w postaci struktury z zapisanymi opcjami rozwiązania zadania optymalizacji (strukturę tę modyfikuje się wykorzystując polecenie optimset), fval wartość funkcji celu dla rozwiązania zadania eitflag flaga wyjściowa, czyli komunikat wyjściowy o stanie solver a, Przykład 5 f 5 4 6 z ograniczeniami: Znajdź takie, które minimalizuje funkcje 3 0 3 3 4 4 3 3 3 30 0 0 0 Funkcje celu można zapisać w postaci macierzowej: f 5; 4; 6 Ograniczenia są liniowe więc można przedstawić je w postaci macierzy A i b:,, ; 3,, 4; 3,, 0 b 0; 4; 30 A, Ograniczenia na zmienne są postaci: lb = zeros(3,); 8
Wywołując poniższą komendę otrzymamy rozwiązanie zadania optymalizacji: [,fval,eitflag,output,lambda] = linprog(f,a,b,[],[],lb); f). lsqcurverfit poszukiwanie parametrów funkcji ydata=f(data,) mając dane opis matematyczny funkcji f i eksperymentalne dane: argumenty funkcji data oraz wartości funkcji ydata. Polecenie rozwiązuje problem szukania parametrów funkcji postaci: min F (0) m, data ydata F, data i ydata i parametry funkcji f o wymiarze [ m], data wektor danych eksperymentalnych argumentów funkcji o wymiarze [ n], ydata wektor danych eksperymentalnych wartości funkcji o wymiarze [ n] (np. reakcja obiektu na sterowania data), F(, data) funkcja zależna o parametru i danych wejściowych data zwracająca wartość w postaci skalara. i = lsqcurvefit(fun,0,data,ydata) = lsqcurvefit(fun,0,data,ydata,lb,ub) = lsqcurvefit(fun,0,data,ydata,lb,ub,options) [,resnorm] = lsqcurvefit(...) [,resnorm,residual] = lsqcurvefit(...) [,resnorm,residual,eitflag] = lsqcurvefit(...) [,resnorm,residual,eitflag,output] = lsqcurvefit(...) szukane rozwiązanie zadania fun funkcja celu zależna od i od data, resnorm wartość normy kwadratowej dla rozwiązania zadania optymalizacji, residual wartość reszty F(,data)-ydata dla rozwiązania zadania optymalizacji, eitflag flaga wyjściowa, czyli komunikat wyjściowy o stanie solver a, Przykład 6 Dla danych argumentów i wartości funkcji znajdź parametry i taki aby poniższe równanie zostało spełnione. i data sin data i data ydata ( i) i Przykładowy m-plik z funkcją może być postaci: 9
Function F = myfun(,data) F(,data) = ()*data.^ + ()*sin(data) + (3)*data.^3 Wywołując poniższe komendy otrzymamy rozwiązanie zadania optymalizacji: data = [3.6 7.7 9.3 4. 8.6.8.3 7.9 0.0 5.4]; ydata = [6.5 50.6 63. 4.7 08.5 9.9.7 63.9 35.0 54.3]; 0 = [0, 0, 0] ; [,resnorm] = lsqcurvefit(@myfun,0,data,ydata) g). bintprog poszukiwanie minimum liniowej funkcji wielu zmiennych binarnych w postaci: min f () z liniowymi, równościowymi i nierównościowymi ograniczeniami postaci: A b Aeq beq () 0, wektor zmiennych o wymiarze [ m], gdzie m liczba zmiennych zadania b, beq wektory odpowiednio o wymiarach [n ] i [k ], lb, ub ograniczenia na zmienne w postaci wektorów o wymiarach [m], A, Aeq macierze ograniczeń liniowych nierównościowych i równościowych o wymiarach odpowiednio [m n] oraz [m k], f - jest funkcja celu w postaci wektora o wymiarze [m ] zwracającą wartość w postaci skalara dla danego wektora argumentów. = bintprog(f) = bintprog(f,a,b) = bintprog(f,a,b,aeq,beq) = bintprog(f,a,b,aeq,beq,0) = bintprog(f,a,b,aeq,beq,0,options) [, fval] = bintprog(...) [,fval,eitflag] = bintprog(...) [,fval,eitflag,output] = bintprog(...) wektor zmiennych, którego wielkość zależy od liczby zmiennych zadania 0
b, beq wektory, których wielkość zależy od liczby ograniczeń liniowych, odpowiednio nierównościowych i równościowych, lb, ub ograniczenia na zmienne w postaci wektorów, których wielkość zależy od wielkości wektora, A, Aeq macierze ograniczeń liniowych odpowiednio nierównościowych i równościowych, c(), ceq() - ograniczenia nieliniowe w postaci układów równań odpowiednio nierównościowych i równościowych w postaci funkcji zwracających wartości ograniczeń w postaci wektorów dla danego argumentu, f - jest funkcja celu w postaci wektora zwracającą wartość w postaci skalara dla danego wektora argumentów. options zmienna w postaci struktury z zapisanymi opcjami rozwiązania zadania optymalizacji (strukturę tę modyfikuje się wykorzystując polecenie optimset), fval wartość funkcji celu dla rozwiązania zadania optymalizacji, eitflag flaga wyjściowa, czyli komunikat wyjściowy o stanie solver a, Przykład 7 9 5 6 4 3 4 Znajdź minimum funkcji f 6 3 3 4 3 4 5 0 0 3 4 z ograniczeniami 9,,, 0,, 3 4 Przykładowy m-plik z funkcją może być postaci: f = [-9; -5; -6; -4]; A = [6 3 5 ; 0 0 ; - 0 0; 0-0 ]; b = [9; ; 0; 0]; = bintprog(f,a,b) h). optimget pobieranie parametrów zadania optymalizacji val = optimget(options,'param') val = optimget(options,'param',default) options - struktura z zapisanymi parametrami 'param' parametr który chcemy pobrać.
Przykład 8 Za pomocą poniższego polecenia można pobrać wartość właściwości Display struktury ustawień optymalizacji my_options: val = optimget(my_options,'display') lub zmienić jej wartość za pomocą polecenia: optnew = optimget(my_options,'display','final') i). optimset tworzenie lub edycja struktury z parametrami zadania optymalizacji options = optimset('param',value,'param',value,...) optimset options = optimset options = optimset(optimfun) options = optimset(oldopts,'param',value,...) options = optimset(oldopts,newopts) param nazwa opcji, value wartość danej opcji. Ważniejsze nazwy opcji oraz możliwe jej wartości (w nawiasach {} wartości domyślne) przedstawiono w tabeli. Tabela. Ważniejsze nazwy opcji funkcji optimset Nazwa opcji Dopuszczalne wartości Diagnostics 'on' {'off'} Display FunValCheck LargeScale MaIter TolFun TolX {'off'} 'iter' 'final' 'notify' {'off'} 'on' 'on' {'off'} Liczba całkowita Dodatnia wartość skalarna Dodatnia wartość skalarna
Przykład 9 Za pomocą poniższego polecenia można ustawić wartość właściwości Display struktury ustawień optymalizacji my_options: val = optimset(my_options,'display') lub zmienić jej wartość za pomocą polecenia: optnew = optimset(my_options,'display','final') Bibliografia The Mathworks. Optimization Toolbo for use with Matlab. Natick, 00. 3