nicht lineares Optimierungsprob in linearen Problem umformen
legacys01
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 26.02.2017, 00:51
Titel: nicht lineares Optimierungsprob in linearen Problem umformen
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:
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 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
legacys01
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 26.02.2017, 13:18
Titel: nicht lineares Optimierungsprob in linearen Problem umformen
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.
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
legacys01
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 26.02.2017, 19:49
Titel: nicht lineares Optimierungsprob in linearen Problem umformen
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.
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?
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
legacys01
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 27.02.2017, 21:16
Titel: nicht lineares Optimierungsprob in linearen Problem umformen
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);
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
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.