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