Funkcje do rozwiązywania zadań optymalizacji z pakietu Matlab`a
Transkrypt
Funkcje do rozwiązywania zadań optymalizacji z pakietu Matlab`a
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ż. 1 1. Wprowadzenie W środowisku MATLAB’a dostępne są biblioteki (ang. toolbox) z procedurami wspomagającymi obliczenia numeryczne znajdujące różne zastosowania. Jedną z takich bibliotek jest Optimization Toolbox, która dostarcza szereg narzędzi i funkcji do optymalizacji. 2. Wybrane funkcje biblioteki Optimization Toolbox a). fminbnd – poszukiwanie minimum funkcji jednej zmiennej postaci: min f x (1) x1 x x 2 (2) x z ograniczeniami postaci: gdzie: x, x1 i x2 – skalary, f(x) – funkcja celu zmiennej x zwracająca wartość w postaci skalara. Składnia funkcji: x = fminbnd(fun,x1,x2) x = fminbnd(fun,x1,x2,options) [x,fval] = fminbnd(...) [x,fval,exitflag] = fminbnd(...) [x,fval,exitflag,output] = fminbnd(...) gdzie: x – szukane rozwiązanie zadania optymalizacji, fun – funkcja celu zmiennej, x1, x2 – odpowiednio dolne i górne ograniczenie na zmienną x, 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 optymalizacji, exitflag – “flaga wyjściowa”, czyli komunikat wyjściowy o stanie solver’a, output – struktura zawierająca informacje o wykonaniu zadania optymalizacji. Przykład 1 Znajdź minimum funkcji y x 2 1 z przedziału <-3,0>. Przykładowy m-plik może być postaci: 2 Function wyj=myfun(x) wyj=x.^2-1; Workspace: x=fminbnd(@myfun,-3,0) b). fmincon – poszukiwanie minimum nieliniowej funkcji wielu zmiennych postaci: min f x x (3) z liniowymi i nieliniowymi oraz z równościowymi i nierównościowymi ograniczeniami postaci: c x 0 ceq x 0 A x b Aeq x beq (4) lb x ub gdzie: x – wektor zmiennych o wymiarze [1xm], gdzie m – liczba zmiennych zadania optymalizacji, b, beq – wektory odpowiednio o wymiarach [n x 1] i [k x 1], lb, ub – ograniczenia na zmienne w postaci wektorów o wymiarach [1xm], A, Aeq – macierze ograniczeń liniowych nierównościowych i równościowych o wymiarach odpowiednio [m x n] oraz [m x k], c(x), ceq(x) - 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 x, f(x) - jest funkcja celu zwracającą wartość w postaci skalara dla danego wektora argumentów x. Składnia funkcji: x = fmincon(fun,x0,A,b) x = fmincon(fun,x0,A,b,Aeq,beq) x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub) x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) [x,fval] = fmincon(...) [x,fval,exitflag] = fmincon(...) [x,fval,exitflag,output] = fmincon(...) gdzie: x – szukane rozwiązanie zadania optymalizacji, fun – nieliniowa funkcja celu wektora zmiennych x, 3 x0 – wektor startowy, którego wielkość zależy od liczby zmiennych zadania optymalizacji, b, beq – wektory odpowiednio o wymiarach [n x 1] i [k x 1], lb, ub – ograniczenia na zmienne w postaci wektorów o wymiarach [1xm], A, Aeq – macierze ograniczeń liniowych nierównościowych i równościowych o wymiarach odpowiednio [m x n] oraz [m x 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 optymalizacji, exitflag – “flaga wyjściowa”, czyli komunikat wyjściowy o stanie solver’a, output – struktura zawierająca informacje o wykonaniu zadania optymalizacji. Przykład 2 Znajdź takie x, które minimalizuje funkcję f x x1 x 2 x 3 , punkt startowy x0 = [10; 10; 10] i spełnia ograniczenia: 0 x1 2 x 2 2 x 3 72 . Przykładowa funkcja celu zapisana w postaci m-pliku: function f = myfun(x) f = -x(1) * x(2) * x(3); Ograniczenia są liniowe więc można przedstawić je w postaci macierzy A i b: A 1, 2, 2; 1, 2, 2 , b 0, 72 Następnie określamy wektor startowy jak w poleceniu: x 0 10; 10; 10 . Wywołując poniższą komendę otrzymamy rozwiązanie zadania optymalizacji: [x,fval] = fmincon(@myfun,x0,A,b) c). fminsearch – poszukiwanie minimum funkcji wielu zmiennych bez ograniczeń (metoda gradientowa) postaci: min f x x (5) gdzie: x – wektor zmiennych, którego wielkość zależy od liczby zmiennych zadania optymalizacji, f(x) - jest funkcja celu zwracającą wartość w postaci skalara dla danego wektora argumentów x. 4 Składnia funkcji: x = fminsearch(fun,x0) x = fminsearch(fun,x0,options) [x,fval] = fminsearch(...) [x,fval,exitflag] = fminsearch(...) [x,fval,exitflag,output] = fminsearch(...) gdzie: x – szukane rozwiązanie zadania optymalizacji, fun – nieliniowa funkcja wielu zmiennych zależna od x, x0 – wektor startowy, którego wielkość zależy od liczby zmiennych zadania optymalizacji, 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, exitflag – “flaga wyjściowa”, czyli komunikat wyjściowy o stanie solver’a, output – struktura zawierająca informacje o wykonaniu zadania optymalizacji. Przykład 3 Znajdź takie x, dla której poniższa funkcja osiągnie minimum: f x 100 x 2 x12 1 x1 2 2 Przyjmij dowolny wektor startowy. Przykładowy m-plik może być postaci: Function ban = banana(x) ban = 100*(x(2)-x(1)^2)^2+(1-x(1))^2; Wywołując poniższą komendę otrzymamy rozwiązanie zadania optymalizacji: [x,fval] = fminsearch(banana,x0) d). quadprog – poszukiwanie minimum funkcji kwadratowej wielu zmiennych postaci: min x 1 T x Hx f T x 2 (6) z liniowymi ograniczeniami równościowymi i nierównościowymi postaci: A x b Aeq x beq lb x ub 5 (7) gdzie: x – wektor zmiennych o wymiarze [1xm], gdzie m – liczba zmiennych zadania optymalizacji, b, beq – wektory odpowiednio o wymiarach [n x 1] i [k x 1], lb, ub – ograniczenia na zmienne w postaci wektorów o wymiarach [1xm], A, Aeq – macierze ograniczeń liniowych nierównościowych i równościowych o wymiarach odpowiednio [m x n] oraz [m x k], f - jest funkcja celu w postaci wektora o wymiarze [m x 1] zwracającą wartość w postaci skalara dla danego wektora argumentów x. H – macierz wagowa o wymiarze [m x m]. Składnia funkcji: x = quadprog(H,f,A,b) x = quadprog(H,f,A,b,Aeq,beq) x = quadprog(H,f,A,b,Aeq,beq,lb,ub) x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0) x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options) [x,fval] = quadprog(...) [x,fval,exitflag] = quadprog(...) [x,fval,exitflag,output] = quadprog(...) gdzie: H – macierz wagowa, x – wektor zmiennych, którego wielkość zależy od liczby zmiennych zadania optymalizacji, 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 x, A, Aeq – macierze ograniczeń liniowych odpowiednio nierównościowych i równościowych, c(x), ceq(x) - 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 x, f(x) - jest funkcja celu zwracającą wartość w postaci skalara dla danego wektora argumentów x. 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, exitflag – “flaga wyjściowa”, czyli komunikat wyjściowy o stanie solver’a, output – struktura zawierająca informacje o wykonaniu zadania optymalizacji. Przykład 4 Znajdź takie x, dla której poniższa funkcja osiągnie minimum: 1 f ( x) x12 x22 x1 x2 2 x1 6 x2 2 6 spełniające ograniczenia: x1 x2 2 x1 2 x2 2 2 x1 x2 2 x1 , x2 0 Przyjmij dowolny wektor startowy. Powyższy problem należy najpierw zapisać w notacji macierzowej: 1 1 H , 1 2 - 2 f , - 6 x x 1 x2 Przykładowy m-plik może być postaci: H = [1 -1; -1 2]; f = [-2; -6]; A = [1 1; -1 2; 2 1]; b = [2; 2; 3]; lb = zeros(2,1); [x,fval,exitflag] = quadprog(H,f,A,b,[],[],lb) e). linprog – poszukiwanie minimum liniowej funkcji wielu zmiennych postaci: min f x T x (8) z liniowymi, równościowymi i nierównościowymi ograniczeniami postaci: A x b Aeq x beq (9) lb x ub gdzie: x – wektor zmiennych o wymiarze [1xm], gdzie m – liczba zmiennych zadania optymalizacji, b, beq – wektory odpowiednio o wymiarach [n x 1] i [k x 1], lb, ub – ograniczenia na zmienne w postaci wektorów o wymiarach [1xm], A, Aeq – macierze ograniczeń liniowych nierównościowych i równościowych o wymiarach odpowiednio [m x n] oraz [m x k], f - jest funkcja celu w postaci wektora o wymiarze [1 x m] zwracającą wartość w postaci skalara dla danego wektora argumentów x. Składnia funkcji: x = linprog(f,A,b) x = linprog(f,A,b,Aeq,beq) x = linprog(f,A,b,Aeq,beq,lb,ub) 7 x = linprog(f,A,b,Aeq,beq,lb,ub,x0) x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options) [x,fval] = linprog(...) [x,lambda,exitflag] = linprog(...) [x,lambda,exitflag,output] = linprog(...) gdzie: x – wektor zmiennych, którego wielkość zależy od liczby zmiennych zadania optymalizacji, 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 x, A, Aeq – macierze ograniczeń liniowych odpowiednio nierównościowych i równościowych, c(x), ceq(x) - 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 x, f - jest funkcja celu w postaci wektora zwracającą wartość w postaci skalara dla danego wektora argumentów x. 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, exitflag – “flaga wyjściowa”, czyli komunikat wyjściowy o stanie solver’a, output – struktura zawierająca informacje o wykonaniu zadania optymalizacji. Przykład 5 Znajdź takie x, które minimalizuje funkcje f x 5x1 4 x 2 6 x 3 z ograniczeniami: x1 x 2 x 3 20 3 x1 2 x 2 4 x 3 42 3 x1 2 x 2 30 x1 0 x2 0 x3 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: A 1, 1, 1; 3, 2, 4; 3, 2, 0 , b 20; 42; 30 Ograniczenia na zmienne są postaci: lb = zeros(3,1); 8 Wywołując poniższą komendę otrzymamy rozwiązanie zadania optymalizacji: [x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb); f). lsqcurverfit – poszukiwanie parametrów x funkcji ydata=f(xdata,x) mając dane opis matematyczny funkcji f i eksperymentalne dane: argumenty funkcji xdata oraz wartości funkcji ydata. Polecenie rozwiązuje problem szukania parametrów funkcji postaci: min x 1 F x, xdata ydata 2 2 2 1 m 2 F x, xdata i ydata i 2 i1 (10) gdzie: x – parametry funkcji f o wymiarze [1 x m], xdata – wektor danych eksperymentalnych argumentów funkcji o wymiarze [1 x n], ydata – wektor danych eksperymentalnych wartości funkcji o wymiarze [1 x n] (np. reakcja obiektu na sterowania xdata), F(x, xdata) – funkcja zależna o parametru x i danych wejściowych xdata zwracająca wartość w postaci skalara. Składnia funkcji: x = lsqcurvefit(fun,x0,xdata,ydata) x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub) x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options) [x,resnorm] = lsqcurvefit(...) [x,resnorm,residual] = lsqcurvefit(...) [x,resnorm,residual,exitflag] = lsqcurvefit(...) [x,resnorm,residual,exitflag,output] = lsqcurvefit(...) gdzie: x – szukane rozwiązanie zadania optymalizacji, fun –funkcja celu zależna od x i od xdata, resnorm – wartość normy kwadratowej dla rozwiązania zadania optymalizacji x, residual – wartość reszty F(x,data)-ydata dla rozwiązania zadania optymalizacji x, exitflag – “flaga wyjściowa”, czyli komunikat wyjściowy o stanie solver’a, output – struktura zawierająca informacje o wykonaniu zadania optymalizacji. Przykład 6 Dla danych argumentów i wartości funkcji znajdź parametry x1 i x2 taki aby poniższe równanie zostało spełnione. ydata (i) x1 xdata i x2 sinxdata i xdata i 2 2 Przykładowy m-plik z funkcją może być postaci: 9 Function F = myfun(x,xdata) F(x,xdata) = x(1)*xdata.^2 + x(2)*sin(xdata) + x(3)*xdata.^3 Wywołując poniższe komendy otrzymamy rozwiązanie zadania optymalizacji: xdata = [3.6 7.7 9.3 4.1 8.6 2.8 1.3 7.9 10.0 5.4]; ydata = [16.5 150.6 263.1 24.7 208.5 9.9 2.7 163.9 325.0 54.3]; x0 = [10, 10, 10] ; [x,resnorm] = lsqcurvefit(@myfun,x0,xdata,ydata) g). bintprog – poszukiwanie minimum liniowej funkcji wielu zmiennych binarnych w postaci: min f x x (11) z liniowymi, równościowymi i nierównościowymi ograniczeniami postaci: A x b Aeq x beq x 0,1 (12) gdzie: x – wektor zmiennych o wymiarze [1 x m], gdzie m – liczba zmiennych zadania optymalizacji, b, beq – wektory odpowiednio o wymiarach [n x 1] i [k x 1], lb, ub – ograniczenia na zmienne w postaci wektorów o wymiarach [1xm], A, Aeq – macierze ograniczeń liniowych nierównościowych i równościowych o wymiarach odpowiednio [m x n] oraz [m x k], f - jest funkcja celu w postaci wektora o wymiarze [m x 1] zwracającą wartość w postaci skalara dla danego wektora argumentów x. Składnia funkcji: x = bintprog(f) x = bintprog(f,A,b) x = bintprog(f,A,b,Aeq,beq) x = bintprog(f,A,b,Aeq,beq,x0) x = bintprog(f,A,b,Aeq,Beq,x0,options) [x, fval] = bintprog(...) [x,fval,exitflag] = bintprog(...) [x,fval,exitflag,output] = bintprog(...) gdzie: x – wektor zmiennych, którego wielkość zależy od liczby zmiennych zadania optymalizacji, 10 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 x, A, Aeq – macierze ograniczeń liniowych odpowiednio nierównościowych i równościowych, c(x), ceq(x) - 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 x, f - jest funkcja celu w postaci wektora zwracającą wartość w postaci skalara dla danego wektora argumentów x. 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 x, exitflag – “flaga wyjściowa”, czyli komunikat wyjściowy o stanie solver’a, output – struktura zawierająca informacje o wykonaniu zadania optymalizacji. Przykład 7 Znajdź minimum funkcji f x 9 x1 5x2 6 x3 4 x4 z ograniczeniami 6 x1 3x2 5 x3 2 x4 9 x3 x 4 1 x1 x3 0 x2 x4 0 ,gdzie: x1 , x2 , x3 , x4 0,1 Przykładowy m-plik z funkcją może być postaci: f = [-9; -5; -6; -4]; A = [6 3 5 2; 0 0 1 1; -1 0 1 0; 0 -1 0 1]; b = [9; 1; 0; 0]; x = bintprog(f,A,b) h). optimget – pobieranie parametrów zadania optymalizacji Składnia funkcji: val = optimget(options,'param') val = optimget(options,'param',default) gdzie: options - struktura z zapisanymi parametrami optymalizacji, 'param' – parametr optymalizacji, który chcemy pobrać. 11 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 Składnia funkcji: options = optimset('param1',value1,'param2',value2,...) optimset options = optimset options = optimset(optimfun) options = optimset(oldopts,'param1',value1,...) options = optimset(oldopts,newopts) gdzie: ‘param1’ – nazwa opcji, value1 – wartość danej opcji. Ważniejsze nazwy opcji oraz możliwe jej wartości (w nawiasach {} wartości domyślne) przedstawiono w tabeli 1. Tabela 1. Ważniejsze nazwy opcji funkcji optimset Nazwa opcji Dopuszczalne wartości 'on' | {'off'} Diagnostics Display {'off'} | 'iter' | 'final' | 'notify' {'off'} | 'on' FunValCheck 'on' | {'off'} LargeScale MaxIter TolFun TolX Liczba całkowita Dodatnia wartość skalarna Dodatnia wartość skalarna 12 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 Toolbox for use with Matlab. Natick, 2001. 13