Ich muss mit JuMP zwei Kurven (die beide zu kubischen Funktionen gehören sollten) in eine Reihe von Punkten einpassen.
Ich habe eine Kurve angepasst, aber ich habe Probleme, zwei Kurven in denselben Datensatz einzufügen.
Ich dachte, wenn ich Punkte auf Kurven verteilen kann - also wenn jeder Punkt nur einmal verwendet werden kann - kann ich es wie unten machen, aber es hat nicht funktioniert. (Ich weiß, dass ich viel kompliziertere Dinge verwenden kann, ich möchte es einfach halten.)
Dies ist ein Teil meines aktuellen Codes:
# cubicFunc is a two dimensional array which accepts cubicFunc[x,degree]
@variable(m, mult1[1:4]) // 0:3 because it's cubic
@variable(m, mult2[1:4]) // 0:3 because it's cubic
@variable(m, 0 <= includeIn1[1:numOfPoints] <= 1, Int)
@variable(m, 0 <= includeIn2[1:numOfPoints] <= 1, Int)
# some kind of hack to force one of them to 0 and other one to 1
@constraint(m, loop[i in 1:numOfPoints], includeIn1[i] + includeIn2[i] == 1)
@objective(m, Min, sum( (yPoints - cubicFunc*mult1).*includeIn1 .^2 ) + sum( (yPoints - cubicFunc*mult2).*includeIn2 .^2 ))
Aber es gibt verschiedene Fehler, je nachdem, was ich versuche; *includeIn1
und, .*includeIn1
funktioniert nicht, ich habe versucht, es über zu tun, @NLobjective
aber es gab mir Keuchhusten ~ 50 Zeilen von Fehlern usw.
Ist meine Idee realistisch? Kann ich es in den Code schaffen?
Jede Hilfe wird sehr geschätzt. Vielen Dank.
yPoints = [ 3, 6, 5, 7, 3, 3, 1, 0, 4, 1]
Antworten:
Sie können das Problem zB folgendermaßen aufschreiben:
Angesichts der Einschränkungen
includeIn1
undincludeIn2
wird1
oder0
im Optimum sein (wenn dies nicht der Fall ist, bedeutet dies, dass es keine Rolle spielt, welcher Gruppe Sie den Punkt zuweisen), müssen wir sie also nicht einschränken, um binär zu sein. Außerdem verwende ich einen nichtlinearen Löser, da das Problem nicht als lineare oder quadratische Optimierungsaufgabe umformuliert zu werden scheint.Ich gebe den obigen Code jedoch nur als Beispiel, wie Sie ihn aufschreiben können. Die von Ihnen formulierte Aufgabe hat kein eindeutiges lokales Minimum (das dann ein globales ist), sondern mehrere lokale Minima. Daher findet die Verwendung von nichtlinearen konvexen Standardlösern, die JuMP unterstützt, nur ein lokales Optimum (nicht unbedingt ein globales). Um nach globalen Optima zu suchen, müssen Sie zu globalen Lösern wie z . B. https://github.com/robertfeldt/BlackBoxOptim.jl wechseln .
quelle