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

nicht lineares Optimierungsprob in linearen Problem umformen

 

legacys01

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2017, 00:51     Titel: nicht lineares Optimierungsprob in linearen Problem umformen
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein Optimierungsproblem im dem ich versuche eine nicht linearen quotienten Funktion in einem linearen Problem bzw. Funktion umzuwandeln.
mein Versuch das Problem zu lösen ist in dem beigefügten PDF-Datei erläutert.

Fragen:

1) ist g mit den Variablen R,S und T eine linerare Funktion oder mach ich ein Denkfehler?
2) kann das Problem so gelöst werden:

Code:

g=[b -c -d];
[x2,fval2,exitflag,output,lambda] = linprog(g,[],[],Aeq,beq,LB,UB);
 


Falls nicht, dann würde ich mich auf euere Hilfe freuen.

Grüße
Legacys

Document_opt.pdf
 Beschreibung:

Download
 Dateiname:  Document_opt.pdf
 Dateigröße:  201.58 KB
 Heruntergeladen:  264 mal


Harald
Forum-Meister

Forum-Meister


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

wenn man anderen ein Optimierungsproblem zeigt, ist es immer wichtig festzulegen, welche Parameter fest sind und welche variabel. Ich vermute mal, dass hier X_i, Y_i und Z_i optimiert werden sollen.

Probleme habe ich, Schritt 4 nachzuvollziehen, weil dort auf einmal die Summen verschwinden.
Mein Eindruck ist, dass dort die Annahme \frac{\sum X_i}{\sum Y_i} = \sum \frac{X_i}{Y_i} drin steckt, die so jedoch generell falsch ist.
Beispiel: X_1 = X_2 = Y_1 = Y_2 = 1 ergibt auf der linken Seite 1, auf der rechten Seite 2.

Ich habe Zweifel, dass sich dieses Problem linearisieren lässt.

Für weitere Unterstützung bitte auch angeben, welche Nebenbedingungen es gibt.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2017, 13:18     Titel: nicht lineares Optimierungsprob in linearen Problem umformen
  Antworten mit Zitat      
Hallo Harald,

Danke für deine Antwort.
sorry, dass die infos nicht vollständig sind.

die Variabel sind wie du es schon richtig vermutet hast X_i, Y_i und Z_i
a, Pb_i ,Pp_i und Ps_i sind bekannte feste parameter.

die einzige Nebenbedingung ist:

X_i+Y_i+Z_i= m

m ist auch ein fester Parameter.

als nicht-linerares Problem wird eine Minimum gelöst, jedoch dauert die Berechnung sehr lange. dazu kommen in anderen Szenarien zusätzlich Variabel, was die Simulationszeit noch sehr verlängert.
daher die Überlegung ob es möglich ist das Problem zu linearisieren und der Versuch das Quotienoptimierungsverfahren einzusetzen, was jedoch wie du es gesehen hast in der Summenbildung scheitert und weil im Zähler der Quotienten mehrere Variabln sind und nicht nur eine.

würde mich freuen auf Lösungsanzätzen oder Vorschläge.

Grüße

Leg
 
Harald
Forum-Meister

Forum-Meister


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

was heißt denn "sehr lange"?
Zeitverbesserungen können u.a. durch Parallelisierung der Gradientenauswertungen möglich sein (Option 'UseParallel' bei den meisten Lösern).

Es kann auch effizienter sein, nur nach X_i und Y_i zu optimieren und direkt Z_i = m - X_i - Y_i einzusetzen.

Es kann auch einen Versuch Wert zu sein, die partiellen Ableitungen symbolisch auszurechnen und auf 0 zu setzen.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2017, 19:49     Titel: nicht lineares Optimierungsprob in linearen Problem umformen
  Antworten mit Zitat      
Hallo,

mit einer inputspalte von 24 Zeilen dauert die Berechnung ca. 45 min.
wenn ich 1 Quartal simulieren will, dauert es ungefähr 5 std.

ich arbeite mit der symbolische partiellen ableitungen in dem ich der Gradient und die Hesse-matrix ermittele.

Code:

ValAndGrad = @(x) deal(objFcn(x),grad(x));

options = optimset('Disp','iter','Algorithm','interior-point',...
                   'MaxFunEvals',1000,'MaxIter',5000,...
                   'GradObj','on','Hessian','user-supplied',...
                   'HessFcn',hfcn);

[x2,fval2] = fmincon(ValAndGrad,x0,[],[],Aeq,beq,LB,UB,[],options);
 


leider wie schon erwähnt dauert es auch mit der symbolischen part. ableitunge lang. es sei denn ich implemetiere es uneffizient.

habe gerade deinen Vorschlag hinsichtlich der parallelesierung der Gradientenauswertung. leider hat es keine nennenswerte Redultion der Rechenzeit geführt. (zumindest bei meiner letzten durchlauf).

könntest du mir bitte deine idee mit der Optimierung der X_i und Y_i (und nicht Z_i) erläuertern?

ich danke dir vielmals für die Hilfe

Grüß

Leg.
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
es sei denn ich implemetiere es uneffizient.

Dazu kann ich nur was sagen, wenn du die Zielfunktion und die Funktion zur Berechnung der Hessematrix postest. Man sollte aber darauf achten, den Gradienten und die Hessematrix nicht jedes Mal komplett neu zu bestimmen, sondern lediglich an der momentanen Stelle auszuwerten.
Es sollte sogar möglich sein, die Berechnung des Gradienten und der Hessematrix vorzuziehen, diese jeweils mit matlabFunction in ein Function Handle umzuwandeln, und dann nur dieses Function Handle auszuwerten.

