martes, 27 de agosto de 2013

Resolver ecuaciones diferenciales de primer orden en MATLAB (ode45)


Veremos cómo resolver una ecuación diferencial de primer orden utilizando el "solver" ode45.

La sintaxis de ode45 es la siguiente:

[t,y]=ode45(fun_edo, [t_min t_max], [Cond_Ini])

donde:

[t, y] ---- es el vector de salida que contiene la variable independiente "t" y a la función solución de la ecuación diferencial.

fun_edo: ---- es la función que contiene la definición de la ecuación diferencial a resolver

[t_min t_max] ---- Es el intervalo para la variable independiente en el cual se resolverá la ecuación diferencial.

[Cond_Ini]  --- Es un vector que contiene las condiciones iniciales $y(0)$

Para crear la función que contiene la ecuación diferencial, primero necesitamos expresar esta en la forma $\frac{dy}{dt}=\,f(t, y)$. Por ejemplo supongamos que queremos resolver la siguiente ED:

$$\frac{dy}{dt}=-0.3*y$$

Entonces, la asignación se haría como sigue:

dydt=@(t,y) -0.3*y;

En la siguiente línea escribiremos la declaración del solver:

[t,y]=ode45(dydt, [0 10], [3]);

Con ello estamos indicando que resolveremos la ED contenida en "dydt" en el intervalo de 0 a 10 sujeta a la condición inicial $y(0)=3$

Para graficar la curva solución simplemente habremos de utilizar el comando plot:

plot(t,y);

Si queremos añadir más condiciones iniciales simplemente habría que agregarlas al vector correspodiente, por ejemplo:

[t,y]=ode45(dydt, [0 10], [3 10 20]);

La línea anterior resuelve la ED para las tres condiciones iniciales $y(0)=3,\,\,y(0)=10,\,\, y(0)=20$.





Vista previa de un archivo de texto (GUI)


La siguiente GUI permite obtener la "vista previa" del contenido de un archivo de texto (*.txt), mostrándola en un "static text".



Tags de los elementos:

Push Button  --->  leer
Static Text  --->  texto

La programación del push button es la que se muestra enseguida:

functionleer_Callback(hObject, eventdata, handles)
[filename, pathname] = uigetfile({'*.txt';'*.dat'}, 'Abrir archivo de texto');
ifisequal(filename,0)
   return;
else
   archivo= fullfile(pathname, filename);
end

Dat = fopen(archivo,'r');
n=1;
while ~feof(Dat)
   leer_linea = fgetl(Dat);
   ifisempty(leer_linea) | ~ischar(leer_linea), break, end
   C(n)= cellstr(leer_linea);
   n=n+1;
end
fclose(Dat);
C=C';
set(handles.texto,'String',C);

miércoles, 21 de agosto de 2013

Mini Animación (Dibujar círculos en posiciones aleatorias)


El siguiente script permite dibujar círculos en posición, tamaño, y colores aleatorios.

t=linspace(0,2*pi,100);
figure('NumberTitle','off','Name','Mini_Animación');
xlim([0 20]);
ylim([0 20]);
for n=1:50
    hold on
    r=2*rand(1,1);
    cx=20*rand(1,1);
    cy=20*rand(1,1);
    x=r*cos(t)+cx;
    y=r*sin(t)+cy;
    col=[rand(1,1) rand(1,1) rand(1,1)];
    fill(x,y,col);
    pause(0.2);
end





martes, 20 de agosto de 2013

Leer líneas de un archivo de texto en MATLAB


El siguiente "script" permite leer el contenido de un archivo con extensión *.txt y guardarlo en un cell array en el cual cada línea del archivo leído es un elemento.


clear;clc;
[Nombre_Arch, Dir_Arch] = uigetfile('*.txt', 'Seleccione un archivo de texto');
if isequal(Nombre_Arch,0)
   return;
else
   Archivo=fullfile(Dir_Arch, Nombre_Arch);
end
Dat = fopen(Archivo,'r');
n=1;
while ~feof(Dat)
   leer_linea = fgetl(Dat);
   if isempty(leer_linea) || ~ischar(leer_linea), break, end
   C(n)= cellstr(leer_linea);
   n=n+1;
end
fclose(Dat);
C=C';
disp(C);

Documentación de MATLAB (MathWorks) en PDF


Para descargar la documentación de MATLAB en PDF simplemente deberás registrarte en la página de MathWorks, rellenando algunos campos básicos, típicos de un registro a una página web.

Posteriormente debes dirigirte a este enlace en donde están todos los documentos de ayuda en formato PDF disponibles para descarga y además organizados por áreas de interés:

lunes, 19 de agosto de 2013

Ejemplo de GUI sencilla (Graficar función)


Ejemplo de una sencilla GUI que permite graficar en un intervalo fijo una función insertada en un "edit text"  





Tags de los elementos que conforman la GUI:


  • "Edit Text" -->  funcion
  • "Push Button"  --> graficar
  • "Axes" -->  axes1
  • "Static Text" -->  text1

Programación del Push Button:


functiongraficar_Callback(hObject, eventdata, handles)
f=get(handles.funcion,'String');
syms x;
ezplot(handles.axes1,f,[0 10]);



