#include <Marquardt.h>
Diagram dziedziczenia dla Marquardt
Metoda Marquardta jest udaną próbą połączenia korzystnych właściwości metod największego spadku i Newtona. Metoda Newtona zbiega się szybko w pobliżu minimum, natomiast metoda Cauchy'ego w dużym od niego oddaleniu.
Algorytm metody:
Oznaczenia:
- numer aktualnej iteracji
- gradient w punkcie
- macierz hesjanu w punkcie
- macierz jednostkowa
- kandydat na punkt w następnej iteracji (odrzucany po kroku próbnym gdy nie nastąpiło zmniejszenie wartości funkcji celu)
Dane potrzebne do obliczeń:
- minimalizowana funkcja celu
- punkt startowy
- współczynnik wagi macierzy jednostkowej
- wymagana dokładność
warunek stopu - do wyboru:
gdzie:
Krok 3:
Jeśli , to przejdź do kroku 4. W przeciwnym wypadku przejdź do kroku 5.
Krok 4:
Podstaw:
, a następnie przejdź do kroku 1.
Krok 5:
Podstaw i przejdź do kroku 2.
Uwagi:
W algorytmnie nie ma minimalizacji w kierunku, gdyż długość kroku reguluje już współczynnik . Na początku działania algorytmu wartość współczynnika
musi być bardzo duża aby wartości na przekątnej macierzy jednostkowej miały większe znaczenie dla sumy we wzorze na kierunek. Z każdym udanym krokiem (tzn. takim, dla którego wartość funkcji w x maleje) lambda zmniejsza się o połowę aż do momentu, w którym to wartości hesjanu stają się ważniejsze dla wyznaczania kierunku. Podobnie jak w innych metodach, na początku działania algorytmu zmienne określające odległość dwóch ostatnich punktów i różnicę wartości funkcji w tych punktach mają wartości DBL_MAX. Wynika z tego, że algorytm może się zatrzymać bez wykonania żadnej iteracji jedynie w przypadku użycia kryterium "gradientowego". Jest to zachowanie jak najbardziej pożądane.
Algorytm zaimplementowano na podstawie:
Ostanin. A: Metody i algorytmy optymalizacji, Wydawnictwo Politechniki Białostockiej, Białystok, 2003<>
Metody publiczne | |
~Marquardt (void) | |
Destruktor. | |
virtual std::auto_ptr< Method > | Clone () const |
Tworzy kopię metody. | |
virtual void | UpdateStartingConditions (const Result *result) const |
virtual void | ResetStartingConditions () const |
virtual const wxString & | Name () const |
Zwraca nazwę metody. | |
virtual MethodIdType | Id () const |
Zwraca ID metody. | |
virtual wxString | ToString (bool standalone=true) const |
Zwraca opis tekstowy metody (nazwa + parametry). | |
virtual bool | CanHandle (const ProblemBase *pProblem) const |
Sprawdza, czy dany problem może być rozwiązany tą metodą. | |
virtual StopConditions | AllowedStopConditions () const |
Zwraca listę warunków stopu odpowiednich dla danej metody. | |
Statyczne metody publiczne | |
static MethodIdType | ClassId () |
Zwraca ID metody. | |
Metody chronione | |
Marquardt (void) | |
Konstruktor domyślny. | |
Marquardt (const Marquardt &from) | |
Konstruktor kopiujący. | |
virtual wxString & | rName () |
Atrybuty chronione | |
DoubleParameter | mInitialLambda |
Wymagana dokładność. | |
ColumnVector | mStartingPoint |
Punkt startowy. | |
ColumnVector | mInitialStartingPoint |
CountedPtr< const StandardStopCondition > | mcpStopCondition |
Warunek stopu. | |
Przyjaciele | |
class | MarquardtPanel |
|
Konstruktor kopiujący.
|