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

Konstante Randwerte in Linprog

 

cruiser05
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2014, 15:20     Titel: Konstante Randwerte in Linprog
  Antworten mit Zitat      
Hallo zusammen,

vielleicht ist es auch trivialer als gedacht, aber ich habe ein kleines Problem mit dem linprog in Matlab (Version 2014a).

Bei einem gegebenen Problem habe ich ca 243 Variablen.
Diese habe ich in einen Vektor gepackt.

Diverse Gleichung und Ungleichungen habe ich wie in der Matlab-Hilfe erklärt anhand meines Problems definiert.

Ist es möglich zwei der Variablen in X festzulegen?
Konkret möchte ich zwei Längen (Anfangs - und Endlänge) festlegen. Alles dazwischen soll sich Matlab berechnen.

Wenn ich Anfangs die beiden Werte definiere, ändert Matlab diese Werte beim durchlaufen des Programms.

Hat jemand eine Idee wie diese konstant gehalten werden können?
in c++ habe ich einfach const benutzt. Gibt es was äquivalentes in Matlab?



Beste Grüße
Cruiser05


EDiT:
Wenn ich die beiden Variablen mit Grenzen (upper und lower) auf die dementsprechende Zahl beschränke, dann erhalte ich folgende Fehlermeldung:

"Exiting due to infeasibility: an all-zero row in the constraint
matrix does not have a zero in corresponding right-hand-side entry."

Vielleicht kennt das Problem ja jemand.?
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: 17.05.2014, 09:43     Titel:
  Antworten mit Zitat      
Hallo,

reduziere den Vektor auf Länge 241 und rechne die beiden anderen Beiträge mit ein.

