Verfasst am: 12.01.2016, 17:29
Titel: Warum liefert Intlinprog nicht das Optimum?
Hey Leute,
ich bin jetzt ganz neu im Thema Optimierung und bevor ich mit 1000 Daten hantiere, wollte ich das ganze mal ausprobieren. Tja, irgendwie klappt das nur nicht so richtig.
Dabei halte ich mich eigentlich genau an die Hilfe.
Was ich will:
ZF: Summe X = min
NB: 2*x1+1*x2+1,5*x3 >= 5
Code:
A = [2,1,1.5];
b = 5;
intcon = 3;
f = ones(intcon,1);
lb = zeros(intcon,1);
ub = 1.5*ones(intcon,1);
X = intlinprog(f,intcon,-A,-b,[],[],lb,ub)
Das Ergebnis ist [1,5; 0,5; 1] und liefert für b 1,5*2+0,5*1+1*1,5 = 5
Passt also. Summe X ist 3.
Nur würde mir [1,6;0;1,2] auch 5 liefern und die Summe wäre nur 2,8.
Wenn ich die obere Schranke auf 2.5 setze, spuckt er mir stattdessen [2.5;0;0] aus, das passt also. Aber sobald die Schranke niedrger ist, kommt zwar ein Ergebnis raus, aber nicht das optimale.
Ich habe auch schon die Tolleranz auf 1e-06 gestellt - keine Veränderung.
kleiner als 1e-06 will Matlab wohl nicht, da kommt folgender Fehler:
"Invalid value for OPTIONS parameter TolInteger:
must be a scalar in the range [ 1e-06, 0.001]"
Kann mir einer mal kurz beistehen? So kompliziert ist das doch bisher gar nicht...
Ach ja, kann natürlich auch sein, dass es bessere Lösungsfunktionen gibt. Da habe ich mich bisher wirklich noch nicht informiert, da ich das erst mal nur beispielhaft testen wollte. Bin hier aber natürlich auch offen. Funktionieren müsste das aber ja trotzdem.
bekomme es auch nicht zum laufen. Sogar das erste Bsp. auf http://de.mathworks.com/help/optim/.....dDomain=www.mathworks.com funktioniert bei mir nicht. Es liegt wahrs. an der Matlab-Version (ich benutze 2012, und du?) die wir benutzen. Die Dokumentation/Funktion wurde whars. mit einem der neuen Relases verändert.
Das Problem liegt daran, dass das zweite Argument angibt, welche Variablen nur integerwertig sein dürfen. Wenn du 3 übergibst, forderst du also, dass das dritte Argument ein Integer sein muss.
Zudem gibst du als obere Schranke 1,5 an.
Beides ist bei deiner "besseren" Lösung nicht erfüllt.
Da hatte ich mich verschrieben, da ich mehrere Möglichkeiten ausprobiert habe. 2 habe ich angegeben.
Der Knackpunkt war aber natürlich das hier:
Zitat:
Das Problem liegt daran, dass das zweite Argument angibt, welche Variablen nur integerwertig sein dürfen. Wenn du 3 übergibst, forderst du also, dass das dritte Argument ein Integer sein muss.
Habe ich mir die Hilfe doch nicht gut genug durchgelesen. Habe mich schon gewundert, was das intcon bringt. Naja...*räusper*
Jetzt klappts natürlich. Danke.
Generell sollte linprog bei Berechnungen dieser Art ja gut gehen, oder?
Eine kleine Frage noch.
Wenn die Zielfunktion Summe(abs(X)) sein soll, müsste f dann ja entweder 1 oder -1 sein - aber das kommt ja darauf an, ob x positiv oder negativ ist. Und das ergibt sich ja erst durch f.
Da komme ich mit diesem Löser gar nicht weiter, oder sehe ich das falsch?
Stimmt, dass wären zwei mögliche Lösungen. Die numerischen Optimierungssolver von Matlab liefern dann das Ergebnis, welches am nächsten am Initial Guess - also deinem Startvektor ist.
nein, zudem bereitet abs numerische Probleme, da schwer zu differenzieren, besser ist es x² zu verwenden!
In diesem Fall bieten sich dann die Solver quadprog/fminunc/fmincon an. An diese Solver wird das Argument x0 übergeben, welches der Inital Guess ist, also eine erste Startlösung für den iterativen Solver. Die Wahl von x0 bestimmt dann die konvergenz gegen eine Lösung.
Mit zwei Lösungen war gemeint, dass es mehrere Lösungen geben kann, der Solver dir aber immer nur eine ausgeben wird, in deinem Bsp. gibt es zwei Lösungen, 1 und -1.
Mmmh, ich werde mich mal mit den Solvern beschäftigen.
Gibt es eigentlich irgendwo eine kurze gute Zusammenfassung, wann man gut welchen Solver benutzen kann?
Du meinst also die ZF auf x1^2+x2^2+x3^2 = min setzen ist sinnvoller
als mit abs(x1)+abs (x2) + abs(x3)?
Das lässt sich als Funktion natürlich viel schlechter schreiben als sum(abs(x))
Da muss ich ja jede Variable einzeln aufzählen bzw. mit ner Schleife halt.
Zumindest, wenn ich mich nicht vertippt habe beim abschreiben jetzt.
Ich setze das Thema mal auf erledigt und danke für die Hilfe.
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.