Znajdowanie maksimum funkcji ciągłej w zadanym przedziale

0

Witam, mam problem z napisaniem stabilnego algorytmu znajdowania maksimum lokalnego funkcji ciągłej y(x) w danym przedziale od x1 do x2. Ze względu na złożoność obliczeniową równania nie ma możliwości wyprowadzenia wzoru ogólnego, dlatego w grę wchodzą tylko metody numeryczne. Wykres funkcji przypomina zniekształconą parabolę o wzorze y=-x2.

Próbowałem napisać algorytm podobny do metody bisekcji w znajdowaniu miejsca zerowego, ale bez powodzenia. Byłbym bardzo wdzięczny nawet gdyby ktoś mnie minimalnie naprowadził na najprostsza drogę do rozwiązania tego problemu. Możliwe, że ktoś z was zna takowy algorytm. Wydaję mi się, że to jest powszechny problem, jak na ironię nic nie znalazłem na ten temat w Internecie.

Z góry dziękuję za pomoc i pozdrawiam! ;)

1

Porponuję np. http://pl.wikipedia.org/wiki/Metoda_z%C5%82otego_podzia%C5%82u

Dla maksimum musisz oczywiście wsadzić - przed funkcję. Jak się zagłębisz w te artykuły, szczególnie na anglojęzycznej wiki, to odnajdziesz więcej metod.

0

Super sprawa z tą metodą złotego środka. ;) Jest podany nawet gotowy kod w C. Zastanawia mnie czy łatwo zmodyfikować ten algorytm, żeby analogicznie obliczał maksimum.

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;
}

Czy wystarczy zmienić tylko znak mniejszości na większości? To by było zbyt proste ... ale sprawdzę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1