2012-04-01 5 views
0

Ich bin Debugging Optimierungsroutine. Ich produziere eine Log-Textdatei, in der ich den Zielfunktionswert bei jeder Iteration in der Optimierungsroutine nachverfolge. HierC++, sehr unerwartet -1 # INF

ist der Kontext: I mit einem Kurvenanpassung Problem zu umgehen, mit einem Modell, das linear in den vier Parametern und Polynom in den X-Daten

Y = PARAM1*X^3+PARAM2*X^2+PARAM3*X+PARAM4 

ist und ich laufe Optimierungsroutine auf unnoised unvoreingenommenen Daten aus diesem Modell generiert, um den Algorithmus zu testen.

In der Protokolldatei zeigt der erste Optimierungsschritt kein Problem. Funktionsauswertungen haben einen doppelten Wert. Bei jeder Iteration werden 5 Funktionswerte berechnet (und in der Protokolldatei angezeigt). Ab einer gegebenen Iteration werden die Dinge sauer: Eine Funktionsbewertung wird -1#INF, obwohl die objektive Funktion genau an diesem Punkt (!) Bereits erfolgreich evaluiert wurde. In den nächsten Iterationen wird der "schlechte Punkt" bei -1#INF ausgewertet, und eins nach dem anderen werden auch am Ende bei -1 # INF ausgewertet. Die Berechnung von Y an diesen Punkten ist angesichts der Formel und angesichts der Tatsache, dass sie vorher richtig bewertet wurden, kein Problem.

Auch ich vermute eine andere Ursache, wie Speicherverwaltung. Hättest du eine Idee oder einen Ratschlag, um das Problem näher zu verfolgen?


bearbeiten

Ich sehe das erste Vorkommen von -1#INF in Protokolldatei. Die Funktion wird bei jeder Iteration an 5 Punkten bewertet, aber nur einer dieser 5 Punkte ist ein "neuer Punkt". Wenn -1#INF zum ersten Mal angezeigt wird, wurde die Funktion zu diesem Zeitpunkt bereits erfolgreich ausgewertet.

Es sieht aus wie

ITERATION N-1 
f1 559.011 
f2 560.034 
f3 562.034 
f4 560.342 
f5 560.344 

ITERATION N 
f1 -1#INF 
f2 560.034 
f3 558.034 
f4 560.342 
f5 560.344 

wo bei ITERATION N nur f3 eine Funktionsauswertung an einem neuen Punkt ist, und f1 die Funktionsauswertung an der gleichen Stelle ist als f1 in ITERATION N-1 ist.

+0

Was genau meinen Sie mit "erfolgreich evaluiert"? Sind Sie sicher, dass weder ein Überlauf noch eine Division durch Null aufgetreten ist? – celtschk

+0

Speicherverwaltung ist zweifelhaft das Problem. Ihr iterativer Algorithmus ist divergierend. Versuchen Sie und finden Sie die erste Berechnung, die INF erzeugt. – Potatoswatter

+1

Verwenden Sie einen Debugger (oder fügen Sie print-Anweisungen hinzu), um die genaue Codezeile aufzuspüren, die den Fehler verursacht. –

Antwort

2

Infinity wird in Berechnungen weitergegeben. Die größten Chancen bestehen darin, dass das Polynom -Inf erzeugt wurde, weil X bereits -Inf war. Mit den größten Chancen, dass dies durch Berechnung für X, die durch Null geteilt wird, verursacht wird. Arbeite dich zurück und füge Code hinzu, der in den Divisionen auf Null prüft.

+0

Danke. Allerdings ist der verwendete Vektor X bei jeder Berechnung gleich von Anfang an ... so dass, wenn es irgendeinen Kampf mit irgendeinem Operanden im Polynom gegeben hätte, dieser von Anfang an aufgetreten wäre.Nur Variablen sind Parameter, die multiplikative Konstanten in der Formel sind. – octoback

+0

Nun, dann verschieben Sie die Überprüfungen in den Code, der die Parameterwerte generiert. Ihr Snippet ist viel zu kurz, um eine genaue Antwort zu geben. –

+0

Iterative Solver, wie er zu beschreiben scheint, können die Unendlichkeit durch exponentielle Divergenz ohne Division erreichen. – Potatoswatter