lunes, 16 de septiembre de 2013

Conversión de Número a Letra (Formato de Precio en Letras)


La siguiente función "num2letras" permite convertir un número desde 1 hasta 999 999 a letras. La forma de llamarla es, por ejemplo:

>>L=num2letras(13243.25)

L =

TRECE MIL DOSCIENTOS CUARENTA Y TRES PESOS 25/100 M.N.


functionres=num2letras(cantidad)
% @Jorge De Los Santos
% Ejemplo:  C=num2letras(2143.45)
% C =
% DOS MIL CIENTO CUARENTA Y TRES PESOS 45/100 M.N.
if~isnumeric(cantidad)
    error('Inserte un valor numérico');
end
uni={'','UN','DOS','TRES','CUATRO','CINCO','SEIS','SIETE','OCHO','NUEVE'};
unisp={'DIEZ','ONCE','DOCE','TRECE','CATORCE','QUINCE','DIECISEIS','DIECISIETE','DIECIOCHO','DIECINUEVE'};
dec={'','DIEZ','VEINTE','TREINTA','CUARENTA','CINCUENTA','SESENTA','SETENTA','OCHENTA','NOVENTA'};
decsp={'VEINTE','VEINTIUN','VEINTIDOS','VEINTITRES','VEINTICUATRO','VEINTICINCO','VEINTISÉIS','VEINTISIETE','VIENTIOCHO','VEINTINUEVE'};
cen={'','CIENTO','DOSCIENTOS','TRESCIENTOS','CUATROCIENTOS','QUINIENTOS','SEISCIENTOS','SETECIENTOS','OCHOCIENTOS','NOVECIENTOS'};
N=floor(cantidad);
S=num2str(N);
L=length(S);
if N<10
    res=getuni(num2str(N));
elseif N>9 & N<100
    if S(L-1)=='1';
        res=horzcat(getdec(num2str(N)),getuni(num2str(N)));
    elseif S(L-1)=='2'
        res=horzcat(getdec(num2str(N)));
    elseif S(L)=='0'
        res=horzcat(getdec(num2str(N)),' ',getuni(num2str(N)));
    else
        res=horzcat(getdec(num2str(N)),' Y ',getuni(num2str(N)));
    end
elseif N>99 & N<1000
    if S(L-1)=='1'
        res=horzcat(getcen(num2str(N)),' ',getdec(num2str(N)),' ',getuni(num2str(N)));
    elseif S(L-1)=='2'
        res=horzcat(getcen(num2str(N)),' ',getdec(num2str(N)));
    elseif S(L-1)=='0' | S(L)=='0'
        res=horzcat(getcen(num2str(N)),' ',getdec(num2str(N)),' ',getuni(num2str(N)));
    else
        res=horzcat(getcen(num2str(N)),' ',getdec(num2str(N)),' Y ',getuni(num2str(N)));
    end
elseif N>999 & N<1000000
     if S(L-1)=='1'
        res=horzcat(getmil(num2str(N)),' MIL ',getcen(num2str(N)),' ',getdec(num2str(N)));
     elseif S(L-1)=='2'
        res=horzcat(getmil(num2str(N)),' MIL ',getcen(num2str(N)),' ',getdec(num2str(N)));
     elseif S(L-1)=='0' | S(L)=='0'
         res=horzcat(getmil(num2str(N)),' MIL ',getcen(num2str(N)),' ',getdec(num2str(N)),' ',getuni(num2str(N)));
     else
        res=horzcat(getmil(num2str(N)),' MIL ',getcen(num2str(N)),' ',getdec(num2str(N)),' Y ',getuni(num2str(N)));
     end
end


    function u=getuni(num)
        ifstr2num(num)>9 & num(length(num)-1)=='1'
                u='';
        else
            uu=num(length(num));
            u=cell2mat(uni(str2num(uu)+1));
        end
    end
    function d=getdec(num)
        dd=num(length(num)-1);
        ddu=num(length(num));
        if dd=='1'
            d=cell2mat(unisp(str2num(ddu)+1));
        elseif dd=='2'
            d=cell2mat(decsp(str2num(ddu)+1));
        else
            d=cell2mat(dec(str2num(dd)+1));
        end
    end
    function c=getcen(num)
        ifstr2num(num)==100 || (num(length(num))=='0'&num(length(num)-1)=='0'&num(length(num)-2)=='1'),c='CIEN';
        else
        cc=num(length(num)-2);
        c=cell2mat(cen(str2num(cc)+1));
        end
    end
    function m=getmil(num)
        fori=1:length(num)-3
            B(i)=num(i);
        end
        l=length(B);
        A=str2num(B);
        if A<10
            m=getuni(num2str(A));
        elseif A>9 & A<100
            if B(l-1)=='1';
                m=horzcat(getdec(num2str(A)),getuni(num2str(A)));
            elseif B(l-1)=='2'
                m=horzcat(getdec(num2str(A)));
            elseif B(l)=='0'
                m=horzcat(getdec(num2str(A)),' ',getuni(num2str(A)));
            else
                m=horzcat(getdec(num2str(A)),' Y ',getuni(num2str(A)));
            end
        elseif A>99 & A<1000
            if B(l-1)=='1'
                m=horzcat(getcen(num2str(A)),' ',getdec(num2str(A)));
            elseif B(l-1)=='2'
                m=horzcat(getcen(num2str(A)),' ',getdec(num2str(A)));
            elseif B(l-1)=='0' | B(l)=='0'
                m=horzcat(getcen(num2str(A)),' ',getdec(num2str(A)),' ',getuni(num2str(A)));
            else
                m=horzcat(getcen(num2str(A)),' ',getdec(num2str(A)),' Y ',getuni(num2str(A)));
            end
        end
    end

%% Parte fraccionaria
c=cantidad-floor(cantidad);
c=num2str(roundn(c,-2));
for k=1:100
    s=strcat(num2str(k/100));
    cent=strcat(num2str(k),'/100 M.N.');
    if strcmp(c,s)==1,break,end;
end

res=horzcat(res,' PESOS ',cent); % Conversión final
end

Animación Péndulo Simple


La siguiente función permite simular el movimiento de un péndulo simple.

function anim_pendulo
% @Jorge De Los Santos
f=figure('NumberTitle','off','name','Péndulo simple','MenuBar','none','color',[1 1 1]);
g=9.81; %Constante de aceleración de la gravedad
L=1; % Longitud
%% Solver de la ED
[t,y]=ode45(@psimple,[0 4*pi*sqrt(L/g)],[0 pi/4]);
% Condición inicial -> theta=pi/4
x1=cos(y(:,2));
y1=sin(y(:,2));
t_anim=length(t);
vx=[0 0];
vy=[0 0];
mx=0.04*cos(0:0.1:2*pi);
my=0.04*sin(0:0.1:2*pi);
hold on
plot([-0.2 0.2],[0 0],'k','linewidth',6); %Dibuja el "soporte" del péndulo
m=fill(my,mx,[1 0 0]); % Dibuja círculo.
h=plot(vy,vx,'linewidth',2); % Dibuja la línea de longitud del péndulo.
%% Animación
for i=1:t_anim
    axis([-1.1 1.1 -1.6 0]);
    set(h,'xdata',[0 y1(i)],'ydata',[0 -x1(i)]);
    set(m,'xdata',my+y1(i),'ydata',mx-x1(i));
    plot(y1(i),-x1(i),'-mo','Markersize',1);
    set(gca,'visible','off');
    drawnow;pause(0.1);
end

%% Sistema de Ecuaciones diferenciales del péndulo simple
    function dy=psimple(t,y)
        g=9.81;
        L=1;
        dy=zeros(2,1);
        dy(1)=y(2); % Sistema de Ecuaciones diferenciales
        dy(2)=-(g/L)*sin(y(1)); % de primer orden
    end

end



sábado, 14 de septiembre de 2013

Establecer una contraseña de acceso para una GUI


En este ejemplo veremos un ejemplo sencillo de cómo establecer una contraseña de acceso a una GUI. Para ello en las condiciones iniciales de la GUI (OpeningFcn) ponemos el siguiente código:

clave='123';
entrada=inputdlg('Introduzca una contraseña: ','Verificando acceso...',1,{'?'});
entrada=cell2mat(entrada);
if ~strcmp(entrada,clave)
    msgbox('Contraseña incorrecta');
    close(gcf);
end

El código anterior simplemente abre un "input dialog" (cuadro de diálogo) que permite introducir una cierta cadena de texto. La cadena introducida se guarda en la variable "entrada" y se compara con la cadena guardada en "clave". En el caso de coincidir la ejecución continúa de manera ordinaria abriendo la GUI, y en el caso de no coincidir simplemente cierra la GUI y muestra un mensaje de texto (msgbox).

Sugerencia: Para evitar errores borre la línea que se crea por default en OutputFcn. Claro que lo anterior es adecuado en el caso de que usted no requiera devolver argumentos de salida.


martes, 10 de septiembre de 2013

Animación de una espiral logarítmica


Esta función permite visualizar la animación de una espiral logarítmica, os adjunto el contenido de la función y un link de descarga de la misma, así como una vista previa de la misma:


function anim1

f=figure('NumberTitle','off','name','Animación Espiral','MenuBar','none','color',[1 1 1]);
t=linspace(0,2*pi,100);
r=0.5;
a=10;
b=0.85;
x=r*cos(t);
y=r*sin(t);
h=fill(x,y,[0 1 0]);axis equal;
dt=0.1;
t_anim=20;
i=0;j=t_anim;
while 1
    axis([1-a a+1 -10 10]);
    if i<t_anim
        set(h,'xdata',x+(a*b^i*cos(i)),'ydata',y+(a*b^i*sin(i)));
        hold on
        plot(a*b^i*cos(i),a*b^i*sin(i),'-bo','Markersize',2);
        set(gca,'visible','off');
        drawnow;
        pause(0.01);
        i=i+dt;
    else
        set(h,'xdata',x+(a*b^j*cos(j)),'ydata',y+(a*b^j*sin(j)));
        drawnow;
        pause(0.01);
        j=j-dt;
    end
   
    if i>1 & j<0,break,end;
end
end


jueves, 5 de septiembre de 2013

Gráfica de la temperatura media global


El siguiente script grafica las variaciones de la temperatura media global desde 1880 hasta 2012, el archivo de datos utilizado se puede descargar del siguiente link:

Archivo de datos

clear all;clc;
T=importdata('datos.txt'); % Importar datos del archivo datos.txt
ToC=(T(:,2)-32)*(5/9); % Convertir a °C la columna de temperaturas
plot(T(:,1),ToC,'r','linewidth',2); % Gráficar Tiempo vs Temperatura media
xlabel('Año'); % Etiquetas
ylabel('Temperatura media global (°C)');
datacursormode on  % Activa el modo interactivo de datos en la gráfica



Ejemplo de GUI sin utilizar GUIDE (Programmatic GUI)


Para construir una GUI sin utilizar el entorno de desarrollo integrado de MATLAB (GUIDE) haremos uso del comando "uicontrol" el cual construye  elementos de una interfaz gráfica simplemente especificando algunas características básicas.

Este ejemplo, muy sencillo, consta de un "edit text" en el cual se insertará cierto contenido, un "static text" en el cual se mostrará el contenido insertado anteriormente y un "pushbutton" que ejecutará la acción.

Enseguida os adjunto el código completo del ejemplo en cuestión:

function Simple_ProgGUI

f=figure('Visible','on','MenuBar','none','resize','off','NumberTitle','off',...
    'Name','Ejemplo 1','position',[300,400,150,150]);       
entrada=uicontrol('style','edit','string','','position',[30 120 90 20]);
salida=uicontrol('style','text','string','','position',[30 70 90 20]);
Ver=uicontrol('style','pushbutton','string','Ver','Callback',@ver,...
    'position',[30 20 90 20]);

    function ver(hObject,evendata)
        texto=get(entrada,'string');
        set(salida,'string',texto);
    end
end

Primeramente creamos una nueva figura en la cual se añadirán todos los elementos que componen la GUI, definimos algunas propiedades cómo el nombre de la figura, la visibilidad y además con la propiedad 'position' estamos definiendo la posición en la pantalla y el tamaño de la GUI (pixeles como unidad de medida por default).

Con "uicontrol" añadimos los elementos de la GUI, indicando con la propiedad 'style' el tipo de elemento que utilizaremos. Es necesario hacer mención que la posición de los uicontrols se definen con respecto a la figura a la cual pertenecen.

El 'callback' del pushbutton se definirá con una sub-función llamada "ver" y en la cual se escribe el código que se ejecutará cuando presionemos el botón. Esta sub-función simplemente toma la propiedad 'string' del elemento "entrada" y posteriormente con set configura la propiedad 'string' de "salida" colocando cómo nuevo valor lo que se ha obtenido anteriormente.

La siguiente imagen reproduce la GUI en ejecución.