Wie zum ausführen von nicht-linearen Optimierung mit scipy/numpy oder sympy?
Ich bin auf der Suche nach der optimalen Lösung für das follow-system von Gleichungen in Python:
(x-x1)^2 + (y-y1)^2 - r1^2 = 0
(x-x2)^2 + (y-y2)^2 - r2^2 = 0
(x-x3)^2 + (y-y3)^2 - r3^2 = 0
Angesichts der Werte, die einen Punkt(x,y) und einem radius (r):
x1, y1, r1 = (0, 0, 0.88)
x2, y2, r2 = (2, 0, 1)
x3, y3, r3 = (0, 2, 0.75)
Was ist der beste Weg, die optimale Lösung für den Punkt (x,y)
Im obigen Beispiel wäre es:
~ (1, 1)
- Sie haben Undefinierte Variablen (x und y) in die Funktion
eqs
. Können Sie den eigentlichen code, den Sie verwenden? - Ich versuche zur Optimierung der Werte von x und y das Gleichungssystem.
- Ich war mit diesem Beispiel: stackoverflow.com/questions/8739227/...
- fsolve ist für die numerische Stamm Erkenntnis, nicht die Optimierung, d.h. er wird versuchen zu finden, die Werte der input so, dass die Ausgabe der Funktion ist null. Das Beispiel, das Sie zeigen, ist hier nicht anwendbar. Auch glaube ich nicht verstehen, was die optimalen Werte x und y bedeuten im Kontext der drei Gleichungen. (Von dem, was dein code sagt, der computer auch nicht.) Klaren sein, auf was Sie versuchen zu erreichen.
- Danke für die Kommentare und sorry für die unklare. Ich habe also die Frage, was ist jetzt hoffentlich klarer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich verstehe deine Frage richtig, ich denke das ist, was Sie nach:
Welche ergibt:
Können Sie auch versuchen, die Methode der kleinsten Quadrate, die erwartet, dass eine Objektive Funktion, liefert einen Vektor. Es will zur Minimierung der Summe der Quadrate des Vektors. Mit Hilfe der Methode der kleinsten Quadrate, Ihr Ziel-Funktion würde wie folgt Aussehen:
Und Sie würden zu minimieren, etwa so:
Welche ergibt:
Dies ist im Grunde das gleiche wie mit
minimize
- und re-schreiben der ursprünglichen Zielfunktion als:Damit ergibt sich:
Beachten Sie, dass
args
behandelt werden, ein bisschen anders mitleastsq
ist, und dass die Daten-Strukturen zurückgegeben, indem die beiden Funktionen sind auch unterschiedlich. Finden Sie in der Dokumentation fürscipy.optimieren.minimieren
undscipy.optimieren.leastsq
für mehr details.Sehen die
scipy.optimieren
- Dokumentation für weitere Optimierungen.np.linalg.norm
im Ortnp.sum
, und sehen, wie das wirkt sich auf Ihre Ergebnisse.minimize
erwartet einen scalar-valued function, undleastsq
erwartet eine vektorwertige Funktion.leastsq
will Minimierung der Summe der Quadrate der Vektor zurückgegeben, indem die Zielfunktion, so ist es fast wie mit der l2-norm mitminimize
. In der Tat, bekomme ich Antworten, die sind fast identisch mitleastsq
- und der l2-norm mitminimize
: ~[.78,.86]
Bemerkte ich, dass der code in der angenommen Lösung nicht mehr funktioniert... ich denke, vielleicht
scipy.optimize
hat sich verändert seine Oberfläche, seit die Antwort wurde geschrieben. Ich könnte falsch sein. Egal, ich zweiten den Vorschlag, die algorithmen inscipy.optimize
, und die akzeptierte Antwort wird zeigen, wie (oder hast zu einer Zeit, wenn die Schnittstelle geändert hat).Ich bin durch das hinzufügen einer weiteren Antwort hier rein, eine alternative vorzuschlagen-Paket, das verwendet die
scipy.optimize
algorithmen auf den Kern, ist aber viel robuster für die eingeschränkte Optimierung. Das Paket istmystic
. Eine der großen Verbesserungen ist, dassmystic
gibt eingeschränkte globalen Optimierung.Erste, hier ist dein Beispiel sehr ähnlich zu der
scipy.optimize.minimize
Weg, aber mit einem globalen Optimierer.Ergebnisse so Aussehen:
Wie bereits erwähnt, die Wahl der
lambda
imreduced
betrifft worauf der Optimierer findet, da es keine tatsächliche Lösung der Gleichungen.mystic
bietet auch die Möglichkeit zum konvertieren von symbolischen Gleichungen in eine Funktion, wo die resultierende Funktion kann verwendet werden, als Ziel oder als eine Strafe-Funktion. Hier ist das gleiche problem, aber mit Hilfe der Gleichungen als eine Strafe, anstatt das Ziel.Ergebnisse:
Sind die Ergebnisse anders als vorher, weil die Strafe angewendet wird, anders als wir früher in
reduced
. Inmystic
können Sie auswählen, welche Strafe die Sie anwenden möchten.Der Punkt war, dass die Gleichung keine Lösung hat. Sie können sehen, aus dem Ergebnis vor, dass das Ergebnis schwer bestraft, das ist also ein gutes Indiz dafür, dass es keine Lösung gibt. Allerdings
mystic
hat eine andere Weise, die Sie sehen können, gibt es keine Lösung. Anstelle der Anwendung einer mehr traditionellenpenalty
, die bestraft die Lösung, wo die constraints verletzt werden...mystic
bietet eineconstraint
, die im wesentlichen eine kernel-transformation entfernt alle potenziellen Lösungen, die nicht erfüllen die Konstanten.Ergebnisse:
Wo die
nan
im Grunde gibt es keine gültige Lösung.Zur info, ich bin der Autor, so habe ich eine gewisse Tendenz. Allerdings
mystic
hat es schon fast so lange wiescipy.optimize
, ist ausgereift und hat eine stabile Schnittstelle, die Länge der Zeit. Der Punkt ist, wenn Sie brauchen eine viel leistungsfähiger und flexibler eingeschränkte nichtlineare Optimierer, schlage ich vormystic
.Diesen Gleichungen kann gesehen werden, als eine Beschreibung aller Punkte auf der Kreislinie der drei Kreise im 2D-Raum. Die Lösung wäre, die Punkte, wo die Kreise abzufangen.
Die Summe Ihrer Radien der Kreise, die kleiner ist als die Abstände zwischen Ihren Zentren, so dass die Kreise nicht überlappen. Ich habe gezeichnet, die Kreise, um die Skala unten an:
Gibt es keine Punkte, die erfüllen das Gleichungssystem.
Habe ich ein Beispiel-Skript, indem Sie die folgenden. Beachten Sie, dass die Letzte Zeile findet sich eine optimale Lösung (a,b):
Ausgänge :