martes, 27 de noviembre de 2007 | |

4. PROGRAMANDO CON MATLAB

Generalidades
Programar en MatLab es usar una serie de comandos que permitan realizar una tarea o función específica. Estos pueden ser escritos uno por uno a través de la línea de comandos:

>>A=[1 2 3;4 5 6;7 8 9]
A =
1 2 3
4 5 6
7 8 9
>>A'
ans =
1 4 7
2 5 8
3 6 9

El primer comando A=[1 2 3;4 5 6;7 8 9] define la matriz A y el siguiente comando A' calcula y presenta en pantalla la transpuesta de A.




a. Archivos-M: Comandos y Funciones
Los archivos de disco que contienen instrucciones de MATLAB se llaman archivos-M. Esto es así porque siempre tienen una extención de ".m" como la última parte de su nombre de archivo.

Un archivo -M consiste de una secuencia de instrucciones normales de MATLAB, que probablemente incluyen referencias a otros archivos-M. Un archivo -M se puede llamar a sí mismo recursivamente. Puedes crear archivos-M utilizando un editor de texto ó procesador de palabras.

Hay dos tipos de archivos -M: los de comandos y las funciones. Los archivos de comandos, automatizan secuencias largas de comandos. Los archivos de funciones, permiten añadir a MATLAB funciones adicionales expandiendo asi la capacidad de este programa. Ambos, comandos y funciones, son archivosordinarios de texto ASCII.

b. Archivos de Comandos
Cuando un archivo de comandos es invocado, MATLAB simplemente ejecuta los comandos encontrados en dicho archivo. Las instrucciones en un archivo de comando operan globalmente en los datos en el espacio de trabajo. Los comandos son utilizados para hacer análisis, resolver problemas, o diseñar secuencias largas de comandos que se conviertan en interactivas. Por ejemplo, suponga que el archivo fibo.m contiene los siguientes comandos de MATLAB:


% Un archivo-M para calcular los elementos de la serie de Fibonacci
f = [1 1]; i = 1;
while f(i) + f(i+1) < 1000
f(i+2) = f(i) + f(i+1);
i = i + 1;
end
plot(f)

Si escribimos fibo en una ventana de MATLAB seguido de "enter" vemos que MATLAB calcula los primeros 16 números de Fibonacci, y luego grafica estos.

Luego que la ejecución del archivo es completada, las variables f y i permanecen en el espacio de trabajo.

Los programas de demostraciones incluidos en MATLAB son ejemplos de cómo usar comandos para hacer tareas más complicadas. Para utilizar estos escriba demos en el "prompt" de MATLAB.

Archivos de Funciones
Un archivo -M que contiene la palabra function al principio de la primera línea, es un archivo de función. En una función, a diferencia de un comando, se deben de pasar los argumentos. Las variables definidas y manipuladas dentro de la función son locales a esta y no operan globalmente en el espacio de trabajo. Los archivos de funciones se utilizan para extender a MATLAB, i.e., crear nuevas funciones para MATLAB utilizando el lenguaje propio de MATLAB.

El archivo mean.m contiene las instrucciones:
function y = mean(x)

% Valor medio.
% Para vectores, mean(x) retorna el valor medio de los elementos del vector x.
% Para matrices, mean(x) es un vector fila conteniendo el valor medio de cada columna.

[m, n] = size(x);
if m == 1
m = n;
end
y = sum(x)/m;


En MatLab también encontramos:
Operadores relacionales
Los operadores relacionales de MatLab son:
< menor que
<= menor o igual a
> mayor que
>= mayor o igual a
== igual a
=~ no igual a

Ejemplo:
if n< maxn
...
if n>=0, break, end

Operadores lógicos
Los operadores &, | y ~ son los operadores de lógica "y", "o" y "no" respectivamente.
El resultado de C = A & B es una matriz cuyos elementos son unos donde A y B sean ambos distintos de cero, y ceros donde A o B sean cero. A y B deben de ser matrices con las mismas dimensiones, a menos que una de ellas sea un escalar.

El resultado de C = A | B es una matriz cuyos elementos son unos donde A ó B tienen un elemento diferente de cero, y ceros donde ambas tienen elementos cero. A y B deben de ser matrices con las mismas dimensiones, a menos que una sea un escalar.

El resultado de B = ~A es una matriz cuyos elementos son uno donde A tiene un elemento cero, y ceros donde A tiene elementos diferentes de cero.

c. Funciónes any, all
La función any(x) devuelve 1 si cualquiera de los elementos de x es diferente de cero, de lo contrario devuelve 0.
La función all(x) devuelve 1 solamente si todos los elementos de x son diferentes de cero.
Estas funciones se usan en cláusulas i f. Por ejemplo:
if all(A <.5)
. . .
End

