Die Mathe-Redaktion - 17.10.2019 13:02 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte / Top 15
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt? im neuen Schwätz
ListenpunktWerde Mathe-Millionär!
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 774 Gäste und 16 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matroid
Mathematik » Numerik & Optimierung » Gradientenverfahren
Druckversion
Druckversion
Autor
Universität/Hochschule J Gradientenverfahren
Aliaju
Junior Letzter Besuch: im letzten Monat
Dabei seit: 25.04.2019
Mitteilungen: 13
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2019-09-17


Hallo,

ich versuche verzweifelt das Gradientenverfahren bzgl. der Rosenbrockfunktion mit Java zu implementieren. Irgendwie funktioniert das nicht.

Dabei starten wir mit $x_0=[1.2,1.2]$ und $\alpha=1.0$, es soll $\rho=0.5$ und $c=10^{-4}$.

Und die Rosenbrockfunktion, auf die das angewandt werden soll ist $f(x)=100(x_2-x_1^2)^2+(1-x_1)^2$.

Ich komme in eine Endlosschleife und zwar Im Main-Thread, den ich hier einbinde:
Java
public static void main(String[] args) {
		double [] x = {1.2,1.2};
		double alpha=1;
		while(fx(x)>0.001 & norm(x)>0.001) {
			alpha=alpha(alpha,0.5,0.0001,x);
			x[0]+=alpha*psd(x)[0];
			x[1]+=alpha*psd(x)[1];
		}
	}

Dort komme ich in eine Endlosschleife, nachdem ich diesen Teil des Algorithmus ausgeführt habe und damit (was glaube ich das Problem ist) mein alpha sehr stark verkleinert habe...

Aber eigentlich dachte ich, dass ich ihn nur abgetippt habe. (Natürlich sieht mein Code länger aus als der auf dem folgenden Bild, da ich am Ende der Schleife immer die Werte aktualisiere...)

Hier ein Bild vom Code:



Meine Implementierung:
Java
public static double alpha(double alpha, double rho, double c, double[] x) {
		double[] xap=new double[2];
		xap[0]=x[0]+alpha*psd(x)[0];
		xap[1]=x[1]+alpha*psd(x)[1];
		double wert = fx(x)+alpha*c*((grad(x)[0]*psd(x)[0])+(grad(x)[1]*psd(x)[1]));
 
		while(fx(xap)>(wert)){
			alpha=rho*alpha;
 
 
			wert=fx(x)+alpha*((grad(x)[0]*psd(x)[0])+(grad(x)[1]*psd(x)[1]));
 
			xap[0]=x[0]+alpha*psd(x)[0];
			xap[1]=x[1]+alpha*psd(x)[1];	
		}		
		return alpha;
	}

Ich hab jetzt nur diesen eingebunden. Mein Code selbst besteht ja offensichtlich aus noch ganz viel mehr Funktionen... fx(double) wertet den Funktionswert aus, psd(double) ist dieser Wert ausgewerte in $x$:


Da ich den Code für die Rosenbrockfunktion, den Gradienten etc. nachgerechnet habe, denke ich, dass der Part stimmt. Und um die Frage nicht mit Code vollzuschreiben, habe ich ihn weggelassen. Aber ich kann ihn gerne reinstellen, wenn ihr ihn sehen wollt.


Meine Frage ist: Wo habe ich einen Fehler in der Implementierung gemacht?



  Profil  Quote  Link auf diesen Beitrag Link
Kitaktus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.09.2008
Mitteilungen: 6049
Aus: Niedersachsen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2019-09-17


Wasm genau verstehst Du unter "Endlosschleife"?

a) Werden Punkte mehrfach durchlaufen?
b) Sind die Änderungen so klein, dass kein Fortschritt mehr sichtbar ist?

Ist b) nicht gerade das Problem, dass man an der Rosenbrockfunktion studieren möchte?! Die Zielfunktion bildet ein gebogenes und an den Rändern sehr steiles Tal. Der Gradient zeigt immer nahezu senkrecht zum Talverlauf, so dass man mit jedem Schritt nur minimal vorankommt.
Die Schrittweite wird immer weiter verkleinert, damit man am steilen Rand nicht nach oben geht und letzten Endes hängt man scheinbar fest.



  Profil  Quote  Link auf diesen Beitrag Link
Aliaju
Junior Letzter Besuch: im letzten Monat
Dabei seit: 25.04.2019
Mitteilungen: 13
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2019-09-17


Ja, es ist b).

Ah, aber das Programm soll ja auch enden... Nach der Aufgabenstellung haben wir die Abbruchbedingung $|f(x_k)|<10^{-8}$ oder $||grad f(x_k) ||<10^{-8}$.

Aber $x_k$ wird ja innerhalb der alpha-Methode wo die Endlosschleife ist nicht verändert und deshalb haben die Bedingungen ja keinen Einfluss auf die Methode. Oder habe ich das falsch verstanden und $x_k$ wird verändert und nach einer Weile wird die While-Schleife durch die Bedingungen gestoppt?

Das Programm soll angeblich enden und eine Ausgabe haben, wo jedes mal das $x_k$, das $F(x_k)$, das $psd(x_k)$ und das $\alpha$ steht...



  Profil  Quote  Link auf diesen Beitrag Link
Delastelle
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 17.11.2006
Mitteilungen: 1348
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2019-09-18


Hallo Aliaju!

Nicht sehr elegant aber wirksam - Variablen zwischendurch ausgeben:

Z.B. Variable a:
Java
System.out.println("a = \n"+a);

Viele Grüße
Ronald



  Profil  Quote  Link auf diesen Beitrag Link
Kitaktus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.09.2008
Mitteilungen: 6049
Aus: Niedersachsen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, eingetragen 2019-09-18


Bei der Berechnung von "wert" innerhalb der while-Schleife fehlt der Faktor c. Das könnte dazu führen, dass fx(xap) nie "wert" unterschreitet.



  Profil  Quote  Link auf diesen Beitrag Link
Aliaju
Junior Letzter Besuch: im letzten Monat
Dabei seit: 25.04.2019
Mitteilungen: 13
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, vom Themenstarter, eingetragen 2019-09-18


Hallo,

Danke für die Antworten!

Ich wollte gerade schreiben, dass ich den Fehler jetzt entdeckt habe. Und genaaaau, Kitaktus. Das war der Fehler. Das c hatte ich dort vergessen.... Danke dir!


Danke euch allen!!



  Profil  Quote  Link auf diesen Beitrag Link
Aliaju hat die Antworten auf ihre/seine Frage gesehen.
Aliaju hat selbst das Ok-Häkchen gesetzt.
Neues Thema [Neues Thema]  Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2019 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]