Nieliniowa funkcja celu może należeć do jednej z poniższych klas:
NLF.NLF0 - brak jakichkolwiek informacji o pochodnych,
NLF.NLF1 - dostępne są analityczne pochodne pierwszego rzędu (gradient),
NLF.NLF2 - dostępne są analityczne pochodne pierwszego i drugiego rzędu (gradient i hessian),
NLF.FDNLF1 - pochodne analityczne pierwszego rzędu nie są dostępne, ale gradnient mogą one być aproksymowane za pomocą różnic dzielonych.
Obiekt reprezentujący funkcję celu
powinien należeć do podklasy
abstrakcyjnej klasy AbstractNLF.
W konstruktorze funkcji należy podać wymiar jej dziedziny.
Jeżeli stosowany jest algorytm optymalizacyjny wykorzystujący gradient,
to metoda evaluate obiektu reprezentującego
funkcję
powinna wyznaczać wartość gradientu.
Jeżeli stosowany jest algorytm optymalizacyjny wykorzystujący hessian,
to metoda evaluate obiektu reprezentującego
funkcję
powinna wyznaczać wartość hessianu.
Należy również ustalić punkt początkowy (startowy) algorytmu za pomocą
metody SetInitVector obiektu
reprezentującego funkcję
(patrz przykład).
Za pomocą metody setExpensive() z parametrem True można zmniejszyć ilość obliczanych pochodnych w celu przyspieszenia pracy algorytmu.
Przykład 6.1. Funkcja celu
from biz.sc.math.opt.nlf import * class TestFunction(AbstractNLF): def __init__(self, dim, type): AbstractNLF.__init__(self, dim, type) print "Function dimension : ", dim print "Function type : ", type def evaluate(self, x, fx, gx, Hx): "@sig void evaluate(double[ ] x, double[ ] fx, double[ ] gx, double[ ][ ] Hx)" if (fx != None): fx[0] = x[0]*x[0]+x[1]*x[1]-2*x[1] if (gx != None): gx[0] = 2*x[0] gx[1] = 2*x[1]-2 if (Hx != None): Hx[0][0] = Hx[1][1] = 2 Hx[0][1] = Hx[1][0] = 0 dim = 2 f = TestFunction(dim, NLF.NLF2) f.setInitVector([1.3,0.6]) f.setExpensive(TRUE) # if there is a real necessity
Wynik:
Function dimension : 2 Function type : 2