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
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 28.07.2016, 09:43     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
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


Was meinst du mit lokal anstatt geschachtelt?
Soll ich die Funktion calc_CRI auslagern?

Die globale Variable data speichert im Prinzip nur Initialisierungswerte, die sich nicht ändern.

Grüße,
Max

PS: mir ist gerade aufgefallen, was du ungefähr meinst.
Die Übergabe des data-structs an calc_CRI ist nicht korrekt, das struct wird als "unassigned" bezeichnet.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.07.2016, 16:14     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Was meinst du mit lokal anstatt geschachtelt?

http://www.mathworks.com/help/matla.....of-functions.html#btg5k9l

Zitat:
Die globale Variable data speichert im Prinzip nur Initialisierungswerte, die sich nicht ändern.

In deiner Zielfunktion nimmst du aber Änderungen vor.

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: 03.08.2016, 09:00     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

Zitat:
Was meinst du mit lokal anstatt geschachtelt?

http://www.mathworks.com/help/matla.....of-functions.html#btg5k9l

Zitat:
Die globale Variable data speichert im Prinzip nur Initialisierungswerte, die sich nicht ändern.

In deiner Zielfunktion nimmst du aber Änderungen vor.

Grüße,
Harald


Moin,

ich hatte mich nochmal an meine Optmierung gesetzt.
Ich habe die Funktion jetzt so umgeschrieben, dass keine globalen Variablen mehr verwendet werden und die Funktionen lokal definiert. Allerdings bekomme ich nach wie vor noch den Anfangsvektor als Lösung. Keiner der Parameter wird gesweept.
Ich komme irgendwie nicht hinter das Prinzip von fmincon-.

Grüße,
Max

Code:

function [optimal_vector,fval] = optimize_tool(CCT)

% Does not work at this moment. Max, 28.07.2016
% Should find the optimal vector for pwm weight.

global data;
init_data;

% load_led_preset('Spotlight_L2_W3__fine_cali_settle_Temp40C0_2016_06_30')
%
% whitefactor = 3;
% data.LEDs.spectra(:,6) = data.LEDs.spectra(:,6) ./ max(data.LEDs.spectra(:,6)) .* data.white_max .* whitefactor;




% x0 = [1,1,1,1,1,1];
x0 = [60,5,50,60,1,160];
data.optvector.weights = x0;

% 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];

temp_data = data;

optimFunction = @(opt_vector) -calc_CRI8(CCT, opt_vector,temp_data);
[optimal_vector,fval] = fmincon(optimFunction,x0,A,b,Aeq,beq,lb,ub);
data = temp_data;
end


function CRI8 = calc_CRI8(CCT,opt_vector,temp_data) % calculates the CRI for a given CCT and vector

temp_data.optvector.weights = opt_vector';
brightness = 255;
[temp_data,coords.x,coords.y] = calc_CT2coords_fmincon(CCT,'deg2',temp_data);
[temp_data,factors, factors_compensated, ~] = calc_factors_fmincon(coords,'deg2',temp_data);
[temp_data,pwm_values] = calc_PWM_values_fmincon(brightness, factors, factors_compensated,temp_data);

[temp_data,CCT,sum_spectrum] = redraw_color_sum_fmincon(pwm_values,temp_data);
[~,CRI8,~,~]=calc_CRI_fmincon(CCT, sum_spectrum,temp_data);
% [~, ~, ~, spectral_comps] = calc_update_spectra (pwm_values, brightness);
% CRI8 = spectral_comps.CRI_8;
disp(strcat('CRI8: ',num2str(CRI8)))
disp(strcat('Opt_Vec: ',num2str(opt_vector)))
end
 
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: 03.08.2016, 09:40     Titel:
  Antworten mit Zitat      
Habe jetzt mal fminsearch ausprobiert.

Komischerweise geht es jetzt damit, bis auf den Umstand, dass manchmal negative Werte im Vektor gesetzt werden, was nicht erwünscht ist:

Code:

 optimal_vector = fminsearch(optimFunction,x0);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

du definierst data aber immer noch als globale Variable.
Mangels verfügbarer Funktionen kann ich dir ansonsten leider nicht helfen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 03.08.2016, 19:29     Titel:
  Antworten mit Zitat      
Max24 hat Folgendes geschrieben:
Habe jetzt mal fminsearch ausprobiert.

Komischerweise geht es jetzt damit, bis auf den Umstand, dass manchmal negative Werte im Vektor gesetzt werden, was nicht erwünscht ist:

Code:

 optimal_vector = fminsearch(optimFunction,x0);
 


Versuchs mal mit fminsearchbnd https://www.mathworks.com/matlabcen.....nsearchbnd--fminsearchcon
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.