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

LGS lösen mit lsqlin mit veränderlichen Nebenbedingungen

 

rosti1809
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 22.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2018, 22:50     Titel: LGS lösen mit lsqlin mit veränderlichen Nebenbedingungen
  Antworten mit Zitat      
Hallo,

ich möchte ein Optimierungsproblem lösen. Das Gleichungssystem ist linear und überbestimmt. Daher habe ich bis jetzt lsqlin verwendet.
Code:

x = lsqlin(C,d,A,b,Aeq,beq,lb,ub)
 

Die Nebenbedingungen lassen sich ja mit
Code:

lb = [ lb1 lb2 lb3 lb4 ]
ub = [ ub1 ub2 ub3 ub4]
 

festlegen.
Gibt es eine Möglichkeit die Bedingungen von der Lösung abhängig zu machen?
Also das
Code:

x1 = ub2
x2 = ub3
x3 = ub4
 

wird? Ich hoffe, dass ich es verständlich beschrieben habe.
Die Lösung von lsclin soll daran:
Code:

x1>x2>x3>x4
 

gebunden sein.

Grüße Micha
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.11.2018, 23:06     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich hoffe, dass ich es verständlich beschrieben habe.

Das vorherige war für mich nicht verständlich. Falls das folgende aber das gleiche sein soll... das lässt sich leicht als lineare Ungleichung A * x <= b umsetzen mit:
Code:
A = [-1 1 0 0; 0 -1 1 0; 0 0 -1 1]; b = zeros(4,1);


Falls du schon lineare Ungleichungen hast, kannst du die neuen unter die bestehenden hängen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
rosti1809
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 22.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.11.2018, 16:47     Titel:
  Antworten mit Zitat      
Hallo Harald,

dass mit den Ungleichungen hab ich nicht ganz verstanden. Kann daran liegen, dass mein Eingangspost so allgemein geschrieben war.
Aber ich bin mir auch nicht ganz sicher, ob ich lsqlin richtig verwende. Da bin ich mir im englischen, und in der Übersetzung doch sehr unsicher. Ich poste einfach mal meinen
Code:


filename = 'RuestzeitenMaster';

filenameIN = sprintf('%s.xlsx', filename);
sheet = 1;
Spaltenstart = 64;

