% Startskript zur Berechnung der optimalen Elemente der Wichtungsmatrizen Q
% und R mittels patternsearch (Suche nach einem globalen Minimum).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Betriebspunkt-Gitter  (c-, i-, n-Schleifen) resultiert aus den
% Randbedingungen des ITV-Prüfstandes.
% CA50_Matrix = [9;8;6;4;2;0;-2;-4;-6;-8];  % °KWnZOT
% IMEP_Matrix = [2:0.5:5];                  % bar
% NOx_Matrix  = [200;150;100;80;50];        % ppm

CA50_Matrix = [9;8;6;4];%;2;0;-2;-4;-6;-8]; % °KWnZOT
IMEP_Matrix = [2;3];%:0.5:5];                 % bar
NOx_Matrix  = [200;150];%;100;80;50];        % ppm

length_CA50_Ma=length(CA50_Matrix);
length_IMEP_Ma=length(IMEP_Matrix);
length_NOx_Ma=length(NOx_Matrix);

% Stellgrößen des Betriebspunktes vor dem Sprung (T_Sprung):
SOIstart = 20;
FMIstart = 15;
AGRstart = 30;

% Definition Namen für das Datenfile mit Ergebnissen
nameCol = {'ID','SOI(1)','FMI(1)','AGR(1)','sollCA50','sollIMEP','sollNOX','R(SOI)','R(FMI)','R(AGR)','Q(CA50)','Q(IMEP)','Q(NOX)','f(optim)'};

% Name der MAT-Datei zur Abspeicherung der Optimierungsergebnisse
nameMAT = 'Ergebnisse_Optimierung_Patternsearch';

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Waitbar einbauen!
messageA  = 'Anzahl optimierter Betriebspunkte ...  : ';
endA     = length_CA50_Ma*length_IMEP_Ma*length_NOx_Ma;
hA       = waitbar(0,[messageA num2str(1) ' von ' num2str(endA) ]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

dataOpt = [];
for c=1:length_CA50_Ma
   
    CA50=CA50_Matrix(c)
    
    for i=1:length_IMEP_Ma
        
        IMEP=IMEP_Matrix(i)
        
        for n=1:length_NOx_Ma
            
            NOx=NOx_Matrix(n)
            
            CurrentLoop=n+(i-1)*length_NOx_Ma+(c-1)*length_IMEP_Ma*length_NOx_Ma; % Aktueller Betriebspunkt.
            
            % waitbar Zwischenschritt!
            waitbar(CurrentLoop/endA,hA,[messageA num2str(CurrentLoop) ' von ' num2str(endA) ]);
            
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            %% Start: Optimierung:
            % Optimierungsfunktion: patternsearch:
            
            % patternsearch: nicht gradientenbasiert, Suche nach globalen Optimum -->
            % dadurch höhere Unabhängigkeit von den Startwerten,...
            
            lb=[0;0;0;0;0;0];         % Untere Grenze: Entspricht den Nicht-Negativ-Nebenbedingungen der Elemente der Wichtungsmatrizen
            ub=[40;40;40;40;40;40];   % Obere Grenze:
            optopt= optimset('Display','iter','MaxIter',20,'TolCon',0); % TolCon=0 damit H>=0 sichergestellt wird!
            [x, fval, exitflag]=patternsearch(@Opt_SimAufruf,[0.1;0.1;0.5;1;3;1],[],[],[],[],lb,ub,[],optopt);
            
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            %% Bildung Matrizen zur Speicherung der optimalen Wichtungsmatrizen, der minimalen Regelguete und des Betriebspunktes:
            
            % INDO: dataOpt = ['ID','SOI(1)','FMI(1)','AGR(1)','sollCA50','sollIMEP','sollNOX','R(SOI)','R(FMI)','R(AGR)','Q(CA50)','Q(IMEP)','Q(NOX)','f(optim)']
            dataOpt = [dataOpt; CurrentLoop SOIstart FMIstart AGRstart CA50 IMEP NOx x' fval];
            x  % Optimale Elemente (R1, R2, R3, Q1, Q2 und Q3) für die Wichtungsmatrizen!
                        
%             Betriebspunkt(n,i+(c-1)*length_IMEP_Ma)={[CA50,IMEP,NOx]};
%             x
%             X={[x]};
%             Optimum_W(n,i+(c-1)*length_IMEP_Ma)=X;    % Optimale Elemente (R1, R2, R3, Q1, Q2 und Q3) für die Wichtungsmatrizen!
%             Fval={[fval]}
%             Optimum_R(n,i+(c-1)*length_IMEP_Ma)=Fval; % Optimale (minimale) Regelguete.
            
        end
        
    end

end
    
% close waitbar
close(hA); 

%% Speicherung Daten:
% Datum und Uhrzeit auslesen
tmpTime = clock;
strDate = [num2str(date) '_' num2str(tmpTime(4)) 'h' num2str(tmpTime(5))];
% Speicherung als mat-Dateien:
eval(['save ' strDate '_' nameMAT '.mat nameCol dataOpt']) 

%  save Optimale_Wichtungen_Gitter Optimum_W % Zum Laden: load Optimale_Wichtungen_Gitter
%  save Betriebspunkt_Gitter Betriebspunkt
%  save Res_min_Regelguete_Gitter Optimum_R
% 
% % Speicherung als txt-Dateien:
% 
%  filenameW=['C:\Users\Niko\Desktop\zzTempDA\optimale_Wichtung_mit_MatlabFunktionen\Optimale_Wichtungen_Gitter.txt'];
%  dlmwrite(filenameW, Optimum_W, 'delimiter','\t', 'newline', 'pc', '-append');
%  filenameR=['C:\Users\Niko\Desktop\zzTempDA\optimale_Wichtung_mit_MatlabFunktionen\Res_min_Regelguete_Gitter.txt'];
%  dlmwrite(filenameR, Optimum_R, 'delimiter','\t', 'newline', 'pc', '-append');
%  filenameR=['C:\Users\Niko\Desktop\zzTempDA\optimale_Wichtung_mit_MatlabFunktionen\Betriebspunkt_Gitter.txt'];
%  dlmwrite(filenameR, Betriebspunkt, 'delimiter','\t', 'newline', 'pc', '-append');

     