Forum:  Programmieren
Thema: Python: Wolfe-Powell-Regel
Themen-Übersicht
lissy1234567
Aktiv
Dabei seit: 01.09.2017
Mitteilungen: 382
Aus:
Themenstart: 2019-05-21 12:20

Hallo zusammen,

um die Wolfe-Powell-Regel im Gradientenverfahren nutzen zu können, versuche ich gerade dafür eine Funktion zu schreiben (vorgegebener Rahmen der Uni). Mein Programm bleibt aber irgendwo in einer Schleife haengen und ich komme zu keinem Ergebnis sozusagen.
Könnt ihr mir helfen? Der Code ist mit dem Wing-Editor geschrieben und ich bin absolute Anfaengerin, muss das aber bald abgeben :)
Python
def  wolfe_powell ( f,g, xo,dx, fo,go, gamma=0.4,rho=0.6 ) :
    '''
    #
    #  f:   die zu minimierende Funktion;
    #  g:   Gradient der zu minimierenden Funktion;
    #  xo:  Startpunkt der approximierten Abstiegs-Liniensuche;
    #  dx:  Abstiegsrichtung;
    #  fo:  Funktionswert an der Stelle xo = fh(xo);
    #  go:  Gradient an der Stelle xo;
    #  gamma:  Wolfe-Powell-Parameter;
    #  beta:   Wolfe-Powell-Parameter;
    #
    #  xn,fn,gn: Neue Iterierte, ihr Funktionswert und Gradient;
    #  alfa:   xn = xo + alfa*dx ;
    #  term:  Zaehler der Funktions- und Gradientenauswertungen in wolfe_powell.
    #
    '''
    if  ( fo == None ) :
        fo = f ( xo )
    if  ( go == None ) :
        go = g ( xo )
    alfa = np.nan
    term = -1
    #
    if  ( ( gamma <= 0.0 ) or ( 0.5 <= gamma ) ) :
        print ( 'wolfe-powell:  gamma nicht in (0.0,0.5) !' )
        return ( xo,fo,go,alfa,term )
    if  ( ( gamma > rho ) or ( rho >= 1.0 ) ) :
        print ( 'wolfe-powell:  rho nicht in [gamma,1.0) !' )
        return ( xo,fo,go,alfa,term )
    c = go.dot ( dx )
    if  ( c >= 0.0 ) :
        print ( 'wolfe-powell:  dx ist keine Abstiegsrichtung!' )
        return ( xo,fo,go,alfa,term )
 
    # benoetigen wir spaeter
    dx = -go
    Grad = np.dot(go, dx)
    alfa = 1
    xn = xo + alfa*dx    
    phi = lambda alfa: f(xn)
    GradPhi = np.gradient(phi(alfa))
    AblPhi = np.dot(GradPhi,dx)
    rhoPhi = rho*Grad
    xi = lambda alfa: phi(alfa) - fo - gamma*alfa*Grad
# Schrittweiten-Regel nach Wolfe-Powell (Algorithmus 3.3)
    # erstes IF
    if xi(alfa) <= 0:
        # zweites IF
        if AblPhi >= rhoPhi:
            return(alfa)
        # zweites ELSE
        else:
            a = alfa
            # WHILE in ELSE
            while xi(alfa) <= 0:
                alfa = 2*alfa
            # Ende WHILE
            b = a
    # erstes ELSE
    else:
        b = alfa
        # WHILE in ELSE
        while xi(alfa) > 0 or AblPhi >= rhoPhi:
            alfa = 0.5*alfa
        # Ende WHILE
        a = alfa
    # Ende erste Schleife
    alfa = (a+b)/2
    # WHILE
    while xi(alfa) > 0 or AblPhi < rhoPhi:
        # drittes IF
        if xi(alfa) > 0:
            b = alfa
        # drittes ELSE
        else:
            a = alfa
        # Ende zweite Schleife
        alfa = (a+b)/2
 
    term += 1
    # Wolfe-Powell-Regel: Ende, dh Schrittweite gefunden
    xn = xo + alfa*dx
    # Funktionswert und Gradient der neuen Iterierten
    fn = fh(xn)
    gn = gh(xn)
    return ( xn,fn,gn,alfa,term )


rlk
Senior
Dabei seit: 16.03.2007
Mitteilungen: 10512
Aus: Wien
Beitrag No.1, eingetragen 2019-05-22 09:09

Hallo lissy1234567,
hast Du aus Versehen abgehakt oder hast Du den Fehler schon gefunden?

Du kannst in den drei while-Schleifen Ausgaben einbauen um festzustellen, in welcher das Programm hängen bleibt.

In all diesen Schleifen werden AblPhi und rhoPhi verglichen, Du berechnest diese beiden Größen am Anfang, aber zumindest AblPhi sollte von alfa abhängen.

Ich hoffe, das hilft Dir,
Roland


lissy1234567
Aktiv
Dabei seit: 01.09.2017
Mitteilungen: 382
Aus:
Beitrag No.2, vom Themenstarter, eingetragen 2019-05-30 11:34

Hallo,

ich hatte den Fehler bereits gefunden, trotzdem danke:)




Dieses Forumbeitrag kommt von Matroids Matheplanet
https://https://matheplanet.de

Die URL für dieses Forum-Thema ist:
https://https://matheplanet.de/default3.html?topic=241848=5101
Druckdatum: 2019-08-23 13:49