Para argumentos matriciales, any y all trabajan por columnas para devolver un vector fila con el resultado para cada columna. Aplicando la función dos veces, any(any(A)), siempre reduce la matriz a una condición escalar.

Las funciones relacionales y lógicas en MATLAB son:
any - condiciones lógicas
all - condiciones lógicas
find - halla índices de arreglos de valores lógicos
exist - verifica si existen variables
isinf - detecta infinitos


d. Caracteres especiales
Los caracteres especiales de MatLab son:
[ ] Se utilizan para formar vectores y matrices
( ) Define precedencia en expresiones aritméticas. Encierra argumentos de funciones en forma usual, Separador de elementos de una matriz, argumentos de funciones y declaraciones en líneas con declaraciones múltiples; Termina filas de una matriz, separador de declaraciones % Comentario

Ejemplos:
[6.0 9.0 3.4 ]
sqrt(2)
for i=1:n, a(i)=0, end
for i=1:n; a(i)=0; end
% inicia vector a en 0

e. Declaración FOR anidada.
Sintaxis
for variable 1 = inicio1:paso1:fin1
for variable2 = inicio2:paso2:fin2
declaración 1;
. . .
declaración n;
end
end
Ejemplo
y=1
for t1=0:0.1:1
for t2=1: - 0.1:0
y(1)=sin(t1*t2)
end
i=i+1;
end

f. Declaración WHILE
Sintaxis:
while expresion
proposición 1;
. . .
proposición 2;
end

Ejemplos
e=1.0;
while (1.0+e)>1.0001
e=e/2.0;
end

El ciclo WHILE permite a una instrucción, o grupo de instrucciones, repetirse un número indefinido de veces, bajo el control de una condición lógica. El siguiente ciclo while halla el primer entero n para el cual n! es un número de 100 digitos:

Un cálculo más práctico ilustrando el ciclo while es en el cómputo del
exponencial de una matriz, llamado expm(A) en MATLAB. Una posible definición de la función exponencial es mediante la serie:

g. Declaraciones IF, ELSE, ELSEIF y BREAK
Sintaxis
a) if expresión
proposición 1;
. . .
proposición n;
end

b) if expresión
proposición 1;
. . .
proposición n;
else
proposición 1;
. . .
proposición m;
end

Ejemplos
if dv(i) > maxer
maxer=dv(i);
nmaxe=i;
end
sum=0.0; y=1;
while i<=so
n=input(`Introduzca n, interrumpe con valor negativo `);
if n<0, break, end;
if n==0
sum=sum+n;
elseif n<=10
sum=sum+n/2;
else
sum=sum+n/10;
end
end

A continuación se muestra como un cálculo se puede dividir en tres casos, dependiendo del signo o paridad de un entero n:
if n < 0
A = negative(n)
else if rem(n, 2) == 0
A = even(n)
else
A = odd(n)
End

