Metoda złotego podziału

Metoda złotego podziału – numeryczna metoda optymalizacji jednowymiarowej funkcji celu.

Algorytm ten może być używany przy minimalizacji kierunkowej razem z innymi metodami optymalizacji funkcji wielowymiarowych, takich jak metody gradientowe (np. metoda gradientu prostego, metoda Newtona) lub bezgradientowe (np. metoda Gaussa-Seidela, metoda Powella).

Innymi metodami optymalizacji jednowymiarowej są metoda dychotomii, metoda punktu środkowego, metoda Newtona.

Zadanie optymalizacji jednowymiarowej

Niech dana będzie funkcja celu f : {\displaystyle f{:}}

R D x f ( x ) R {\displaystyle \mathbb {R} \supset D\ni x\mapsto f(x)\in \mathbb {R} }

oraz przedział [ a , b ] D {\displaystyle [a,b]\subset D} w którym f {\displaystyle f} jest unimodalna (jest ciągła i posiada co najwyżej jedno ekstremum lokalne). Zadaniem optymalizacji jednowymiarowej funkcji f {\displaystyle f} jest znalezienie jej minimum w przedziale [ a , b ] . {\displaystyle [a,b].}

Warto podkreślić fakt, iż algorytmy minimalizacji jednowymiarowej działają poprawnie jedynie dla przedziałów w których funkcja jest unimodalna. Jeżeli zadana funkcja nie posiada tej własności, należy znaleźć jej przedziały unimodalności i zastosować opisywaną metodę do każdego z nich.

Algorytm

Idea algorytmu

Metoda złotego podziału. Badane są wartości funkcji w punktach x L {\displaystyle x_{L}} i x R . {\displaystyle x_{R}.} Zgodnie z rysunkiem f ( x L ) > f ( x R ) {\displaystyle f(x_{L})>f(x_{R})} z czego wynika, iż minimum musi znajdować się w przedziale [ x L , b ] {\displaystyle [x_{L},b]}

Funkcja ciągła f {\displaystyle f} w przedziale [ a , b ] {\displaystyle [a,b]} posiada dokładnie jedno minimum x*. Minimum to można znaleźć poprzez kolejne podziały zadanego przedziału. W tym celu należy obliczyć wartości funkcji w dwóch punktach x L {\displaystyle x_{L}} i x R {\displaystyle x_{R}} takich, że a < x L < x R < b , {\displaystyle a<x_{L}<x_{R}<b,} a następnie zbadać ich wielkości:

  • Jeżeli f ( x L ) > f ( x R ) , {\displaystyle f(x_{L})>f(x_{R}),} to szukane minimum znajduje się w przedziale [ x L , b ] . {\displaystyle [x_{L},b].}
  • Jeżeli f ( x L ) < f ( x R ) , {\displaystyle f(x_{L})<f(x_{R}),} to szukane minimum znajduje się w przedziale [ a , x R ] . {\displaystyle [a,x_{R}].}

W ten sposób można dowolnie zawężać przedział w którym znajduje się minimum, aż do momentu gdy spełniony zostanie warunek:

( b a ) ϵ {\displaystyle (b-a)\leqslant \epsilon }

dla ustalonej dokładności obliczeń ϵ . {\displaystyle \epsilon .}

Wielkość otrzymanego w wyniku powyższego postępowania przedziału po n {\displaystyle n} krokach wynosi: ( b ( n ) a ( n ) ) k n {\displaystyle (b^{(n)}-a^{(n)})k^{n}} gdzie k {\displaystyle k} jest stałym współczynnikiem o który zmniejszana jest wielkość przedziałów w kolejnych krokach algorytmu.

Złoty podział

W metodzie złotego podziału wartość współczynnika k {\displaystyle k} jest dobrana w taki sposób, aby przy kolejnych iteracjach wykorzystywać obliczoną w poprzednim kroku wartość funkcji jednej z dwóch próbek ( f ( x L ) {\displaystyle f(x_{L})} lub f ( x R ) {\displaystyle f(x_{R})} ). Aby osiągnąć powyższą własność, wartość współczynnika k {\displaystyle k} musi być równa wartości złotego podziału:

k = 5 1 2 0 , 61803398 {\displaystyle k={\frac {{\sqrt {5}}-1}{2}}\approx 0,61803398}

skąd wzięła się nazwa metody.

