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

Optimierungsproblem mit mehreren Ausgangsgrößen

 

Max24
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 27.07.2016, 10:25     Titel: Optimierungsproblem mit mehreren Ausgangsgrößen
  Antworten mit Zitat      
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

function [a,b,c,d,e,f] = calc_optimum_vector(Farbtemperatur)

while(CRI<90)
variiere a,b,c,d,e,f;
CRI = calc_CRI(a,b,c,d,e,f);
end
end
 


Hat jemand eine Idee, wie man dies am geschicktesten bewerkstelligt?
Es handelt sich hier ja um ein mehrdimensionales Problem.

Viele Grüße,
Max
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: 27.07.2016, 10:34     Titel:
  Antworten mit Zitat      
Hallo,

du kannst a-f zu einem Vektor x zusammenfassen, dessen Komponenten variiert werden.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 27.07.2016, 11:37     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

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.


Code:

 function opt_vec_found = find_opt_vec(CCT)
       
        a=1;b=1;c=1;d=1;e=1;f=1;
        opt_vector =[a;b;c;d;e;f];
       
        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
 


Kann man diese Lösung als geschickt bezeichnen, oder geht das besser?
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: 27.07.2016, 12:02     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Max24
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 27.07.2016, 12:23     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

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.
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: 27.07.2016, 13:55     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Max24
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 27.07.2016, 15:58     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

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.

Ist die Formulierung der A und b Matrix ok?

Folgende Bedingungen sollen gelten.

x1 <= 1000
x2 <= 1000
x3 <= 1000
x4 <= 1000
x5 <= 1000
x6 <= 1000

x1 >= 1
x2 >= 1
x3 >= 1
x4 >= 1
x5 >= 1
x6 >= 1

Außerde soll für den CRI gelten:

90 <= CRI <= 100

Ich habe das mit lower und upper bound gemacht, weiß nicht, ob das so richtig ist.



Code:

CCT = 5000;

optimFunction = @(opt_vector) calc_CRI(CCT,opt_vector);
x0 = [1,1,1,1,1,1];

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

b = [1000;-1;1000;-1;1000;-1;1000;-1;1000;-1;1000;-1];
Aeq = [];
beq = [];
lb = [90,90,90,90,90,90];
ub = [100,100,100,100,100,100];




[x,fval] = fmincon(optimFunction,x0,A,b,Aeq,beq,lb,ub);


    function CRI8 = calc_CRI(CCT,opt_vector)
   ...
   ...
   ...
   end
 


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

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Max24
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 27.07.2016, 16:24     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Max24
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 27.07.2016, 16:58     Titel:
  Antworten mit Zitat      
Max24 hat Folgendes geschrieben:
Harald hat Folgendes geschrieben:
Hallo,

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?
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: 27.07.2016, 17:06     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Max24
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 27.07.2016, 17:19     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

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 Smile

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.
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: 27.07.2016, 20:23     Titel:
  Antworten mit Zitat      
Hallo,

poste doch bitte den aktuellen Code.

Zudem gibt fmincon eine Statusmeldung aus. Wie lautet diese?
Wie sehen die Ergebnisse bei anderen Startwerten aus?

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 28.07.2016, 09:52     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

poste doch bitte den aktuellen Code.

Zudem gibt fmincon eine Statusmeldung aus. Wie lautet diese?
Wie sehen die Ergebnisse bei anderen Startwerten aus?

Grüße,
Harald


Code:

function [optimal_vector,fval] = optimize_tool()

global data;
init_data;

CCT = 5000;

% optimFunction = @(opt_vector) calc_CRI(CCT,opt_vector);
optimFunction = @(opt_vector)   -calc_CRI(CCT, opt_vector);
x0 = [1,1,1,1,1,1];

% A = [1,0,0,0,0,0; -1,0,0,0,0,0;
%     0,1,0,0,0,0; 0,-1,0,0,0,0;
%     0,0,1,0,0,0; 0,0,-1,0,0,0;
%     0,0,0,1,0,0; 0,0,0,-1,0,0;
%     0,0,0,0,1,0; 0,0,0,0,-1,0;
%     0,0,0,0,0,1; 0,0,0,0,0,-1];
%
% b = [1000;-1;1000;-1;1000;-1;1000;-1;1000;-1;1000;-1];
A=[];
b=[];
Aeq = [];
beq = [];

lb = ones(size(x0));
ub = [1000,1000,1000,1000,1000,1000];

[optimal_vector,fval] = fmincon(optimFunction,x0,A,b,Aeq,beq,lb,ub);


    function CRI8 = calc_CRI(CCT,opt_vector) % calculates the CRI for a given CCT and vector
        brightness = 255;
        colorspace = 'deg2';
        [x,y] = calc_CT2coords(CCT,colorspace);
        coords.x = x;
        coords.y = y;
        data.optvector.weights = opt_vector';
        [factors, factors_compensated, opt_complete] = calc_factors(coords, colorspace);
        [pwm_values] = calc_PWM_values(brightness, factors, factors_compensated);
       
        [sum_spectrum, coords, deviations, spectral_comps] = calc_update_spectra (pwm_values, brightness);
        CRI8 = spectral_comps.CRI_8;
    end
end
 


Output ist:

Code:

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is 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):
  lower      upper     ineqlin   ineqnonlin
    1                                
    2                                
    3                                
    4                                
    5                                
    6                                

opt_vector =

     1     1     1     1     1     1


fval =

  -27.9783

 
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: 28.07.2016, 10:16     Titel:
  Antworten mit Zitat      
Hallo,

nochmal:
Zitat:
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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.