Zitat:
könntest du mir bitte deine idee mit der Optimierung der X_i und Y_i (und nicht Z_i) erläuertern?

Viel mehr gibt's da eigentlich nicht dazu zu sagen. Eben Z_i nicht mehr direkt optimieren, sondern für Z_i den Ausdruck m - X_i - Y_i einsetzen und die Nebenbedingung dann auch weglassen.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2017, 21:16     Titel: nicht lineares Optimierungsprob in linearen Problem umformen
  Antworten mit Zitat      
Hallo Harald,

nochmal vielen Dank für deine Antwort.

hier der Code. hoffentlich gibt es optimierungsmöglichkeiten und vorschläge die helfen könnten.
Code:

%% 1 - Konstanten
N = length(B);
Ck=3000;
K2=0.001;
%% 2 - Nebenbedingungen definieren
DefineConstraints;
%% 3 - Startpunkt
x0 = [1500.*ones(size(B));800.*q; 800.*ones(size(S))];
%% 4.1 - partielle Ableitungen durch symbolic Math
X = sym('x',[3*N,1]);    
Pb = sym('Pb',[N,1]);    
Pp = sym('Pp',[N,1]);    
Ps = sym('Ps',[N,1]);    
c = sym({'c1'}.','real');
%% 4.2 -
% cost B equation
Bcost = Pb.*X(1:N).*K2;
% cost P equation
Pcost = Pp.*X(N+1:2*N).*K2;
% cost S equation
Scost = Ps.*X(2*N+1:end).*K2;
%% 4.3 -
% zu minimierender Funktion
totR = (((Ck-sum(Bcost)-sum(Pcost))./sum(Scost))-1);
%% 4.2 - Create Function File that can be Evaluated in MATLAB
% Substitution alle variabln so dass nur X die einzige bleibende variable ist
totR = subs(totR,[c;Pb;Pp;Ps],[Ck;B;P;S]);
% Generieren einer MATLAB file aus der Gleichung
matlabFunction(totR,'vars',{X},'file','objFcn');
%Gradientfunktion aus der Symbolic Math anwenden um den Grandienten zu
%berechnen
gradObj = gradient(totR,X);
% Ausgabe des Gradienten an einem Punkt
matlabFunction(gradObj,'vars',{X},'file','grad');
% DEAL funktion anwenden um meherere Outputsargumenten auszugeben
ValAndGrad = @(x) deal(objFcn(x),grad(x));
%% 6.2 - Hessian
% HESSIAN funktion durch Symbolic Math um das Hessian zu berechnen
hessObj = hessian(totR,X);
% genereien der function, die das Hessian an einem punkt ausgibt
matlabFunction(hessObj,'vars',{X},'file','Hess');
% die Hessian funktion hat zwei inputargumenten (der aktueller Punkt und
% das Lagrange Faktor) und gibt die Wert des Hessians an den aktuelles punkt.
hfcn = @(x,lambda) Hess(x);
%% 6.3 - Optimieren
options = optimset('Disp','iter','Algorithm','interior-point',...
                   'MaxFunEvals',1000,'MaxIter',5000,...
                   'GradObj','on','Hessian','user-supplied',...
                   'HessFcn',hfcn);
tic
[x2,fval2] = fmincon(ValAndGrad,x0,[],[],Aeq,beq,LB,UB,[],options);
toc
% Egebnisse visualisieren
plotResults(x2,B,P,S,Pow,N);
 
 
Harald
Forum-Meister

Forum-Meister


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

mangels B, DefineConstraints etc. kann ich das nicht laufen lassen.

Hast du mal den Profiler darauf angewendet? Wo wird die meiste Zeit verbracht?
Wie sehen die erzeugten Dateien grad.m und Hess.m aus?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2017, 23:47     Titel: nicht lineares Optimierungsprob in linearen Problem umformen
  Antworten mit Zitat      
Hallo,

anbei die DefineConstraints.m . die B und all andere Daten kannst du den beigefügten Excel-datei entnehmen und durch den Importoption in Matlab laden.

DefineConstraints.m:

Code:

%% q Beschräkung
I=1;K=1;n=N/24;
for I = 1:N/n
     if I >8 && I<=20
M(I,:) = 1;
     else
M(I,:) = 0;
    end
end
q=M;
if n==1
    q=M;
else
    for K=1:n-1
       q=[q;M];
    end
end
%% Bounds
LB=[1000.*ones(N,1);500.*q;500.*ones(N,1)];
UB = [4000.*ones(N,1);1500.*q;5000.*ones(N,1)];
%% Equality Constraints
A1 = ones(1,3*N);
b1 = sum(P);
t=ones(N,1);
%u=ones(N,1);
z=ones(N,1);
A2 = spdiags([t q z],[0 N 2*N],N,N*3);
b2=P;
Aeq=[A2;A1];
beq=[b2;b1];
 


Table.xls
 Beschreibung:

Download
 Dateiname:  Table.xls
 Dateigröße:  10.93 KB
 Heruntergeladen:  217 mal
Table.xls
 Beschreibung:

Download
 Dateiname:  Table.xls
 Dateigröße:  10.93 KB
 Heruntergeladen:  212 mal
 
Legacys01

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2017, 10:37     Titel:
  Antworten mit Zitat      
Hallo zusammen,

Nachdem ich den profiler darauf angewendet habe, sieht es so aus dass die mpadmex 98% der zeit schluckt.
Irgendwelche ideen wie man es vllt performtbzw. Geht das überhaupt?

Gruß
Legacys
 
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.