function [xmais,Pmais,Kmais,exitflag,ymais,incremento_estados] = cekf(xest,yplanta,Pk,par,Q,R,dt,A,C,xmin,xmax,ymin,ymax)

%através do fornecimento das matrizes 
%carregamento das matrizes do sistema e calculo da matriz exponencial
med = length(yplanta);  %número de medições na planta
nest = length(xest);    % número de estados do modelo
MAe = A;
MCe = C;

phi = expm(MAe*dt);

%calculo da matriz de covariância
Pmenos = phi*Pk*phi' - (phi*Pk*MCe')*inv(MCe*Pk*MCe' + R)*(MCe*Pk*phi') + Q; %calculo discreto

%Ganho de Kalman
Kmais = (Pmenos*MCe')/(MCe*Pmenos*MCe' + R);
Pmais = Pmenos - Kmais*MCe*Pmenos;

%matriz Sk
Sk = [inv(Pmais) zeros(nest,med); zeros(med,nest) inv(R)];
Sk = (Sk + Sk')/2;

%vetor d
%dk = zeros(1,2*length(MAe));
dk = zeros(1,med+nest);

%restrições de igualdade
Aeq = [MCe eye(med)];
Beq = yplanta - (C*xest')';

%Restrições dos estimados e das saídas estimadas
% xmin = eps*ones(1,length(xest));
% xmax = ones(1,length(xest));
% ymin = eps*ones(1,length(xest));
% ymax = ones(1,length(xest));

%restrições de desigualdade (inclusão das restrições)
A = [-eye(med+nest); eye(med+nest)];
%B = [xest - xmin;ymax - xplanta;xmax-xest;xplanta - ymin]';
B = [(xest - xmin) (ymax - yplanta) (xmax-xest) (yplanta - ymin)]';
%opções da otimização
%options = optimset('Algorithm','interior-point-convex');
%options = optimset('LargeScale','on','Algorithm','interior-point-convex', 'Display','off', 'MaxIter',200, ...
%               'TolFun',1e-14, 'TolX',1e-14, 'TolCon',1e-14);
options = optimset('LargeScale','off', 'Algorithm','active-set','Display','off', 'MaxIter',200, ...
              'TolFun',1e-14, 'TolX',1e-14, 'TolCon',1e-14);
%resolução do problema quadrático
x0_quadprog = zeros(1,med+nest);

[incremento_estados,fval,exitflag,output]  = quadprog(Sk, dk, A, B, Aeq, Beq,[],[],x0_quadprog,options);

%caso o problema não seja viável o estado não é corrigido e um aviso é
%enviado ao usuário
if exitflag > 0
xmais = xest' + incremento_estados(1:length(xmin)); % xest(k|k) = xest(k|k-1) + w(k-1|k)
ymais = C*xmais + incremento_estados(length(xmin)+1:end); % yk = h(xest(k|k)) + v(k-1|k)
else
    xmais = xest';
    ymais = C*xmais;
end


