% aproximación de la respuesta escalón como la suma de la respuesta ante
% impulsos desplazados (integral de convolución)

% sistema
T = 0.5;                                                    % cte de tiempo
k = 1;                                                  % ganancia estática
num=[k];                                    % numerador func. transferencia
den=[T 1];                                % denominador func. transferencia

t_end=10;                                         % tiempo final simulación
t_points=1000;                                % número de puntos simulación
t=linspace(0,t_end,t_points+1);
t=t(1:t_points);

% impulse points
points=100;                           % número de puntos de la aproximación
points_per_impulse=t_points/points;

t_impulse=linspace(0,t_end,points+1);
t_impulse=t_impulse(1:points-1);


ff=figure(1);
set(ff,'Color',[1 1 1]);
hold off;
handl_input=plot(t,ones(1,length(t)),'m','LineWidth',2);hold on;grid on;
axis([0 t_end 0 2.5]);
set(gcf,'Position',[283 307 1073 363]);
step_response=0;
sp=plot(-1,step_response);
xlabel('tiempo (s)');
ylabel('magnitud');
title(strcat('respuesta escalón unitario. Puntos aproximación: ',num2str(points)));
for cc=1:length(t_impulse)
    h=k/T*exp(-1/T*(t-t_impulse(cc)));
    impulse_point=points_per_impulse*(cc-1)+1;
    handl_impulse=plot(t(impulse_point),1,'ro','MarkerFaceColor',[1 1 1]);
    %hh=line([t(impulse_point), t(impulse_point)],[0, 1]);
    %set(hh,'Color','r','LineStyle','--','LineWidth',1);
    step_response=step_response+[zeros(1,impulse_point-1) h(impulse_point:end)];
    handl_resp_impulse=plot(t(impulse_point:end),h(impulse_point:end),'b--');
    step_at_point=impulse_point+points_per_impulse;
    set(sp,'XData',t(1:step_at_point),'YData',...
        step_response(1:step_at_point)/(points/t_end),...
        'Color','g','LineWidth',2);
    pause(0.5);
    drawnow;
end

y = step(num,den,t);
handl_step=plot(t,y,'k');

legend([handl_input handl_step sp handl_impulse handl_resp_impulse],...
    'entrada', 'resp. escalón', 'resp. aprox. escalón', 'impulso', ...
    'resp. impulso','Location','BestOutside');

