WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Warum liefert Intlinprog nicht das Optimum?

 

Lockyy
Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 26.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2016, 17:29     Titel: Warum liefert Intlinprog nicht das Optimum?
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen


Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 12.01.2016, 18:02     Titel:
  Antworten mit Zitat      
Hallo Lockyy,

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.

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.01.2016, 18:39     Titel:
  Antworten mit Zitat      
Hallo,

die Funktion wurde in R2014a eingeführt.

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Lockyy
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 26.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2016, 18:58     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:

Zudem gibst du als obere Schranke 1,5 an.


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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.01.2016, 19:29     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Generell sollte linprog bei Berechnungen dieser Art ja gut gehen, oder?

Wenn du keine Integer-Nebenbedingungen hast, ja.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Lockyy
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 26.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2016, 12:30     Titel:
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 13.01.2016, 12:58     Titel:
  Antworten mit Zitat      
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.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Lockyy
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 26.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2016, 13:43     Titel:
  Antworten mit Zitat      
Was meinst du mit zwei Lösungen?

mit linprog kann ich ja nur als Zielfunktion

f1*X1+f2*X2+f3*X3 + ... = min eingeben, wobei f entweder + oder - 1 ist.

abs(X1)+abs(X2)+abs(X3) bekomme ich ja gar nicht in den Solver. Oder doch?
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 13.01.2016, 14:25     Titel:
  Antworten mit Zitat      
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.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Lockyy
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 26.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2016, 14:45     Titel:
  Antworten mit Zitat      
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.

Danke aber mal soweit!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.01.2016, 16:24     Titel:
  Antworten mit Zitat      
Hallo,

wenn abs ins Spiel kommt oder auch Quadrate, ist es zumindest mal nicht mehr linear.

Eine Übersicht über die Solver gibt es hier:
http://www.mathworks.com/help/optim/ug/choosing-a-solver.html

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Lockyy
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 26.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2016, 17:34     Titel:
  Antworten mit Zitat      
So, dann will ich mal (hoffentlich) abschließen hier.
für die ZF mit Sum(abs(X)) lautet mein Code:

Code:

fun = @(x)sum(sqrt(x.^2));
x0 = zeros(3,1);
[X,sumX] = (fun,x0,-A,-b,[],[],lb,ub]
 


Zumindest, wenn ich mich nicht vertippt habe beim abschreiben jetzt.
Ich setze das Thema mal auf erledigt und danke für die Hilfe.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.