Gráficas Bidimensionales (Coordenadas Rectangulares)


Variables Simbólicas en MATLAB


Exportar datos de MATLAB con dlmwrite


Eliminar filas y columnas de una matriz en MATLAB


Entrada en revisión/corrección, gracias por vuestra comprensión.

Fechas y horas en MATLAB


Primeramente es importante mencionar que MATLAB maneja tres formatos de fechas y hora, a saber:

  • Un vector de seis elementos los cuales son: [año, mes, día, hora, minuto, segundo].
  • Un valor escalar de coma flotante (tipo double), en el cual la parte entera representa la cantidad de días que han transcurrido desde el año cero (calendario gregoriano) y la parte decimal representa la fracción del día trascurrido.
  • Una cadena de texto con la forma \texttt{'dd-mmm-aaa HH:MM:SS'}.

Para obtener la fecha actual MATLAB proporciona el comando now:

>> now
ans =
  7.3575e+05

Lo anterior podría resultar útil para efectos de cálculo pero no es tan significativo para el usuario que está acostumbrado a visualizar la fecha y hora mediante los formatos convencionales; podemos convertir el valor numérico anterior a una cadena de texto que nos proporcione mayor información a primer vista, para ello se utiliza la función datestr como sigue:

>> datestr(now)
ans =
03-Jun-2014 17:09:36

Además de las anteriores MATLAB dispone de las funciones datevec y clock, la primera convierte una determinada fecha pasada como argumento en formato string o numérico a un vector de seis elementos como se describió anteriormente, y clock devuelve la fecha y hora actual tal como la hace now pero  como un vector de seis elementos.

viernes, 9 de agosto de 2013

Sentencias if-elseif-else en MATLAB


Estas sentencias agrupadas son un ejemplo característico de una bifurcación múltiple, en la cual se tienen tantas condiciones como sean necesarias y una elección por defecto contenida en else. La estructura general es la siguiente:

if condición 1
      Proceso1
elseif condición 2
      Proceso 2
elseif condición  3
      Proceso 3
.
.
.

else
      Proceso por default
end

Enseguida se muestra un código de ejemplo:

a=input('Primer número: ');
b=input('Segundo número: ');

if a==b
    disp('Números iguales');
elseif a>b
    disp('a es mayor que b');
else
    disp('a es menor que b');
end



a=input('Escriba un número:   ');

if  rem(a,2)==0
    disp('El número es Par')
else
    disp('El número es Impar')
end

Sentencia switch en MATLAB


La sentencia switch es también una bifurcación múltiple, puesto que permite elegir entre varios casos especificados y ejecutar una determinada acción, posee además un bloque que contiene las instrucciones para el caso por defecto. La forma general es la siguiente:

switch expresion
      case opcion1
            Instrucciones 1…
      case opcion2
            Instrucciones 2…
      .
      .
      .
      otherwise
            Instrucciones por defecto…
end

Enseguida se muestra un ejemplo de aplicación de la sentencia switch:

a=input('Primer número: ');
b=input('Segundo número: ');
var=input('Operación que desea realizar: \n\n1=Suma\n2=Resta\n\n');
switch var
    case 1
        suma=a+b
    case 2
        resta=a-b
    otherwise
        error('Opción incorrecta. Ingresa un número válido');
end

En el script anterior el usuario deberá ingresar un valor de 1 o 2 dependiendo de la operación que desee realizar, si ingresa cualquier otro número o valor entonces MATLAB devolverá un mensaje de error que indicará que dicha opción no es válida.

El argumento del "case" no necesariamente tiene que ser un número, puede ser un elemento de tipo String (cadena de texto).

La función disp en MATLAB


La función disp muestra en pantalla el valor de una determinada variable que se pasa como
argumento, por ejemplo:

>> a=3;
>> disp(a)
    3

Para el caso anterior se pasa como argumento la variable a que ha sido declarada previamente
y simplemente se muestra el valor correspondiente a esta. Las variables a mostrar pueden ser
de cualquier tipo, incluyendo cadenas de texto, matrices, cell arrays y estructuras,
véanse los siguientes ejemplos:

>> disp(magic(3))
    8     1     6
    3     5     7
    4     9     2
>> disp({1,0,2,-2})
   [1]    [0]    [2]    [-2]
>> disp('Hola Mundo')
Hola Mundo

Con disp también es posible mostrar enlaces a un sitio web, utilizando la sintaxis HTML para
un enlace dentro de la función disp, por ejemplo:

>> disp('<a href="http://matlab-typ.blogspot.mx">MATLAB TYP</a>');
MATLAB TYP

La función "input" en MATLAB


La estructura general del comando input es la siguiente:

input('Esperando un valor: ');

Al ejecutar la linea anterior la cadena de texto 'Esperando un valor' se utilizará como prompt en espera de que el usuario introduzca un determinado valor que posiblemente será utilizado posteriormente. Para guardar el valor que el usuario inserta basta con asignar el "input" a una variable, por ejemplo:

a=input('Esperando un valor: ');

Lo que se introduzca como valor quedará guardado en la variable "a".

Si el valor que se introduce es una cadena de texto o tipo "String" es necesario utilizar un parámetro adicional como se muestra enseguida:

a=input('Esperando un valor: ', 's');