while sheet <= 22

    xlRange = 'C2:R16';
    x = xlsread(filenameIN,sheet,xlRange);
   

    x1=x(:,[1]);
    x2=x(:,[2]);
    x3=x(:,[3]);
    x4=x(:,[4]);
    x5=x(:,[5]);
    x6=x(:,[6]);
    x7=x(:,[8]);
    x8=x(:,[9]);
    x9=x(:,[10]);
    x10=x(:,[11]);
    x11=x(:,[13]);
    x12=x(:,[14]);
   
    y=x(:,[15]);
   
    A = [];
    b = [];
   
   
    C=[ sum(x1.^2)  sum(x2.*x1)  sum(x3.*x1)  sum(x4.*x1)  sum(x5.*x1)  sum(x6.*x1)...
        sum(x7.^2)  sum(x8.*x1)  sum(x9.*x1)  sum(x10.*x1)  sum(x11.*x1)  sum(x12.*x1);
    sum(x1.*x2)  sum(x2.^2)  sum(x3.*x2)  sum(x4.*x2)  sum(x5.*x2)  sum(x6.*x2)...
    sum(x7.*x2)  sum(x8.*x2)  sum(x9.*x2)  sum(x10.*x2)  sum(x11.*x2)  sum(x12.*x2);
    sum(x1.*x3)  sum(x2.*x3)  sum(x3.^2)  sum(x4.*x3)  sum(x5.*x3)  sum(x6.*x3)...
    sum(x7.*x3)  sum(x8.*x3)  sum(x9.*x3)  sum(x10.*x3)  sum(x11.*x3)  sum(x12.*x3);
    sum(x1.*x4)  sum(x2.*x4)  sum(x3.*x4)  sum(x4.^2)  sum(x5.*x4)  sum(x6.*x4)....
    sum(x7.*x4)  sum(x8.*x4)  sum(x9.*x4)  sum(x10.*x4)  sum(x11.*x4)  sum(x12.*x4);
    sum(x1.*x5)  sum(x2.*x5)  sum(x3.*x5)  sum(x4.*x5)  sum(x5.^2)  sum(x6.*x5)...
    sum(x7.*x5)  sum(x8.*x5)  sum(x9.*x5)  sum(x10.*x5)  sum(x11.*x5)  sum(x12.*x5);
    sum(x1.*x6)  sum(x2.*x6)  sum(x3.*x6)  sum(x4.*x6)  sum(x5.*x6)  sum(x6.^2)...
    sum(x7.*x6)  sum(x8.*x6)  sum(x9.*x6)  sum(x10.*x6)  sum(x11.*x6)  sum(x12.*x6);
    sum(x1.*x7)  sum(x2.*x7)  sum(x3.*x7)  sum(x4.*x7)  sum(x5.*x7)  sum(x6.*x7)...
    sum(x7.^2)  sum(x8.*x7)  sum(x9.*x7)  sum(x10.*x7)  sum(x11.*x7)  sum(x12.*x7);
    sum(x1.*x8)  sum(x2.*x8)  sum(x3.*x8)  sum(x4.*x8)  sum(x5.*x8)  sum(x6.*x8)...
    sum(x7.*x8)  sum(x8.^2)  sum(x9.*x8)  sum(x10.*x8)  sum(x11.*x8)  sum(x12.*x8);
    sum(x1.*x9)  sum(x2.*x9)  sum(x3.*x9)  sum(x4.*x9)  sum(x5.*x9)  sum(x6.*x9)...
    sum(x7.*x9)  sum(x8.*x9)  sum(x9.^2)  sum(x10.*x9)  sum(x11.*x9)  sum(x12.*x9);
    sum(x1.*x10)  sum(x2.*x10)  sum(x3.*x10)  sum(x4.*x10)  sum(x5.*x10)  sum(x6.*x10)...
    sum(x7.*x10)  sum(x8.*x10)  sum(x9.*x10)  sum(x10.^2)  sum(x11.*x10)  sum(x12.*x10);
    sum(x1.*x11)  sum(x2.*x11)  sum(x3.*x11)  sum(x4.*x11)  sum(x5.*x11)  sum(x6.*x11)...
    sum(x7.*x11)  sum(x8.*x11)  sum(x9.*x11)  sum(x10.*x11)  sum(x11.^2)  sum(x12.*x11);
    sum(x1.*x12)  sum(x2.*x12)  sum(x3.*x12)  sum(x4.*x12)  sum(x5.*x12)  sum(x6.*x12)...
    sum(x7.*x12)  sum(x8.*x12)  sum(x9.*x12)  sum(x10.*x12)  sum(x11.*x12)  sum(x12.^2)];


    d=[sum(x1.*y);
       sum(x2.*y);
       sum(x3.*y);
       sum(x4.*y);
       sum(x5.*y);
       sum(x6.*y);
       sum(x7.*y);
       sum(x8.*y);
       sum(x9.*y);
       sum(x10.*y);
       sum(x11.*y);
       sum(x12.*y)];
   

    Aeq = [];
    beq = [];

    lb = [1 1 0.01 0.01 0.01 0.01 0 0 0 0 0 0];
    ub = [50 10 1 0.4 0.3 0.3 200 200 200 200 200 200];


    [Faktor, resnorm] = lsqlin(C,d,A,b,Aeq,beq,lb,ub);


    Spaltenindex = char(Spaltenstart + sheet);

    filenameOUT = sprintf('%s_MES_Ergebnis.xlsx', filename);
   
     
    xlRangeF = sprintf('%s1',Spaltenindex);
    xlswrite(filenameOUT, Faktor, 1, xlRangeF)
   
    xlRangeR = sprintf('%s14',Spaltenindex);
    xlswrite(filenameOUT, resnorm, 1, xlRangeR)
   
    sheet = sheet+1;
   
end

 


Ich lese die Daten aus einem Excelfile ein. Einige skalare Werte und manche sind eigentlich binär (Spalte 8, 9, 10, 11 und 13, 14). Die Binärwerte repräsentieren eine Klassenzugehörigkeit.

Code:

1   7    80,4   0     0   0   0,30   1   0   0   0   46    1   0   45   77,2
1   16   0      514   0   0   40,8   0   0   0   1   454   0   1   60   221,5
1   8    275    0     0   0   14,7   0   0   1   0   290   0   1   170  187,3
 


