%DEMO_TRANSFORM_VA  Fichero de Demostración de Transformaciones de v.a.
% Y = g(X)
% El alumno puede modificar en el código el tipo de variable aleatoria X
% (en la sección que se inicia en la línea 25) y la función de
% trasformación y=g(x) (a partir de línea 140)

%   Copyright (c) 2023 G.T.A.S. (Grupo Tratamiento Avanzado de Señal)
%                 DICOM Universidad de Cantabria
%	Fecha   : Octubre 2023.
%	Version : 1.1

%===========================================================================
% Notas:
% ----------------------
%	o	
%===========================================================================

%===========================================================================
% Historia de Modificaciones:
% ----------------------
%	o	Creada y Comprobada bajo MATLAB r2021a 24/10/2023
%==========================================================================


%% Generación de la v.a. X      ¡¡¡MODIFICAR AQUÍ!!!
N = 5000;           % Número de relizaciones a generar 
x = 4*rand(1,N)-2;  % N Realizaciones de la v.a. X uniforme en [-2,2]
% x = rand(1,N);      % N Realizaciones de la v.a. X uniforme en [0,0]
% x = randn(1,N);     % N Realizaciones de la v.a. X Gaussiana de media 0 y varianza 1
% x = exprnd(1/2,1,N);  % N Realizaciones de v.a. X exponencial de parámetro c=2

n_intervalos=20;    % Número de intervalos de los histogramas

%% Generación de la v.a. Y=g(X)
y = g(x);   % Modifique la función de matlab g que se encuentra al final del Script con la expresión que desee


%% Cálculos para una correcta representación de las gráficas

[xmin,xmax] = round_min_max(min(x),max(x));
Deltax=(xmax-xmin)/(n_intervalos);
ejex0=xmin-Deltax:(Deltax/10):xmax+Deltax;
[ymin,ymax] = round_min_max(min(y),max(y));
Deltay=(ymax-ymin)/(n_intervalos);
clasesx=xmin:Deltax:xmax;
clasesy=ymin:Deltay:ymax;
centrosx=clasesx(1:n_intervalos)+Deltax/2;
centrosy=clasesy(1:n_intervalos)+Deltay/2;

[Ny,~] = histcounts(y,clasesy);
y_grafica = g(ejex0);

%% Presentación de resultados
subplot(222);plot(ejex0,y_grafica);axis([xmin xmax ymin ymax]);grid;xlabel('x');ylabel('y');title('Función y=g(x)');
subplot(224);histogram(x,clasesx,'Normalization','count');grid;xlabel('x');ylabel('Nº realizaciones');title('Histograma de X');
axis('manual'); % Congela los ejes para la animación
a4=gca;
a4.XLim = [xmin xmax];
subplot(223);histogram(y,clasesy,'Normalization','count');grid;xlabel('y');ylabel('Nº realizaciones');title('Histograma de Y');
axis('manual'); % Congela los ejes para la animación
a3=gca;
subplot(221);b1=barh(centrosy,-Ny,1,'FaceColor','#0072BD');grid;ylabel('y');xlabel('Nº realizaciones');title('Histograma de Y');
set(gca,'XTickLabel',[]);   % Elimina los ticks del eje horizontal
axis('manual'); % Congela los ejes para la animación
a1=gca;
a1.YLim = [ymin ymax];

%% Animación de gráficas

disp('Pulse una tecla para iniciar la animación');
pause

a4.YLim = a4.YLim/40;
a3.YLim = a3.YLim/40;
a1.XLim = a1.XLim/40;
line4=[];

n = 1;
while n<=N
    [Nx,~] = histcounts(x(1:1*n),clasesx);
    [Ny,~] = histcounts(y(1:1*n),clasesy);
    if not(isempty(line4))
        delete(line4);delete(line21);delete(line22)
    end
    a4.Children.BinCounts=Nx;
    b1.YData = -Ny;
    a3.Children.BinCounts=Ny;
   
    if n<20
        subplot(222);line21=line([x(n) x(n)],[ymin,y(n)],'Color','red','LineStyle','--','Marker','o');
        line22=line([xmin x(n)],[y(n),y(n)],'Color','red','LineStyle','--','Marker','<');
        subplot(224);line4 = line([x(n) x(n)],a4.YLim,'Color','red','LineStyle','--');
        drawnow;
        if n<5
            disp('Pulse una tecla')
            pause;
        else
            pause(1)
        end
    else
        if max(Nx)>=a4.YLim(2) || max(Ny)>= a3.YLim(2)
            a4.YLim = a4.YLim*2;
            a3.YLim = a3.YLim*2;
            a1.XLim = a1.XLim*2;
        end

        drawnow;
        % pause(0.1)
    end
    if n<100
        n = n+1;
    else
        n=n+20;
    end
end

return

%%
function [minimo,maximo] = round_min_max (x_min,x_max)
    exponente = floor(log10(x_max-x_min));
    mantisa = (x_max-x_min)*10^-exponente;
    if mantisa <= 2
        paso = 0.5*10^exponente;
    elseif mantisa <=5
        paso = 1*10^exponente;
    else
        paso = 2*10^exponente;
    end
    minimo = floor(x_min/paso)*paso;
    maximo = ceil(x_max/paso)*paso;
end







%% Función de transformación y=g(x)   ¡¡¡MODIFICAR AQUÍ!!!

function y = g(x)
% Función de transformación y=g(x)
% Modifique la expresión para adaptarla a la transformación que desee

%     y = -2*x+5;
    y = x.^2;
%     y = exp(x);
     
end
