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 Ejemplo
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. ARCHIVOS-M: COMANDOS Y FUNCIONES
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, ó 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) ARCHIVOS DE COMANDOS
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 como usar comandos para hacer tareas más complicadas. Para utilizar estos escriba demos en el "prompt" de MATLAB.
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; ARCHIVOS DE FUNCIONES
(Las lineas que comienzan con "%" son interpretadas como comentarios por MATLAB). La existencia de este archivo en el disco duro define una nueva función en MATLAB llamada mean. Si z es un vector de los enteros desde 1 a 99, por ejemplo, z = 1:99; entonces, el valor promedio es encontrado escribiendo mean(z) que resultaría ans = 50
Ejemplo % Ejemplo de un archivo-m % Creación del vector x usando el comando for n=5; for i=1:n x(i)=i^2; end x % Fin del archivo-m Este ejemplo es un archivo-m tipo comando. Para ejecutarlo, en la línea de comandos se debe escribir el nombre del archivo: >> ejemplo x = 1 4 9 16 25
Ejemplo % Calcula el promedio de los elementos de un vector y % dibuja dicho vector % Sintaxis: promedio(x) donde x es el vector a promediar function p = promedio(x) n=length(x); p=0; for i=1:n p=p+x(i); end p=p/n; plot(x);
Algunas funciones elementales son: real(a) Parte real imag(a) Parte imaginaria conj(a) Conjugado de a fft(x) Transformada discreta de Fourier del vector x fft(x,n) FFT de n puntos muestrales ifft(x) Transformada inversa rápida de Fourier del vector x ifft(x,n) FFT inversa de n puntos muestrados zeros Inicializa a ceros zeros(n) Matriz de nxn de ceros zeros(m,n) Matriz de mxn de ceros y=zeros(size(A) Matriz del tamaño de A, todos ceros OTRAS FUNCIONES FUNCIONES MATEMÁTICAS
Ejemplo size Regresa el número de filas y columnas A = 0 7 -6 1 0 0 0 1 0 >> [m n]=size(A) m = 3 n = 3
tril(A) Matriz triangular inferior triu(A) Matriz triangular superior pascal Triangulo de Pascal tocplitz Tocplitz FUNCIONES MATRICIALES La descomposición de Valores Singulares es importante para el análisis de problemas que envuelvan matrices. La asignación triple [U, S, V] = svd(A) produce los tres factores en la descomposición de valores singulares A = U*S*V'. Las matrices U y V son ortogonales y la matriz S es diagonal. La función svd(A) devuelve solamente los elementos de la diagonal de S, que son los valores singulares de A. DESCOMPOSICIÓN DE VALORES SINGULARES
La Descomposición de Valores Propios se utiliza para obtener los valores y vectores propios de una matriz cuadrada A. La función eig(A) devuelve los valores propios de A en un vector columna. La asignación [X,D]=eig(A) produce una matriz diagonal D cuyos elementos diagonales son los valores propios de A y las columnas de X son los vectores propios correspondientes. Las Funciones de norma, rango y acondicionamiento asociadas son: cond – número de condición en la norma 2 norm – norma 1, norma 2, norma F, norma rank – rango rcond – estimado del número de condición DESCOMPOSICIÓN DE VALORES PROPIOS
Ejemplo: El archivo-M llamado humps.m contiene las siguientes instrucciones: function y = humps(x) y = 1./((x-.3).^2 +.01) + 1./((x-.9).^2 +.04) – 6; y para la gráfica de la función escribimos x = -1:.01:2; plot(x, humps(x)) Las funciones de funciones para ecuaciones no-lineales y optimización incluyen: fmin mínimo de una función de una variable fmins mínimo de una función multi-variable (minimización no-lineal sin restricciones) fzero cero de una función de una variable constr minimización con restricciones fsolve solución de ecuación no-lineal leastsq cuadrados mínimos no-lineales ECUACIONES NO-LINEALES Y FUNCIONES DE OPTIMIZACIÓN
Las funciones de MATLAB para resolver problemas de valor inicial para ecuaciones diferenciales ordinarias son: ode23 método Runge-Kutta de largo de paso variable que combina un método de orden dos con uno de orden tres. ode45 método Runge-Kutta-Fehlberg de largo de paso variable que combina un método de orden cuatro con uno de orden cinco. Ejemplo to=0; tf=10; [t,x]=ode23(`edif',to,tf,xo); [t,x]=ode23(`deriv',to,tf,xo); ode45 [t,x]=ode23(`deriv',to,tf,xo,to1,trace); ode45 trace => 0 – no resuntados intermedios 1 – resultados intermedios default tol: ode23 -> 1.0e-03 ode45 -> 1.oe-06 FUNCIONES PARA ECUACIONES DIFERENCIALES
function nombre_1=nombre_2(parametro_1, …, parametro_n) Ejemplos: function y=promedio(x) function i=inodal(t,v) function xpunto=vdpol(t,x) xpunto=zeros(2,1); xpunto(1)=x(1).*(1-x(2).^2)-x(2); xpunto(2)=x(1); DECLARACIÓN DE function SINTAXIS
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
Los operadores &, | y ~ son los operadores de lógica "y", "ó" 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 ó 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. OPERADORES LÓGICOS
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 if. Por ejemplo: if all(A <.5) . . . end FUNCIONES any Y all
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 finite verifica para los valores finitos
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 CARACTERES ESPECIALES
for variable=incio:paso:final declaración 1; … declaración n; end for variable=inicio:final declaración 1; … declaración n; end CONTROL DE FLUJO DECLARACIÓN DE for SIMPLE SINTAXIS
Ejemplo: for i=1:n c(i)=a(i)*b(i); end o for i=1:n; c(i)=a(i)*b(i); end El ciclo FOR permite que una instrucción, ó grupo de instrucciones, pueda repetirse un número determinado de veces. Por ejemplo, for i = 1:n, x(i) = 0, end asigna 0 a los primeros n elementos de x. Si n es menor de 1, el ciclo sigue siendo válido pero MATLAB no ejecuta la instrucción intermedia. Si x no esta definido, ó si tiene menos de n elementos, entonces un espacio adicional es localizado automáticamente a x cada vez que sea necesario.
while expresion proposición 1; … proposición 2; end DECLARACIÓN while SINTAXIS e=1.0; while (1.0+e)>1.0001 e=e/2.0; end it=1; t=0; wo=2.0*pi*60.0; while it<=npts, ut=sin(wo*t);t=t+dt;end Ejemplos
El ciclo WHILE permite a una instrucción, ó 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: n = 1; while prod(1:n) < 1.0e100, n = n+1; end n 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: expm(A) = I + A + A^2/2! + A^3/3! + …
La idea es sumar todos los términos necesarios hasta producir un resultado que, en la precisión finita la de computadora, no cambie aunque más términos sean añadidos. Para esto procedemos de la forma siguiente: E = zeros(size(A)); F = eye(size(A)); k = 1; while norm(E+F-E, 1) > 0 E = E + F; F = A*F/k k = k+1; end Aqui A es la matriz dada, E representa la suma parcial de la serie, F es un término individual en la serie, y k es el índice de este término.
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 DECLARACIONES if, else, elself Y break SINTAXIS c) if expresión proposición 1; … proposición n; elseif proposición 1; … proposición m; else proposición 1; … proposición r; end d) if expresión, break, end
Ejemplo >> A=[1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9 ALGEBRA MATRICIAL CREACIÓN DE UNA MATRIZ
matriz_modificada = reshape(matriz_original, filas, columnas) Ejemplo >> A=[1 4 7 10; 2 5 8 11; 3 6 9 12] A = 1 4 7 10 2 5 8 11 3 6 9 12 >> B=reshape(A,2,6) B = 1 3 5 7 9 11 2 4 6 8 10 12 CAMBIO DEL ORDEN DE UNA MATRIZ: reshape SINTAXIS
>> A=[1 2; 3 4] A = 1 2 3 4 >> A(1,1)=A(1,2)+A(2,1) A = 5 2 3 4 MODIFICACIÓN INDIVIDUAL DE ELEMENTOS >> A(1,2)=A(2,1) A = 5 3 3 4 >> A(2,2)=10 A = 5 3 3 10 EJEMPLOS
>> A=[1 2; 3 4; 5 6 ] A = 1 2 3 4 5 6 >> b=A(:) b = 1 3 5 2 4 6 CONVERSIÓN DE UNA MATRIZ EN UN VECTOR
>> x=1:5 x = 1 2 3 4 5 >> x=5:-1:1 x = 5 4 3 2 1 >> x=0:0.25:1 x = 0 0.2500 0.5000 0.7500 1.0000 GENERACIÓN DE VECTORES: Ejemplos
Si la matriz original A es de 10*10, entonces: A(1:3,5) matriz de 3×1 que tiene los tres primeros elementos de la columna 5 de A A(1:3, 5:9) matriz de 3×4 que tiene los tres primeros filas y las columnas de 5 a 9 de A A(:,5) quinta columna de A A(1:5,:) primeras cinco filas de A A(:,[4 6])=B(:,1:2) remplaza la cuarta y sexta columnas de A con las dos primeras de A ACCESO A SUBMATRICES CONTIGUAS Y NO CONTIGUAS Ejemplos
A=[1 2; 3 4] + i*[5 6 ; 7 8] o A=[1 2; 3 4] + i*[5 6 ; 7 8] o A=[1+5i 2+6i; 3+7i 4+8i] A = 1.0000 + 5.0000i 2.0000 + 6.0000i 3.0000 + 7.0000i 4.0000 + 8.0000i DECLARACIÓN DE MATRICES COMPLEJAS
>> x=(0.0:0.2:3.0); >> y=exp(-x).*sin(x); >> [x;y] ans = Columns 1 through 7 0 0.2000 0.4000 0.6000 0.8000 1.0000 1.2000 0 0.1627 0.2610 0.3099 0.3223 0.3096 0.2807 Columns 8 through 14 1.4000 1.6000 1.8000 2.0000 2.2000 2.4000 2.6000 0.2430 0.2018 0.1610 0.1231 0.0896 0.0613 0.0383 Columns 15 through 16 2.8000 3.0000 0.0204 0.0070 GENERACIÓN DE TABLAS
>> A=[1 2 3;4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9 >> det(A) ans =0 DETERMINANTE DE A: det(A) >> A=[0 7 -6; 1 0 0;0 1 0] A = 0 7 -6 1 0 0 0 1 0 VALORES Y VECTORES CARACTERÍSTICOS: eig(A) >> eig(A) ans = -3.0000 2.0000 1.0000
>> [v d]=eig(A) v = 0.9435 -0.8729 0.5774 -0.3145 -0.4364 0.5774 0.1048 -0.2182 0.5774 d = -3.0000 0 0 0 2.0000 0 0 0 1.0000 v – Vectores característicos d – valores característicos >> A=[0 7 -6; 1 0 0;0 1 0] A = 0 7 -6 1 0 0 0 1 0 >> expm(A) ans = 5.2541 11.0757 -13.6115 2.2686 5.2541 -4.8044 0.8007 2.2686 -0.3510 Exponencial de una matriz: expm(A) >> inv(A) ans = 0 1.0000 0 0 0 1.0000 -0.1667 0 1.1667 Inversa de A: inv(A) Ecuación característica de la matriz A: poly(A) >> p=poly(A) p = 1.0000 0.0000 -7.0000 6.0000
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 ARCHIVOS DE E/S DECLARACIÓN fopen SINTAXIS Ejemplo fid = fopen(`archivo.dat','r') fid = -1, error 0, lectura/escritura normal [fid, mensaje = fopen(`archivo.dat','r')
DECLARACIÓN fclose SINTAXIS status = fclose(fid) o status = fclose (`all') – cierra todos los archivos abiertos DECLARACIÓN fread SINTAXIS Lee un archivo abierto con una precisión ndicada fread(fid,registros,'precision') registros `char' o `uchar' `short' o `long' `float' o `double' Ejemplo: A = fread(fid,10,'float') fwrite(fid,A,'short') DECLARACIÓN fwrite SINTAXIS Salida con formato Ejemplos: fprintf(fid,'titulon'); fprintf(fid,'%f %12.7fn', y); Formato %s – cadena decimal %d – número decimal %f – punto flotante % g – formato g DECLARACIÓN fprintf
ESTA PRESENTACIÓN CONTIENE MAS DIAPOSITIVAS DISPONIBLES EN LA VERSIÓN DE DESCARGA