Verfasst am: 09.02.2015, 12:52
Titel: Randbedinung bei Optimierung mit lsqnonlin
Hallo, ich komme gerade leider einfach nicht weiter. Ich habe folgendenden Testalgorithmus(welcher auf ein weitaus größeres und komplexeres Programm übertragen wird):
Das funktioniert ohne Probleme. Nun ist allerdings notwendig, dass die Zeilen von x aufsummiert nicht größer als 1 sein dürfen. Es müssen also die NB:
x(1,1)+x(1,2) <= 1
x(2,1)+x(2,1) <= 1
falls die Zielfunktion im echten Beispiel auch linear ist, sollte lsqlin verwendet werden. Das erlaubt auch die Übergabe linearer Nebenbedingungen.
Dazu müsstest du mit einem Vektor von zu optimierenden Variablen arbeiten, nicht mit einer Matrix.
Grüße,
Harald
Meyla
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 09.02.2015, 19:40
Titel:
Vielen Dank für eure Tipps! Nach langem Herumbasteln hat es mit fmincon bei meinem Beispiel-Algorithmus funktioniert. Nur Leider wirft er mir im richtigen Algorithmus fragwürdige Ergebnisse aus. ( gerade mal 10 von 150 sind ungleich null)... Das wird mich wohl noch etwas beschäftigen!
falls die Zielfunktion linear ist, wird lsqlin mit ziemlicher Sicherheit in kürzerer Zeit bessere Ergebnisse liefern.
Wenn fmincon keine guten Ergebnisse liefert, liegt das häufig an einem schlechten Startwert - und resultierend daraus, dass fmincon ein lokalem Minimum statt dem gewünschten globalen findet.
Grüße,
Harald
Meyla
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 11.02.2015, 08:38
Titel:
Hallo Harald,
ja nur das Problem an lsqlin ist, dass wir A*x=c, also x und c als Vektoren. Somit könnte ich das Kriterium gar nicht erst prüfen, denn es müssen in X alle Spalten ausfsummiert UND alle Zeilen aufsummiert jeweils 1 ergeben. Somit muss ich das in Matrizen sammeln. Würde ich die Matrizen auf Vektoren aufteilen, ließe sich nur noch eine der beiden Bedingungen erfüllen. Dass ich zwei NB's habe, habe ich zu Beginn vergessen zu erwähnen, da eine der beiden sich leicht umsetzen lässt und schon seit Beginn Bestandteil meines Algorithmus ist.
Oh ja klar, du hast Recht! Ich werde es später versuchen auf meinen Algorithmus zu übertragen. Vielen, vielen Dank! Ich stand etwas auf dem Schlauch
Meyla
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 15.02.2015, 17:25
Titel:
Hallo ich bins nochmal,
vielen Dank nochmal die Tipps haben sehr geholfen. Nun habe ich noch eine Frage. Um den Rechenaufwand zu minimieren habe ich habe ich durch andere Berechnungen schon bestimmen können welche x(i,j) in jedem Fall 0 sein müssen. Nun ist meine Frage, wie kann ich das wiederum beim Lösen de Gleichungssystems einfließen lassen? Geht das überhaupt? Also, dass die Matrix vor lösen schon so in der Art vorgegeben wird und nur noch x(1,1),x(1,2),x(2,1),x(2,2) und x(3,3) gelöst werden müssen da der Rest sowieso null sein muss.
x(1,1) x(1,2) 0
x= x(2,1) x(2,2) 0
0 0 x(3,3)
Ich wäre wieder sehr dankbar über eure Hilfe!
Viele Grüße, Meyla
es bleibt ja weiterhin ein lineares Problem.
Wenn du zuvor die Matrix in einen Vektor umgewandelt hast, dann musst du jetzt die Elemente, die 0 sein sollen, aus dem Vektor entfernen und ebenso die entsprechenden Einträge der Matrix - ausgehend von einem Spaltenvektor sind auch das Spalten.
Grüße,
Harald
Meyla
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 17.02.2015, 16:03
Titel:
Ahja! Wieder mal Dankeschön Harald. Ich brauch des öfteren einen kleinen Denkanstoß!
Ich habe es heute mittag so umgesetzt und es funktioniert super!
Nun ist aber wieder was neues aufgekommen über die ich schon eine Weile grübel. Unter den x(i,j)'s sind manche voneinander abhängig. Das bedeutet wenn beispielsweise x(1,1)=0 ist muss x(1,2) auch null sein. wenn x(1,1) >0 ist muss x(1,2) jedoch nicht auch größer null sein. Ist das verständlich?Lässt sich das auch wieder so leicht umsetzen wie meine bisherigen Problemchen?
das wäre nichtlinear und nicht einmal differenzierbar, somit für die bisherigen Ansätze m.E. sehr problematisch. Wenn es irgendwie geht, würde ich das vermeiden.
Grüße,
Harald
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.