Verfasst am: 27.07.2016, 09:25
Titel: Optimierungsproblem mit mehreren Ausgangsgrößen
Moin,
ich möchte einen optimalen Gewichtungsvektor für ein Problem der Farbsynthese berechnen.
Ein Gewichtungsvektor [a,b,c,d,e,f] gewichtet die PWM einzelner Farben in einem Algorithmus.
Ein Gütemaß ist der sogenannte CRI, der von mir in mehreren Schritten berechnet wird.
Für Farbtemperaturen von 2000K - 7000K soll nun in Schritten von 100K ein Gewichtungsvektor für jede Farbtemperatur berechnet werden, der einen CRI von > 90 erzeugt.
Hier ein Pseudocode, um mein Problem zu verdeutlichen:
Code:
for Farbtemperatur = 2000 : 100: 7000
calc_optimum_vector(Farbtemperatur) end
du kannst a-f zu einem Vektor x zusammenfassen, dessen Komponenten variiert werden.
Grüße,
Harald
Ich habe jetzt eine stochastische Optimierung implementiert.
Ich generiere für jedes Element des Vektors eine Zufallszahl von 0 bis 1000.
Dann überprüfe ich, ob die Bedingung für den CRI erfüllt wurde.
Das wird über einige Iterationen durchgeführt, es wird eigentlich immer ein optimaler Vektor gefunden.
for k = 1 : 2000
a = floor(unifrnd(1,1000,1,1)); % calc random number between 0 and 1000
b = floor(unifrnd(1,1000,1,1));
c = floor(unifrnd(1,1000,1,1));
d = floor(unifrnd(1,1000,1,1));
e = floor(unifrnd(1,1000,1,1));
f = floor(unifrnd(1,1000,1,1));
opt_vector =[a;b;c;d;e;f];
CRI = calc_CRI(CCT,opt_vector);
if CRI > 90
%CRI_best = CRI;
disp('vector found!') disp(strcat('CRI is:',num2str(CRI)))
opt_vec_found = opt_vector';
break;
else
opt_vec_found = NaN(1,6);
end end end
du sagtest ja, dass du einen optimalen Gewichtsvektor erzeugen möchtest.
Wenn du beispielsweise den Vektor mit dem höchstmöglichen CRI finden möchtest, dann könntest du das als Optimierungsproblem auffassen und mit
fmincon
lösen.
Da kannst du auch eventuelle Beschränkungen für a-f einbauen.
du sagtest ja, dass du einen optimalen Gewichtsvektor erzeugen möchtest.
Wenn du beispielsweise den Vektor mit dem höchstmöglichen CRI finden möchtest, dann könntest du das als Optimierungsproblem auffassen und mit
fmincon
lösen.
Da kannst du auch eventuelle Beschränkungen für a-f einbauen.
Grüße,
Harald
Müsste ich dafür nicht eine entsprechende zu minimierende Funktion aufstellen?
Hier wird von mir ein Gütemaß (CRI) in vielen Teilschritten berechnet. Die genaue Funktion ist mir nicht bekannt, ich erhalte nur die Lösung wenn ich den Vektor der Berechnung für den CRI übergebe.
ich sehe darin nichts, was gegen eine Verwendung von fmincon spricht.
calc_CRI, genauer gesagt
@(x) -calc_CRI(CCT, x)
ist schon die zu minimierende Funktion.
ich sehe darin nichts, was gegen eine Verwendung von fmincon spricht.
calc_CRI, genauer gesagt
@(x) -calc_CRI(CCT, x)
ist schon die zu minimierende Funktion.
Grüße,
Harald
Hallo nochmal.
Ich habe versucht das Optimierungsproblem jetzt einmal zu formulieren, aber irgendwas haut noch nicht hin.
wenn du einen CRI zwischen 90 und 100 haben möchtest, dann ist das kein Minimierungsproblem mehr.
Ist dir denn egal, ob das 90.0001 oder 99.9999 ist? Sollte es vielleicht am liebsten genau in der Mitte sein? Je klarer die Problemstellung, desto besser kann man helfen.
lb und ub beziehen sich auf die Schranken für x, wären also 1 bzw. 1000.
wenn du einen CRI zwischen 90 und 100 haben möchtest, dann ist das kein Minimierungsproblem mehr.
Ist dir denn egal, ob das 90.0001 oder 99.9999 ist? Sollte es vielleicht am liebsten genau in der Mitte sein? Je klarer die Problemstellung, desto besser kann man helfen.
lb und ub beziehen sich auf die Schranken für x, wären also 1 bzw. 1000.
Grüße,
Harald
Sorry, ist mir auch gerade aufgefallen. Habe jetzt lb und ub richtig gesetzt.
A und b sind leere Vektoren.
Der CRI sollte auf jeden Fall über 90 sein, also CRI >= 90. Mehr ist besser, aber mehr als 100 geht nicht.
Gibt es eine ähnliche Funktion für Maximierungsprobleme?
Bzw einfach -f(x) minimieren?
wenn du einen CRI zwischen 90 und 100 haben möchtest, dann ist das kein Minimierungsproblem mehr.
Ist dir denn egal, ob das 90.0001 oder 99.9999 ist? Sollte es vielleicht am liebsten genau in der Mitte sein? Je klarer die Problemstellung, desto besser kann man helfen.
lb und ub beziehen sich auf die Schranken für x, wären also 1 bzw. 1000.
Grüße,
Harald
Sorry, ist mir auch gerade aufgefallen. Habe jetzt lb und ub richtig gesetzt.
A und b sind leere Vektoren.
Der CRI sollte auf jeden Fall über 90 sein, also CRI >= 90. Mehr ist besser, aber mehr als 100 geht nicht.
Gibt es eine ähnliche Funktion für Maximierungsprobleme?
Bzw einfach -f(x) minimieren?
Ich habe die Funktion fgoalattain gefunden, löst diese vielleicht mein Problem?
wenn die Funktion nie mehr als 100 ausgibt, dann ist das in Ordnung.
fmincon würde einfach versuchen, so nah wie möglich an die 100 heranzukommen - also das Maximum suchen.
Und ja, maximieren durch minimieren des Negativen. Das Minus in meinem Beitrag von 13:55 hatte schon seinen Sinn :)
fgoalattain käme dann in Frage, wenn du einen Gewichtsvektor haben möchtest, der für alle CCT funktioniert. Dem ist ja aber nicht so, oder?
wenn die Funktion nie mehr als 100 ausgibt, dann ist das in Ordnung.
fmincon würde einfach versuchen, so nah wie möglich an die 100 heranzukommen - also das Maximum suchen.
Und ja, maximieren durch minimieren des Negativen. Das Minus in meinem Beitrag von 13:55 hatte schon seinen Sinn
fgoalattain käme dann in Frage, wenn du einen Gewichtsvektor haben möchtest, der für alle CCT funktioniert. Dem ist ja aber nicht so, oder?
Grüße,
Harald
Stimmt, fgoalattain macht keinen Sinn.
Mit fmincon gibt mir die Simulation nur [1,1,1,1,1,1] als Vektor aus.
Es wird also quasi nichts verändert.
Siehst du den Fehler in meinem Code?
Ich denke eigentlich müsste es so gehen, was es leider nicht tut.
Local minimum found that satisfies the constraints.
Optimization completed because the objective functionis non-decreasing in
feasible directions, to within the default value of the function tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.
<stopping criteria details>
Active inequalities (to within options.TolCon = 1e-06):
lowerupper ineqlin ineqnonlin
1 2 3 4 5 6
Wie sehen die Ergebnisse bei anderen Startwerten aus?
Da Funktionen aufgerufen werden, die mir nicht zur Verfügung stehen, kann ich ansonsten wenig dazu sagen.
Ich würde die Zielfunktion als lokale Funktion statt als geschachtelte Funktion schreiben, da sonst immer die Gefahr besteht, dass man unbeabsichtigt etwas überschreibt.
Zudem würde ich globale Variablen vermeiden. Das kann zu sehr unschönen Effekten führen. Stattdessen sollte data an die Funktionen übergeben werden, die es benötigen. Falls eine Funktion es ändert, sollte es auch wieder zurückgegeben werden.
Die Zielfunktionsauswertungen sollten unabhängig von der Historie sein. Insofern kann eine globale Änderung eigentlich auch nicht wünschenswert sein.
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.