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