% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
%                                                                         %
% s = checkvar(vars,Defaults,index,optvars)                               %
%                                                                         %
% Die Funktion erlaubt beliebige Auswahl von Optimierungsparametern       %
% (index) aus einem vorher gewählten Satz (vars).                         %
%                                                                         %
% INPUT                                                                   %
%  vars       Variablennamen (cell)                                       %
%  Defaults   Startparameter (werden für nichtoptimierte Variablen        %
%             übernommen) (Vektor)                                        %
%  index      Indizes der Optimierungsvariablen im Vektor aller Parameter %
%             (Vektor)                                                    %
%  optvar     Werte der Optimierungsvariablen (Vektor)                    %
%                                                                         %
% OUTPUT                                                                  %
%  s          Parameter und ihre Werte (struct)                           %
%                                                                         %
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %

function test

close all
clear variables
clc

% Startwerte
vars = {'A','b','c','D1','D2'};
Defaults = [0.8652;-0.9942;1.0219;0.9189;-0.6852];

% Auswahl der Optimierungsvariablen
index = [1 4 5];
optvars0 = Defaults(index)';

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
%  OPTIMIERUNG mit fminunc
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %

s_start = checkvar(vars,Defaults,index,optvars0)

var_opt = fminsearch(@objective,optvars0);

s_opt = checkvar(vars,Defaults,index,var_opt)


% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
%  Zielfunktion
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
    function fun = objective(optvars)

        % Aktuelles Design erzeugen
        params = checkvar(vars,Defaults,index,optvars);

        fun = params.c - cos(params.A * params.b) + params.D1^2 + params.D2^2;

    end % end objective

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
%  Auswahlfunktion
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
    function s = checkvar(vars,Defaults,index,optvars)

        % Alle Parameter werden auf den Default-Wert (=Startwert) gesetzt
        for i=1:length(Defaults)
            s.(char(vars(i))) = Defaults(i);
        end

        % Die Optimierungsparameter werden auf den aktuellen Wert gesetzt
        j=1;
        for i=index
            s.(char(vars(i))) = optvars(j);
            j=j+1;
        end

    end % end checkvar

end % end test