lsqlin liefert die Ergebnisse in Faktor ja entsprechend lb und ub. Aber eigentlich möchte ich bei den klassierten Daten nur die Obergrenze und die Untergrenze festlegen und das Ergebnis soll eben zusätzlich der Bedingung folgen (Faktor3>Faktor4>Faktor5>Faktor6) und (Faktor7<Faktor8<Faktor9<Faktor10) sowie (Faktor11<Faktor12).

Sollte sich das mit deiner ersten Antwort schon bewerkstelligen lassen, tut es mir leid, aber ich checks gerade nicht. Sorry!

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

Forum-Meister


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

ob du das richtig anwendest, kann ich nicht beurteilen, weil ich nicht weiß, welches Optimierungsproblem du letztlich lösen willst. Das Aufstellen von C und d erscheint mir aber etwas umständlich. Lässt sich evtl. auch direkt durch Matrixmultiplikation o.
ä. lösen.
Zitat:
(Faktor3>Faktor4>Faktor5>Faktor6) und (Faktor7<Faktor8<Faktor9<Faktor10) sowie (Faktor11<Faktor12).

Das sind alles lineare Ungleichungen, z.B.
Faktor3>Faktor4 --> Faktor3 - Faktor4 < 0 --> 1*Faktor3 + (-1)*Faktor4 < 0,
und diese Zeile in die linearen Ungleichungen aufnehmen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
rosti1809
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 22.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.11.2018, 00:11     Titel:
  Antworten mit Zitat      
Ich möchte ein Programm einstellen, das anhand verschiedener Größen die Rüstzeit eines CNC-Bearbeitungszentrums abschätzt.

Die Ungleichungen habe ich wie in deinem ersten Post aufgebaut, hoffentlich richtig. Für die Bedingungen habe ich die Daten so umstrukturiert, dass es immer auf ein ">" hinausläuft.

Code:


       A = [0 0 -1 1 0 0 0 0 0 0 0 0; 0 0 0 -1 1 0 0 0 0 0 0 0; 0 0 0 0 -1 1 0 0 0 0 0 0;...
           0 0 0 0 0 0 -1 1 0 0 0 0; 0 0 0 0 0 0 0 -1 1 0 0 0; 0 0 0 0 0 0 0 0 -1 1 0 0;...
           0 0 0 0 0 0 0 0 0 0 -1 1];

       b = zeros(7,1);

 


Die Ergebnisse gehorchen auch den Bedingungen, allerdings sind sie nicht so, wie ich es erwartet hatte. Durch die zusätzliche Einbindung der klassierten Daten hatte ich mir geringere Abweichungen erhofft, aber es ist eher anders herum.

Ich danke dir auf jeden Fall.

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

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.11.2018, 01:21     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Für die Bedingungen habe ich die Daten so umstrukturiert, dass es immer auf ein ">" hinausläuft.

Es muss aber immer < bzw. <= sein, siehe Doku von lsqlin.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
rosti1809
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 22.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.11.2018, 01:48     Titel:
  Antworten mit Zitat      
Hallo,

ich glaube da hast du mich missverstanden.

Harald hat Folgendes geschrieben:

Es muss aber immer < bzw. <= sein, siehe Doku von lsqlin.


Ich meinte nicht

Ax>b

sondern

(Faktor3>Faktor4>Faktor5>Faktor6) und (Faktor7>Faktor8>Faktor9>Faktor10) sowie (Faktor11>Faktor12)

statt

(Faktor3>Faktor4>Faktor5>Faktor6) und (Faktor7<Faktor8<Faktor9<Faktor10) sowie (Faktor11<Faktor12)

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

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.11.2018, 12:10     Titel:
  Antworten mit Zitat      
Hallo,

ich weiß zwar nicht, was der Sinn dieses Umschreibens ist, aber solange es dir weiterhilft...

Grüße,
Harald

In meinem Beitrag von 24.11., 17:21 ist im übrigen ein Fehler bei der Umformung:
Faktor3>Faktor4 --> -Faktor3 + Faktor4 < 0 --> 1*Faktor3 + (-1)*Faktor4 < 0
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.