1

I scipy.optimize.root mit der hybr Methode verwenden (am besten ein?)`scipy.optimize.root` schnelle Wurzel zu finden

ich den Rest bei jeder Iteration

drucken Sie die Wurzel einer numerischen Funktion zu finden

delta d 117.960112417 delta d 117.960112417 delta d 117.960112417 delta d 117.960048733 delta d 117.960112427 delta d 117.960112121 delta d 1.46141491664 delta d 0.0322651167588 delta d 0.000363688881595 delta d 4.05494689256e-08

Wie kann ich den Root-Fund beschleunigen, indem ich die Größe des Schritts, insbesondere zwischen den ersten Iterationen, vergrößere? Ich weiß nicht, wie genau der Algorithmus funktioniert, aber es sieht komisch aus, dass die 3 ersten Ergebnisse gleich sind und 3 Texte auch ziemlich identisch sind.

Reading the doc, ich habe versucht, den eps Faktor zu ändern, ohne Erfolg

EDIT: @sasha, hier eine sehr einfache Funktion ist die Ausgabe

def f(X1,X2): 
    print ' X1 , diff , norm ' , X1 , X2 - X1 , np.linalg.norm(X2 - X1) 
    return X2 - X1 

Xa = np.array([1000,1000,1000,1000]) 
Xb = np.array([2000,2000,2000,2000]) 

SOL = scipy.optimize.root(f,Xa,(Xb,)) 

Das Ergebnis wird sein, die folgenden erläutern Wir haben die drei identischen Wiederholungen am Anfang, unabhängig von der Länge der X

X1 , diff , norm [1000 1000 1000 1000] [1000 1000 1000 1000] 2000.0 
X1 , diff , norm [ 1000. 1000. 1000. 1000.] [ 1000. 1000. 1000. 1000.] 2000.0 
X1 , diff , norm [ 1000. 1000. 1000. 1000.] [ 1000. 1000. 1000. 1000.] 2000.0 
X1 , diff , norm [ 1000.0000149 1000.   1000.   1000.  ] [ 999.9999851 1000.   1000.   1000.  ] 1999.99999255 
X1 , diff , norm [ 1000.   1000.0000149 1000.   1000.  ] [ 1000.   999.9999851 1000.   1000.  ] 1999.99999255 
X1 , diff , norm [ 1000.   1000.   1000.0000149 1000.  ] [ 1000.   1000.   999.9999851 1000.  ] 1999.99999255 
X1 , diff , norm [ 1000.   1000.   1000.   1000.0000149] [ 1000.   1000.   1000.   999.9999851] 1999.99999255 
X1 , diff , norm [ 2000. 2000. 2000. 2000.] [-0. -0. -0. -0.] 4.36239133705e-09 
X1 , diff , norm [ 2000. 2000. 2000. 2000.] [ 0. 0. 0. 0.] 0.0 
+0

Ohne Details über Ihre Funktion/Daten zu wissen, kann dies nicht zufriedenstellend beantwortet werden. – sascha

+0

Was passiert, wenn Sie Gradienten bereitstellen? –

Antwort

5

Erstens glaube ich, du bist verwirrende Iterationen mit Aufrufen Ihrer Funktion, die nicht genau gleich sind. Da Sie dem Löser keine Jacobean-Funktion zur Verfügung gestellt haben, muss er den Jacobean (oder vielleicht nur einen Teil davon) selbst schätzen. Die Jacobean ist im Grunde das mehrdimensionale Äquivalent der Ableitung. Es zeigt an, wie sich die Ausgabe der Zielfunktion ändert, wenn Sie die Eingaben leicht ändern.

Die meisten numerischen Solver schätzen Jacobes numerisch, indem sie die Zielfunktion an einem Punkt sehr nahe an der aktuellen Schätzung auswerten und prüfen, um wie viel sich die Ausgabe ändert. Meine Vermutung ist, dass die ersten paar Aufrufe, die Sie sehen, sind, die objektive Funktion zu bewerten, und dann die Jacobean zu schätzen. Der erste Aufruf, bei dem Sie eine tatsächliche Änderung sehen, erfolgt nach der Schätzung der Jacobean-Methode und der anschließenden Berechnung einer nächsten Schätzung an der Wurzel.

Wenn Sie dies selbst überprüfen möchten, versuchen Sie, dem Solver eine Rückruffunktion zu geben. Sie ruft diese Funktion bei jeder Iteration auf und Sie können bei jeder Iteration nachsehen, wo sie sich befindet. Ich denke, Sie werden feststellen, dass es in nur wenigen Iterationen konvergiert, aber die Funktion mehrmals pro Iteration aufruft.

Natürlich können Sie all diese Arbeit vermeiden, indem Sie dem Löser eine Jacobean-Funktion zur Verfügung stellen, die er aufrufen kann, um die Jacobean an einem Punkt zu bewerten. Wenn Sie dies tun, müssen Sie nicht mehrere Anrufe tätigen, um es zu schätzen.

Die Dokumentation enthält Informationen zum Hinzufügen von Callbacks und zum Bereitstellen einer Jacobean-Funktion. Bei Bedarf kann ich ein Beispiel hinzufügen.

http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.root.html

+0

OK, also sind die ersten Aufrufe für die Jacobische Schätzung Es sieht nach einer harten Arbeit aus, um eine extern berechnete zu liefern, also werde ich scipy die Arbeit machen lassen;) – Covich

Verwandte Themen