Python-scipy.Optimierung: Verwendung von fsolve mit mehreren ersten Vermutungen
Scipy version 0.10.0
Folgendes:
>>> import math
>>> from scipy.optimize import fsolve
>>> import numpy as np
>>> def p(s, l, k, q):
p = q * np.maximum(s - k, 0.0)
return (p + math.copysign(l, -q)) * math.fabs(q) * 100.0
>>> x0 = fsolve(p, np.arange(33.86, 50.86, 1.0), args=(1.42, 41.0, -1.0), xtol=1e-06, maxfev=500)
Warning (from warnings module):
File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 152
warnings.warn(msg, RuntimeWarning)
RuntimeWarning: The iteration is not making good progress, as measured by the
improvement from the last ten iterations.
>>> print x0
[ -4.87169392e+05 -4.87168392e+05 -4.87167392e+05 -4.87166392e+05
-4.87165392e+05 -4.87164392e+05 -4.87163392e+05 -4.87162392e+05
4.24200000e+01 4.24200000e+01 4.24200000e+01 4.24200000e+01
4.24200000e+01 4.24200000e+01 4.24200000e+01 4.24200000e+01
4.24200000e+01]
Erste Frage ist, wie man vielleicht unterdrücken Sie die Warnmeldung wird zurückgegeben?
Zweite, warum könnten diese Fehler generiert werden, in der ersten Ort (andere als die offensichtliche, dass die iteration nicht gut voran 🙂 )?
Schließlich, die Wurzel dieser Funktion ist 42.42 (was gefunden). Warum ist fzero
Rückkehr -4.87e+05
?
Versuchen Sie, mithilfe von numpy.seterr zu deaktivieren Fehler:
Danke für den Vorschlag aber es hat nicht funktioniert.
numpy.seterr(invalid='ignore')
Danke für den Vorschlag aber es hat nicht funktioniert.
InformationsquelleAutor Jason Strimpel | 2012-10-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tut dies könnte Sie verpassen etwas wichtiges, aber, zum schweigen zu bringen die Warnmeldung, die Sie nutzen könnten
warnings.filterwarnings
:In der Tat
p(x0, 1.42, 41.0, -1)
ist nicht nahe null, sofsolve
ist richtig darauf hingewiesen, dass es versäumt, eine Lösung zu finden.PS. Wenn Sie sagen,
sagen Sie
fsolve
dass deine erste Vermutung fürs
ist die numpy-arraynp.arange(33.86, 50.86, 1.0)
. Das ganze array wird übergebenp
auf einmal.Beachten Sie, dass
np.arange(33.86, 50.86, 1.0)
hat die Länge 17 und so funktioniertx0
. Das ist, weilfsolve
denkt, dass es gesucht wird ein array mit der Länge 17, löstp
.Ich denke, dass vielleicht Sie gemeint
s
zu einem float? In diesem Fall können Sie nur in einen float-Wert für deine erste Vermutung:Beispielsweise
Erträge
fsolve
hat einen anständigen job der Nullstellung in auf den Stamm, wenn die anfängliche Vermutung ist, >= 41.0 (der Wert vonk
) schlägt jedoch fehl, wenn die anfänglichen raten < 41.0.Meine Vermutung ist, dass diese aufgrund
np.maximum
nicht ändern für viele Vermutungen fürs
. Sofsolve
weiß nicht, ob zu erhöhen oder verringerns
und ist apt zu erraten, falsch und bewegens
weiter und weiter von der Wurzel.InformationsquelleAutor unutbu
InformationsquelleAutor Abdar Mohammad