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 i1
(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  sinxdata 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