h. Archivos de E/S
h.1. Declaración fopen
Sintaxis
id = fopen(`nombre.dat', `permiso')
donde permiso puede ser:

`r' Abre archivo para lectura
`r+ Abre archivo para lectura y escritura
`w' Borra el contenido del archivo existente o crea un nuevo archivo y lo abre para escritura
`w+' Idem que `w' únicamente que el archivo se abre para lectura y escritura
`a' Crea y abre un nuevo archivo o abre un archivo
`a+' Idem que `a' únicamente que el archivo es abierto para lectura y escritura

Ejemplo
fid = fopen(`archivo.dat','r')
fid = - 1 , error
0, lectura/escritura normal
[fid, mensaje = fopen(`archivo.dat','r ' )

h.2. Declaración fclose
Sintaxis
status = fclose(fid)
o
status = fclose (`all') - cierra todos los archivos abiertos

h.3. Declaración fread
Lee un archivo abierto con una precisión indicada

Sintaxis
fread(fid,registros,'precision')
registros
`char' o `uchar'
`short' o `long'
`float' o `double'

h.4. Variables globales
Son variables, de las cuales una sola copia es compartida por el programa principal y sus funciones.


Sintaxis:
global variable1, ..., variable_N

Vectorización de algoritmos y estructuras (for, while)
Para que los programas en MATLAB ejecuten más rápido, debemos sectorizar estos siempre que sea posible. Esto es, debemos convertir los ciclos for y while a operaciones de vectores o de matrices. Por ejemplo, un modo de calcular la función "sin" para 1001 números entre 1 y 10 es:
i = 0;
for t = 0:.01:10
i = i + 1;
y(i) = sin(t);
end

Una versión vectorizada del mismo código es t = 0:.01:10; y = sin(t);
En una computadora lenta, el primer ejemplo tomó 15 segundos, mientras que el segundo tomó 0.6 segundos.

h.5. Vectores Pre-Asignados
Si no podemos vectorizar un pedazo de código, podemos hacer que los ciclos for vayan más rápido pre -asignando cualquier vector en el cual el resultado de salida sea guardado. Veamos un ejemplo:

y = zeros (1,100);
for i = 1:100
y(i) = det(X^i);
end

Si no pre -asignamos el vector "y", el interpretador de MATLAB irá aumentando el tamaño de "y" por uno cada vez que se itera en el ciclo.

Permite incrementar la velocidad de proceso de MATLAB
Sintaxis
variable=inicio:incremento:final

Ejemplo
i=1, wo=2*pi*fo;
for t=0:dt:per
f(i)=sin(wo*t);
i=i+1;
end
ó
t=0:dt:per;
fi=sin(wo*t);

Algunos Ejemplos:
Para escribir un programa con MATLAB habrá que crear un fichero que tenga extensión .m y contenga las instrucciones. Esto se puede hacer con cualquier editor de textos, pero tiene algunas ventajas usar el editor propio de MATLAB llamado medit.
Un programa escrito en MATLAB admite la mayoría de las estructuras de programación al uso y su sintaxis es bastante estándar. En los siguientes ejemplos se muestra la sintaxis de algunas de estas estructuras (if, for, while,...).

i. Gráficas en Dos Dimensiones
Funciones elementales para graficar
plot - crea una gráfica de vectores ó columnas de matrices.
loglog - crea una gráfica utilizando una escala logarítmica para ambos ejes.
semi logx - crea una gráfica utilizando una escala logarítmica para el eje-x y una escala lineal para el eje-y.
semilogy - crea una gráfica utilizando una escala logarítmica para el eje -y y una escala lineal para el eje-x.
Puedes añadir títulos, encabezamien tos de ejes, líneas entre cortadas y texto a tus gráficas utilizando:
tittle - añade título a la gráfica
xlabel - añade encabezamiento al eje-x
ylabel - añade encabezamiento al eje-y
text - añade una cadena de texto en una localización específica
gtext - añade texto a la gráfica utilizando el ratón
grid - crea líneas entrecortadas

Gráficos en 3 dimensiones
plot3
Dibuja líneas y puntos en 3 dimensiones

Sintaxis:
a) plot3(x,y,z)
b) plot3(x,y,z)
c) plot3(x,y,z,'tipo_línea)
d) plot3(x1,y1,z1,'tipo_línea',...,xn,yn,zn,'tipo_línea')

Ejemplo
t=0:0.05:10*pi; plot3(sin(t),cos(t),t)

contour, contour3
Genera dibujos compuestos de líneas de valores de datos constantes obtenidos de una matriz de entrada
Sintaxis:
a) contour(z)
b) contour(z,n)
c) contour(x,y,z)
d) contour(x,y,z,n)
Ejemplo
contour(peeks)
contour(peeks,30)

4.1. Manipulación de Archivos de Disco
Algunos comandos utilizados para la manipulación de archivos de disco son dir, type, delete y cd . Si la extención no se especifica, MATLAB utiliza .m automáticamente. El comando diary crea un diario de tu sesión de MATLAB en un archivo de disco. Para más información utiliza la Guía de Referencia de MATLAB o el comando help.

4.2. Ejecutando Programas Externos
El simbolo "!" le indica a MATLAB que el resto de la línea de entrada es un comando para el sistema operativo. Por ejemplo, ! edt darwin.m invoca un editor llamado edt en un archivo llamado darwin.m. Luego que este programa sea completado, el sistema operativo devuelve el control a MATLAB.

4.3. Importando y Exportando Datos
Puedes introducir datos de otros programas a MATLAB por varios métodos.
Similarmente, puedes exportar datos de MATLAB a otros programas. También puedes hacer que tus programas manipulen datos directamente en archivos-MAT, el cúal es el formato de archivo utilizado por MATLAB. Para información acerca de las técnicas utilizadas para importar y exportar datos consulte la sección de Importando y Exportando Datos de la guía de MATLAB ó utilice al comando help de MATLAB.


4.4. INDICE ALFABETICO
axis, all, any, bar, break, brighten, clf, for, colormap, conj, contour, contour3, det, diag, else, elseif, eig, expm, fclose, fill, fill3, fft, fftn, function, fopen, fplot, fread, fwrite, grid, gtext, hadamard, hold, if, ifft, ifftn, imag, image, inv, loglog, load, lu, mesh, meshc, meshz, meshgrid, ode23, ode45, peaks, plot, plot3, poly, reshape, rot90, sphere, tril, triu, pascal, polar, real, toplitz, rand, reshape, semilog, semilogy, shading (flat interp faceted), size, sound, stairs, subplot, surf, surfc, surfl, text, title, xlabel, ylabel, while, zeros.

No hay comentarios: