sábado, 12 de octubre de 2013

Gráficas de funciones paramétricas en 2D


Para graficar una función dadas sus ecuaciones paramétricas simplemente necesitamos crear un vector que definirá al parámetro “t”, para ello podemos usar el comando “linspace” y crear un vector equiespaciado en un rango definido, y posteriormente graficar ambas ecuaciones paramétricas con la instrucción “plot”, el siguiente ejemplo muestra cómo graficar una circunferencia dadas sus ecuaciones paramétricas:


clear all;clc;
t=linspace(0,2*pi,100); % Definimos el vector del parámetro
x=cos(t); % Ecuación paramétrica
y=sin(t); % Ecuación paramétrica
plot(x,y),axis equal; % Instrucción de graficar y mostrar los ejes en proporción 1:1



Gráficas en coordenadas polares


Para trazar la gráfica de una función en coordenadas polares utilizaremos el comando “polar”, el cual necesita cómo argumentos el vector “theta”  y el vector “r” que define la función en coordenadas polares. A continuación se muestra el ejemplo de una espiral:


clear all;clc;
theta=linspace(0,10*pi,1000); % Vector theta
r=theta; % Función en coordenadas polares (espiral)
polar(theta,r,'r'); % Instrucción de graficar



Número de argumentos de entrada y salida de una función (nargin & nargout)


Una función definida en MATLAB tiene la siguiente estructura general:
function [x1, x2,.., xn]= nombrefuncion(a1,a2,…,an)
donde x1, x2,…,xn, son las variables de salida de la función y a1,a2,…,an, son los argumentos de entrada de la función.
En MATLAB las funciones pueden soportar un procedimiento específico acorde al número de argumentos que reciba o bien devolver uno o más valores según sean requeridos por el usuario.
Para ello se hace uso de las palabras reservadas nargin (número de argumentos de entrada) y nargout (número de variables de salida). Las cuales pueden ser utilizadas en una función para realizar un proceso determinado para un número de entradas o salidas definidas.
A continuación se muestra una función muy simple a modo de ejemplo:

function[suma,resta]=mifuncion(n1,n2)
if nargin~=2
    error('Número de argumentos de entrada no válidos');
end
if nargout==1
    suma=n1+n2;
end
if nargout==2
    suma=n1+n2;
    resta=n1-n2;
end
end


En el ejemplo anterior, utilizamos nargout para verificar cuantas variables de salida se están “solicitando” y con ello proporcionar una salida adecuada. De igual manera se utiliza nargin para garantizar que el número de argumentos de entrada sean los correctos, es decir, no diferente de dos para este caso.

lunes, 23 de septiembre de 2013

Curso Básico de GUI en MATLAB


En nuestro canal de YouTube podrás encontrar un curso en vídeo para iniciarte en el desarrollo de interfaces gráficas en MATLAB utilizando el entorno de desarrollo (GUIDE). El curso completo consta de 12 vídeos en los cuales se ejemplifican los usos comunes de cada uno de los elementos y además de cómo añadir ciertos elementos complementarios a una GUI.

En el siguiente link podrás acceder a la lista de reproducción en YouTube del curso.


A continuación os dejo la inserción del primer vídeo de la serie:


viernes, 20 de septiembre de 2013

Factorial de un número


MATLAB dispone de una función propia para calcular el factorial de un número, la cual es nombrada propiamente como factorial.

Ahora veremos dos maneras de cómo implementar nuestra propia función que calcule el factorial de un número entero dado.

function x=ffactorial(N)
if N<0
    error('Ingrese un entero positivo');
end
k=1;
x=1;
while k<=N
    x=k*x;
    k=k+1;
end
end


function x = mifact(N)
if N<0
    error('Ingrese un entero positivo');
end
if N==0
    x=1;
else
    x=N*mifact(N-1);
end
end

Cómo puede observarse la forma de proceder es un tanto diferente. La segunda función implica la aplicación de un concepto básico y muy útil en  programación, la recursividad, que implica un llamado a la función misma dentro del cuerpo de ésta.

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