Beispiel:
min(f' * x) mit f = [5, 6, 7, 8]
unter Bedingung A *x = b mit A = reshape(1:16, 4,4), b = (17:20)'
die erste und letzte Komponente von x soll festbleiben.

Dann wird daraus
min(fneu' * xneu) mit fneu = [6, 7] (der Rest ist konstant und kann vernachlässigt werden) mit der Bedingung
Aneu * xneu = bneu wobei
Aneu = A(:, 2:3) und bneu = b - A(:, [1 4]) * [x1_fest; x4_fest]

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2014, 13:46     Titel:
  Antworten mit Zitat      
Hallo Harald,

entschuldige die späte Rückmeldung und vielen Dank für deine Antwort.
Habe deinen Tipp beherzigt, aber ich habe wohl einen grundlegenden peinlichen Fehler meinerseits übersehen.

Ich habe nichtlineare Funktionen in meinem LP einfach versucht dort hinein zu friemeln.

Beispielsweise habe ich die Volumenkonstanz so definiert:
for i = 2:25
Mat_eq(i, [1,i]) = [x(26)*x(27), i+25, i+50]
end

(mit 1, 26,27 mal angenommen als Höhe, Breite, Länge)
(i: Höhe, i+25: Breite, i+50: Länge)

Dort gibt es wahrscheinlich keinen Workaround?
Müssen die Gleichungen zwingend linear sein?

Beste Grüße,
Cruiser05
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: 19.05.2014, 16:46     Titel:
  Antworten mit Zitat      
Hallo,

bei linprog müssen Zielfunktion und Nebenbedingungen linear in den Designvariablen sein.

Wenn du Anfang und Ende aus der Optimierung herausnimmst, muss es in diesen beiden natürlich nicht mehr linear sein.

Ich weiß nicht, welche Nebenbedingungen du umsetzen möchtest und kann dir daher auch nicht sagen, ob deine Umsetzung korrekt ist. Ich würde aber allein schon bei der Erzeugung von Mat_eq eine Fehlermeldung erwarten.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.05.2014, 12:03     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für die Rückmeldung.

Dann werde ich wohl mal knobeln.
Meine Bedingungen sind fast alle nicht-linear. Smile

Aber man wächst ja bekanntlich mit seinen Aufgaben, ich versuche es weiter und schreie wenn ich wieder vor einer Mauer stehe. Razz

Danke schonmal für deine Hilfe.

Beste Grüße,
Cruiser05
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: 22.05.2014, 12:40     Titel:
  Antworten mit Zitat      
Hallo,

wenn die Nebenbedingungen nichtlinear in den anzupassenden Variablen sind, dann geht eben linprog nicht. Stattdessen kannst du z.B. fmincon verwenden.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.05.2014, 16:47     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe versucht das Problem für fmincon umzuschreiben.

Kannst du mir sagen ,wie ich mehrere Gleichungen mit Laufvariablen in ceq bekomme?

Die Schreibweise ist ja eigentlich:
Code:

%Nur ein Beispiel
ceq = [x1+x3^2+3;
x1+x2+x4];
 


Ich habe mehrere Formeln mit Laufvariablen.
Für die Umformung: eps=ln(h1/h0)*2/sqrt(3)

Bei mir sieht diese nun jetzt so aus:
Code:


function[c, ceq] = confun(x)
c=[];

for i= 1:30
ceq(i) = ln(X(i+31)/X(i+30))*2/sqrt(3)
end

 


Klappt dies so, oder muss ich das anders schreiben?

Grüße,
cruiser05
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: 29.05.2014, 17:16     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Klappt dies so, oder muss ich das anders schreiben?

Das hängt davon ab, welche Gleichungen du umsetzen möchtest.

Mir fällt auf, dass das eps (es wird wohl kaum das eps aus MATLAB gemeint sein? Ich würde es umbenennen, um Verwirrung zu vermeiden) aus der vorherigen Gleichung fehlt. Man muss Gleichungen so umstellen, dass auf einer Seite 0 steht.

Die Auswertung könnte übrigens auch vektorisiert erfolgen.

Zudem könnte die Gleichung als lineare Gleichung umgeschrieben werden:
eps=ln(h1/h0)*2/sqrt(3)
eps/2*sqrt(3) = ln(h1/h0)
exp(eps/2*sqrt(3)) = h1/h0
exp(eps/2*sqrt(3)) * h0 - h1 = 0

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.05.2014, 17:43     Titel:
  Antworten mit Zitat      
Hallo,

eps habe ich gerade einfach für den Umformgrad genommen. Im Programm soll das später im X-Vektor stehen (bspw. X(1) ) weil es sich laufend ändert.

Also müsste ich die Gleichung so einbauen:
Code:

for i=1:30
ceq = ( ln( X(i+31) / X(i+30) ) ) *2/sqrt(3) - X(i)
end
 

?
_____________________________________________________________

Linear funktioniert das doch nicht weil ich den Vorfaktor, welcher zu Beginn in aeq geschrieben wird , nicht kenne, oder? (alle h und eps ändern sich laufend)
_____________________________________________________________

Das Linearisieren habe ich versucht, aber dann hänge ich bei einer anderen Formel fest.

Bei gegebener Formel
ln(Kf) = ln(K) + ln(eps_punkt)*m1 + ln(eps_punkt)*m2*T + m3*T + ln(eps) * m4 + m5*eps

benötige ich den ln von eps (dem Umformgrad [ändert sich mit jedem Durchlauf]).

Mit dem LP bekomme ich das nicht in Matlab.
Ich scheitere bei
Aeq(i,[]) = [];
In den vorderen eckigen Klammern stehen die Spalten der Elemente in der Matrix.
Die hinteren sind der Eintrag, also der lineare Faktor.

Möchte ich nun m4*ln(eps) dort hineinschreiben, dürfte dies meines Wissens nach nicht funktionieren.

Daher wollte ich es mit deinem Vorschlag, dem fmincon, versuchen.


Grüße,
cruiser05
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: 29.05.2014, 18:14     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Im Programm soll das später im X-Vektor stehen (bspw. X(1) ) weil es sich laufend ändert.

Wenn dem so ist, klar. Aber das kann ich ja nicht ahnen.

Zitat:
Also müsste ich die Gleichung so einbauen:

Weiterhin: Das hängt davon ab, welche Gleichungen du umsetzen möchtest.

Nach den Informationen, die ich habe, könnte es ebenso gut
Zitat:
for i=1:30
ceq = ( ln( X(i+31) / X(i+30) ) ) *2/sqrt(3) - X(1)
end

heißen müssen.

Zitat:
Linear funktioniert das doch nicht weil ich den Vorfaktor, welcher zu Beginn in aeq geschrieben wird , nicht kenne, oder? (alle h und eps ändern sich laufend)

Jep. Das konnte ich aber wie gesagt nicht ahnen.

Zitat:
Das Linearisieren habe ich versucht, aber dann hänge ich bei einer anderen Formel fest.

Bei gegebener Formel
ln(Kf) = ln(K) + ln(eps_punkt)*m1 + ln(eps_punkt)*m2*T + m3*T + ln(eps) * m4 + m5*eps

benötige ich den ln von eps (dem Umformgrad [ändert sich mit jedem Durchlauf]).

Bitte klar kenntlich machen, welche Formelteile nun veränderlich sind und welche nicht.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.05.2014, 18:28     Titel:
  Antworten mit Zitat      
Hallo,

Sorry. Ich versuche das ganze mal übersichtlich darzustellen
Für
Code:

for i=1:30
ceq = ( ln( X(i+31) / X(i+30) ) ) *2/sqrt(3) - X(i)
end
 

sind alle X variabel. (X(i+31) und X(i+30) sind jeweils Höhen, X(i) ist je ein Epsilon.)
(Es sollen am Ende 30 Epsilon berechnet worden sein.)

Edit: Habe ich mehrere Gleichungen der obigen Art, kann ich diese einfach in je einer Schleife untereinander schreiben oder überschreiben die sich gegenseitig das ceq?

Bei der Gleichung
Code:

ln(Kf) = ln(K) + ln(eps_punkt)*m1 + ln(eps_punkt)*m2*T + m3*T + ln(eps) * m4 + m5*eps
 

sind Kf, eps_punkt, T und eps variabel und ändern sich mit jedem Durchlauf.
Am Ende sollten also auch hier je 30 Werte vorhanden sein.

Die 30 Kf werden dann an eine weitere Funktion weitergegeben.

Das ln(K), m1, m2, m3, m4, m5 kann ich direkt festlegen.

Probleme habe ich dann nur mit den ln(eps_punkt) und den ln(eps), wobei sich ja beides immer ändert.

Hoffe ich konnte mein Chaos beseitigen. Wink

Beste Grüße,
cruiser05
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: 29.05.2014, 18:41     Titel:
  Antworten mit Zitat      
Hallo,

es muss natürlich so heißen:

Code:
ceq = zeros(30, 1); % vorbelegen ist empfohlen
for i=1:30
ceq(i) = ( ln( X(i+31) / X(i+30) ) ) *2/sqrt(3) - X(i);
end

sonst überschreibst du ceq in der Tat in jeder Iteration.

Zitat:
sind Kf, eps_punkt, T und eps variabel und ändern sich mit jedem Durchlauf. Am Ende sollten also auch hier je 30 Werte vorhanden sein.

Falls eps, eps_punkt und Kf nicht in der Zielfunktion auftauchen, kann man sich durch Einführung neuer Variablen L_eps = ln(eps) etc. behelfen, in denen die NB dann linear ist. Ansonsten ist es einfach eine nichtlineare NB, und es gibt keinen Weg das zu vermeiden.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.05.2014, 18:57     Titel:
  Antworten mit Zitat      
Ok, dann versuche ich das mal mit dem ceq.

Harald hat Folgendes geschrieben:

Falls eps, eps_punkt und Kf nicht in der Zielfunktion auftauchen, kann man sich durch Einführung neuer Variablen L_eps = ln(eps) etc. behelfen, in denen die NB dann linear ist. Ansonsten ist es einfach eine nichtlineare NB, und es gibt keinen Weg das zu vermeiden.


Das war auch mein Gedanke. Nur wenn ich
Code:

for ........
L_eps(i) = log(eps(i))
end
 

in Matlab eingebe, dann wird dies nicht bei jeder Iteration angewandt?
Und in dieser Aeq-Schreibweise bekomme ich das nicht hin?
Dann kommt halt direkt die ganze Kf-Formel in ein ceq und schon habe ich mir das mit dem zusätzlichen Umformen gespart.
Das kf wird dann auch wieder in der Zielfunktion gebraucht.
Ich denke deine Anregung mit dem fmincon ist die sinnvollere Lösung als ein einfaches LP erzwingen zu wollen.

Danke nochmal an dieser Stelle für deine Hilfe!

Grüße,
cruiser05
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: 29.05.2014, 19:09     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
dann wird dies nicht bei jeder Iteration angewandt?

Nicht, wenn du lediglich die Startwerte (sofern du welche vorgibst) transformierst und am Ende die Lösung zurücktransformierst.

Zitat:
Das kf wird dann auch wieder in der Zielfunktion gebraucht.

Für sich oder wieder als ln(Kf)?
Falls nur für sich, dann kannst du das mit der Transformation vergessen, weil man wenn ja das gesamte Problem transformieren müsste.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.05.2014, 19:12     Titel:
  Antworten mit Zitat      
Hallo,


das Kf würde für sich wieder in die Zielfunktion einfließen.

Ich teste mit dem fmincon weiter und hoffe auf positive Resultate.


Grüße,
cruiser05
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.