Strategię obliczania minimum funkcji można zapisać:

  1. { x L ( 0 ) := b ( 0 ) ( b ( 0 ) a ( 0 ) ) k x R ( 0 ) := a ( 0 ) + ( b ( 0 ) a ( 0 ) ) k {\displaystyle \left\{{\begin{array}{l}x_{L}^{(0)}:=b^{(0)}-(b^{(0)}-a^{(0)})k\\x_{R}^{(0)}:=a^{(0)}+(b^{(0)}-a^{(0)})k\end{array}}\right.}
  2. Jeśli:
    • f ( x L ( i ) ) > f ( x R ( i ) ) { a ( i + 1 ) := x L ( i ) b ( i + 1 ) := b ( i ) x L ( i + 1 ) := x R ( i ) x R ( i + 1 ) := a ( i + 1 ) + ( b ( i + 1 ) a ( i + 1 ) ) k {\displaystyle f(x_{L}^{(i)})>f(x_{R}^{(i)})\Rightarrow \left\{{\begin{array}{l}a^{(i+1)}:=x_{L}^{(i)}\\b^{(i+1)}:=b^{(i)}\\x_{L}^{(i+1)}:=x_{R}^{(i)}\\x_{R}^{(i+1)}:=a^{(i+1)}+(b^{(i+1)}-a^{(i+1)})k\end{array}}\right.}
    • f ( x L ( i ) ) < f ( x R ( i ) ) { a ( i + 1 ) := a ( i ) b ( i + 1 ) := x R ( i ) x L ( i + 1 ) := b ( i + 1 ) ( b ( i + 1 ) a ( i + 1 ) ) k x R ( i + 1 ) := x L ( i ) {\displaystyle f(x_{L}^{(i)})<f(x_{R}^{(i)})\Rightarrow \left\{{\begin{array}{l}a^{(i+1)}:=a^{(i)}\\b^{(i+1)}:=x_{R}^{(i)}\\x_{L}^{(i+1)}:=b^{(i+1)}-(b^{(i+1)}-a^{(i+1)})k\\x_{R}^{(i+1)}:=x_{L}^{(i)}\end{array}}\right.}
  3. Jeśli ( b ( i + 1 ) a ( i + 1 ) ) ϵ {\displaystyle (b^{(i+1)}-a^{(i+1)})\leqslant \epsilon } to STOP, w przeciwnym wypadku powtórz punkt 2.

Pseudokod

Algorytm można również zapisać przy pomocy poniższego kodu w języku C:

float GoldenRatioMethod( float a, float b )
{
        // współczynnik złotego podziału
        float k = ( sqrt( 5 ) - 1 ) / 2;

        // lewa i prawa próbka
        float xL = b - k * ( b - a );
        float xR = a + k * ( b - a );

        // pętla póki nie zostanie spełniony warunek stopu
        while ( ( b - a ) > EPSILON )
        {
                // porównaj wartości funkcji celu lewej i prawej próbki
                if ( f( xL ) < f( xR ) )
                {
                        // wybierz przedział [a, xR]
                        b = xR;
                        xR = xL;
                        xL = b - k * ( b - a );
                }
                else
                {
                        // wybierz przedział [xL, b]
                        a = xL;
                        xL = xR;
                        xR = a + k * ( b - a );
                }
        }

        // zwróć wartość środkową przedziału
        return ( a + b ) / 2;
}

Zbieżność metody

Kolejne obliczane przedziały w metodzie złotego podziału są wielkości:

( b ( i + 1 ) a ( i + 1 ) ) = k ( b ( i ) a ( i ) ) {\displaystyle (b^{(i+1)}-a^{(i+1)})=k(b^{(i)}-a^{(i)})}

z czego wynika iż zbieżność metody jest liniowa (rząd zbieżności wynosi 1 , {\displaystyle 1,} zaś współczynnik zbieżności k 0 , 61803398 < 1 {\displaystyle k\approx 0,61803398<1} ). Ilość iteracji N {\displaystyle N} potrzebna do zawężenia przedziału początkowego [ a , b ] {\displaystyle [a,b]} do zadanej dokładności ϵ {\displaystyle \epsilon } wynosi:

N = log k ϵ b a {\displaystyle N=\left\lceil \log _{k}{\frac {\epsilon }{b-a}}\right\rceil }

Zobacz też

  • programowanie matematyczne
  • funkcja unimodalna
  • metoda Newtona (optymalizacja)
  • metoda Brenta (optymalizacja)

Bibliografia

  • Fortuna Z., Macukow B., Wąsowski J.: Metody Numeryczne, Wydawnictwa Naukowo-Techniczne, 2006.
  • Stachurski A., Wierzbicki A.: Podstawy optymalizacji, Oficyna Wydawnicza PW, 1999.

Linki zewnętrzne

  • https://web.archive.org/web/20080530094827/http://www.kmg.ps.pl/opt/wyklad/bezgrad/podzial.html
  • http://optymalizacja.w8.pl/Jednowymiarowa.html