function finv = trianginv(x,a,b,c)
% function finv = trianginv(x,a,b,c)
% Dado un numero (vector) aleatorio x entre 0 y 1, computar el 
% correspondiente cuantil (inversa de la funcion de distribucion) de
% una distribucion triangular caracterizada por los parametros:
% [a,b]: extremos del intervalo donde hay probabilidad positiva
% c: (donde a <= c <= b) indica la localización del vertice del 
% triangulo que forma la funcion de densidad
% x: escalar o vector que indica una muestra aleatoria uniforme en [0,1]
% finv: muestra aleatoria de la distribucion triangular
% Ricard Torres (rtorres@itam.mx)

if ( nargin ~= 4 )
   mostrar_uso();
   error('La funcion requiere cuatro argumentos');
end

if ~ and( isvector(x), and( isscalar(a), and( isscalar(b), ...
         isscalar(c) )))
   mostrar_uso();
   error('Los argumentos deben ser numericos');
end

if ( ( a > c ) || ( c > b ) || ( a >= b ) )
   mostrar_uso();
   error('Se debe cumplir: a <= c <= b, a < b');
end

if ~ all( x >= 0 )
   mostrar_uso() ;
   error('Los numeros aleatorios deben ser no negativos') ;
end

if ~ all( x <= 1 )
   mostrar_uso() ;
   error('Los numeros aleatorios no pueden exceder 1') ;
end

finv = []; % definir finv como un vector sin ningun elemento

for t = x
    if ( t < (c-a)/(b-a) )
       finv(end+1) = a + sqrt( (b-a) * (c-a) * t );
    else
       finv(end+1) = b - sqrt( (b-a) * (b-c) * (1-t) );
    end
end

end

% Mensaje de ayuda en caso de error
function mostrar_uso()
fprintf('Uso: function finv = trianginv(x,a,b,c)\n');
fprintf('Dado un numero (vector) aleatorio x entre 0 y 1, computar el\n');
fprintf('correspondiente cuantil (inversa de la funcion de distribucion) de\n');
fprintf('una distribucion triangular caracterizada por los parametros:\n');
fprintf('[a,b]: extremos del intervalo donde hay probabilidad positiva\n');
fprintf('c: (donde a <= c <= b) indica la localización del vertice del \n');
fprintf('triangulo que forma la funcion de densidad\n');
fprintf('x: escalar o vector que indica una muestra aleatoria uniforme en [0,1]\n');
fprintf('finv: muestra aleatoria de la distribucion triangular\n');
end


