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

Randbedinung bei Optimierung mit lsqnonlin

 

Meyla

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.02.2015, 12:52     Titel: Randbedinung bei Optimierung mit lsqnonlin
  Antworten mit Zitat      
Hallo, ich komme gerade leider einfach nicht weiter. Ich habe folgendenden Testalgorithmus(welcher auf ein weitaus größeres und komplexeres Programm übertragen wird):

Code:
B=[1 3 ;
     2 4] ;

C = [1.4 1.4;
        2.2 2];

x0=zeros(2,2);
lower=zeros(2,2);
upper=ones(2,2);

x=lsqnonlin(@TestA,x0,lower,upper);

    function out=TestA(y)
        X=y;
        out=(B*X-C);
               
    end    
 


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

oder auch

0=X*ones(2,1)-ones(2,1)

eingehalten werden. Wie kann ich das einbinden?

Grüße,
Meyla


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 09.02.2015, 13:03     Titel:
  Antworten mit Zitat      
guck dir mal den befehl
Code:
an vieleicht hilft dir das weiter.
bitte verwende in zukunft die code umgebung wenn du code postest.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.02.2015, 13:07     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Meyla

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.02.2015, 19:40     Titel:
  Antworten mit Zitat      
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! Very Happy

Grüße,Meyla
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.02.2015, 20:04     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Meyla

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2015, 08:38     Titel:
  Antworten mit Zitat      
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.

Gruß, Meyla
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 11.02.2015, 10:10     Titel:
  Antworten mit Zitat      
warum lässt sich dann nur noch eine der beiden nebenbedingungen erfüllen?
Code:
B=[1 3 ;...
    2 4] ;

C = [1.4 1.4;...
    2.2 2];

B1=[B(1,1) 0 B(1,2) 0;...
    0 B(1,1) 0 B(1,2);...
    B(2,1) 0 B(2,2) 0;...
    0 B(2,1) 0 B(2,2)];
C1=[C(1,1);C(1,2);C(2,1);C(2,2)];

A=[1 1 0 0;...
    1 0 1 0;...
    0 0 1 1;...
    0 1 0 1];
b=ones(4,1);
x0=zeros(4,1);
lb=zeros(4,1);
ub=ones(4,1);

x=lsqlin(B1,C1,A,b,[],[],lb,ub,x0);

man muss das halt nur umschreiben
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Meyla

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2015, 10:26     Titel:
  Antworten mit Zitat      
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 Cool
 
Meyla

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2015, 17:25     Titel:
  Antworten mit Zitat      
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
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.02.2015, 17:38     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Meyla

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2015, 16:03     Titel:
  Antworten mit Zitat      
Ahja! Wieder mal Dankeschön Harald. Ich brauch des öfteren einen kleinen Denkanstoß!Very Happy
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?

Viele Grüße,
Meyla
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.02.2015, 17:25     Titel:
  Antworten mit Zitat      
Hallo,

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
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 - 2024 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.