cursoMATLAB
Short Description
Descripción: Curso básico de Matlab...
Description
CURSO DE MANEJO Y PROGRAMACIÓN DE
MATLAB
DANTE PINTO JERIA Potosí- Bolivia
2010
Dante Pinto Jeria
2
Dante Pinto Jeria
CAPÍTULO I PRIMEROS PASOS CON MATLAB 1.1 INTRODUCCIÓN.El nombre del programa Matlab viene de Matrix Laboratory (Laboratorio de Matrices), para Matlab todos los objetos son considerados como matrices. Este programa es una herramienta de cálculo, fundamentalmente, numérico. Aunque también puede realizar cálculos simbólicos. El entorno de trabajo fundamental de Matlab es el siguiente:
Donde se presentan: La ventana de comandos (Command Window) que es donde se trabaja de manera directa, los comandos son introducidos después del apuntador (prompt) >> El historial de comandos (Command History), muestra los comandos utilizados en por orden. La ventana de las carpetas actuales (Current Folder).
3
Dante Pinto Jeria Y el espacio de trabajo (Workspace) que muestra las variables utilizadas y creadas en el entorno de trabajo. Originalmente el fondo de trabajo es blanco, pero es posible cambiarlo a un fondo oscuro (o de otro color). Para ello se debe ir a File, Preferences
Se debe quitar la marca de Use system colors, luego en Text se selecciona el color blanco y en Background. Luego se hace clic en Apply y luego en OK.
1.2 MANEJO FUNDAMENTAL.1.2.1 Entrada de datos y salida de resultados.Matlab funciona como una calculadora de lógica algebraica. Todo resultado de operaciones es almacenado en la variable ans (answer = respuesta). >> 45*76 ans = 3420 >> 2+3 ans = 5 Si es que no se quisiera mostrar los resultados, se debe poner un punto y coma al final de la línea. >> 78/3; >> El resultado es almacenado internamente, pero no se lo muestra por pantalla. Esto es muy útil cuando no queremos que se muestren resultados intermedios, o que se llene la pantalla con números que son irrelevantes.
4
Dante Pinto Jeria Matlab permite recuperar las últimas operaciones realizadas, presionando la tecla de la flecha hacia arriba ↑. Presionando dos veces se recupera la penúltima operación y así sucesivamente.
1.2.2 Borrado de la pantalla.El Command Window se borra mediante clc 1.2.3 Formato de números decimales.Matlab permite cambiar el formato de números decimales mediante el comando format. Por omisión Matlab muestra los resultados con cuatro decimales, ese es el formato short. >> 3/7 ans = 0.4286 Para cambiar a otro formato con más decimales se debe presionar >> format long Luego presionando dos veces la flecha hacia arriba del cursor (para recuperar la penúltima operación). >> 3/7 ans = 0.428571428571429 El resultado tiene ahora 15 decimales. También se puede fijar el formato racional, para realizar operaciones fraccionarias. >> format rat >> 3/5+1/2-1/8 ans = 39/40 Para volver al formato por omisión, simplemente se teclea >> format
5
Dante Pinto Jeria 1.2.4 Ayuda.Se puede obtener ayuda sobre un comando o una función tecleando help seguido del nombre del comando sobre el cual se desea la ayuda. Por ejemplo, si es que se quisiera conseguir ayuda sobre el comando format. >> help format Y a continuación aparece una serie de textos, con la ayuda correspondiente. 1.2.5 Variables.Matlab puede almacenar valores en variables, al igual que cualquier otro lenguaje de programación, siempre y cuando el nombre de la variable no sea una palabra reservada de Matlab. El programa discrimina entre mayúsculas y minúsculas. Para asignar un valor a una variable simplemente se teclea: >> x=24 x= 24 Se pueden asignar también múltiples variables en una sola línea, utilizando punto y comas para separar las mismas. >> y=34;z=24;g=21; >> Para ver las variables que se encuentran en el libro de trabajo actual se puede utilizar el comando who >> who Your variables are: a ans g x
y z
Una variante es el comando whos >> whos Name Size Bytes Class a ans 6
4-D 1x3
192 double 24 double
Attributes
Dante Pinto Jeria g 1x1 8 double x 1x1 8 double y 1x1 8 double z 1x1 8 double regresa el nombre de la variable, su tamaño y el tipo de datos que almacena Para borrar variables se puede utilizar el comando clear >> clear a x Lo anterior borra las variables a y x Para borrar todas las variables se teclea >> clear
1.3 GUARDADO DEL ESPACIO DE TRABAJO.Una vez que se sale de la sesión de Matlab, todas las variables que se hayan creado son borradas de la memoria. Si es que queremos recuperar todas las variables y el espacio de trabajo, este debe ser guardado. Para ello se utiliza el menú File, luego Save Workspace As.
Para abrir el espacio de trabajo, guardado con anterioridad, se utiliza File luego Open
7
Dante Pinto Jeria
CAPÍTULO II MANEJO DE MATRICES 2.1 INTRODUCCIÓN.Una matriz es un arreglo rectangular de elementos. Un caso particular de matriz es un vector, cuando tiene una sola dimensión. Puede haber vectores fila o vectores columna. Una forma de introducir una matriz, en Matlab, es utilizando corchetes y dentro de ellos las filas separadas por ; (punto y coma) y las columnas separadas por espacios. >> a=[1 2 3;4 5 6;7 8 9] a= 1 4 7
2 5 8
3 6 9
También se pueden formar matrices o vectores mediantes secuencias, utilizando el operador
: (dos puntos). De la siguiente manera
inicio:paso:final >> a=[1:2:20] a= 1 3 5 7
9
>> b=[-1:.5:1;-1:.5:1] b= -1.0000 -0.5000 -1.0000 -0.5000
11
0 0
13
15
0.5000 0.5000
17
19
1.0000 1.0000
También se puede modificar un elemento de una matriz mediante los índices de la siguiente manera >> b(2,1)=8 b= -1.0000 -0.5000 0 0.5000 1.0000 8.0000 -0.5000 0 0.5000 1.0000 También se puede acceder a un elemento de una matriz mediante un solo índice que se constituye en una referencia continua. 8
Dante Pinto Jeria >> b(4)=15 b= -1.0000 -0.5000 8.0000 15.0000
0 0.5000 1.0000 0 0.5000 1.0000
Donde la referencia se la realiza de la siguiente manera
Matlab tiene incorporada una función de generación de cuadrados mágicos, que no son otra cosa que matrices cuadradas, que tienen la propiedad de que la suma de cada fila y cada columna, asimismo que la suma de las diagonales dan un mismo número. Así por ejemplo: >> magic(4) ans = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 Estos cuadrados mágicos tienen siglos de antigüedad, un ejemplo muy conocido de ellos aparece en el grabado del alemán Alberto Durero llamado Melancolía I, el cual se lo puede ver también en Matlab, tecleando: >> load durer;image(X);colormap(map);axis image
9
Dante Pinto Jeria
En esta imagen aparece un cuadrado mágico en la esquina superior derecha. Para ver el detalle del mismo se puede teclear: >> load detail;colormap(hot);image(X)
Que es la misma matriz mágica que presenta Matlab, pero con las columnas centrales intercambiadas, esto lo hizo Durero, para que aparezca en la parte inferior la fecha en la que se realizó el grabado 1514.
10
Dante Pinto Jeria
2.2 OPERACIONES FUNDAMENTALES CON MATRICES.2.2.1 Borrar una fila o una columna de una matriz.De la matriz >> a=magic(4) a= 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 borrar la cuarta fila. >> a(4,:)=[] a= 16 2 3 13 5 11 10 8 9 7 6 12 Si ahora se quiere borrar la tercera columna. >> a(:,3)=[] a= 16 2 13 5 11 8 9 7 12
Los dos puntos indican todo, lo que quiere decir que se hace referencia a toda la fila o a toda la columna. 2.2 Añadir una fila o una columna a una matriz.Por ejemplo en la siguiente matriz aumentar una columna con el elemento a(3,6)=8 >> a=magic(5) a= 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 11
Dante Pinto Jeria
>> a(3,6)=8 a= 17 24 1 8 15 0 23 5 7 14 16 0 4 6 13 20 22 8 10 12 19 21 3 0 11 18 25 2 9 0 Como se puede apreciar, los elementos faltantes son llenados con ceros. 2.3 Sumar los elementos de una matriz.Se utiliza el comando sum, el cual realiza la suma de las columnas de la matriz. Si se aplica sobre un vector, realiza la suma de todos los elementos del mismo. Así para el siguiente vector: >> b=[1:5] b= 1 2 3 4 5 >> sum(b) ans = 15 Como ejemplo comprobaremos que la matriz mágica, realmente es mágica. >> a=magic(4) a= 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 La suma de las columnas se la realiza mediante >> sum(a) ans = 34 34 34 34 La suma de las filas se la realiza transponiendo la matriz (una matriz transpuesta es cuando las filas se toman como columnas y viceversa). Para transponer una matriz, se pone un apóstrofe sobre el nombre de la misma a’ >> sum(a') ans = 34 34 34 34
12
Dante Pinto Jeria Para la suma de los elementos de la diagonal principal, se utiliza >> sum(diag(a)) ans = 34 Para sumar los elementos de la diagonal secundaria se utiliza el comando fliplr, que cambia de izquierda a derecha las filas de una matriz. >> sum(diag(fliplr(a))) ans = 34 Para aclarar el anterior paso veamos: >> fliplr(a) ans = 13 3 2 16 8 10 11 5 12 6 7 9 1 15 14 4 2.4 Intercambio de filas y columnas.Supongamos que se quiere cambiar la matriz mágica que presenta Matlab a la misma forma de matriz que aparece en el cuadro de Durero, para eso se procede: >> a=magic(4);a=a(:,[1 3 2 4]) a= 16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1 El orden de presentación de las columnas lo da el vector [1 3 2 4] Si se quieren cambiar la primera con la cuarta columnas, se procede: >> a=a([4 2 3 1],:) a= 4 15 14 1 5 10 11 8 9 6 7 12 16 3 2 13
13
Dante Pinto Jeria 2.5 Reformado de una matriz.Se puede reformar una matriz mediante la función reshape. Si la matriz era n*m se reformula a un tamaño nuevo p*q, siempre y cuando m*n=p*q Así, por ejemplo, si se quiere reformular el tamaño de la matriz de 3*4 >> a=[1:4;5:8;9:12] a= 1 2 3 4 5 6 7 8 9 10 11 12 a una matriz 6*2, se procede: >> reshape(a,6,2) ans = 1 5 9 2 6 10
3 7 11 4 8 12
2.6 Replicado de una matriz.Para esto se utiliza la función repmat(matriz,m,n), replica la matriz m veces en las filas y n veces en las columnas,de la siguiente manera: Replicar la matriz 1 2 2 3 Dos veces en las filas y tres veces en las columnas >> repmat([1 2;2 3],2,3) ans = 1 2 1 2
14
2 3 2 3
1 2 1 2
2 3 2 3
1 2 1 2
2 3 2 3
Dante Pinto Jeria 2.7 Matriz identidad.La matriz identidad se construye mediante la función eye(n) donde n indica el tamaño de la misma, así por ejemplo: >> eye(4) ans = 1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
2.8 Suma de matrices.Para sumar dos matrices, estas deben ser del mismo tamaño. >> a=[1:4;5:8;9:12] a= 1 2 3 4 5 6 7 8 9 10 11 12 Ahora la matriz b la construimos como el reverso de a, para eso >> b=a(end:-1:1,end:-1:1) b= 12 11 10 9 8 7 6 5 4 3 2 1 Luego las sumamos >> a+b ans = 13 13 13 13 13 13 13 13 13 13 13 13 2.9 Multiplicación de matrices.Se debe cumplir que el número de columnas de la primera sea igual al número de filas de la segunda, sin esta condición no se pueden multiplicar dos matrices. El producto matricial no es conmutativo. La matriz resultante tiene, como tamaño, el número de filas de la primera por el número de columnas de la segunda.
C(m*p)=A(m*n)*B(n*p) 15
Dante Pinto Jeria >> a a= 1 4
2 5
3 6
>> b b= 7 8 9 10 11 12 >> a*b ans = 58 64 139 154 2.10 Inversa de una Matriz.Se calcula mediante la función inv(matriz). Solo existe la inversa de matrices cuadradas, siempre y cuando estas no sean singulares. Se define una matriz inversa como aquella que multiplicada por su matriz original da como resultado la matriz identidad (este es uno de los pocos caso en los que se admite la propiedad conmutativa en la multiplicación).
A-1*A=A*A-1=I Calcular la inversa de la siguiente matriz y comprobar el resultado. >> a=magic(5) a= 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 >> b=inv(a) b= -0.0049 0.0512 0.0431 -0.0373 -0.0303 0.0031 0.0047 -0.0065 0.0028 0.0050 16
-0.0354 0.0012 0.0034 -0.0046 0.0127 0.0015 0.0031 0.0031 0.0364 0.0108 0.0435 -0.0370 0.0415 -0.0450 0.0111
Dante Pinto Jeria La comprobación se >> a*b ans = 1.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 0.0000 -0.0000 0.0000
la realiza mediante la multiplicación de las dos matrices.
0 0.0000 -0.0000 0 0.0000 0 1.0000 0.0000 -0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 1.0000
>> b*a ans = 1.0000 -0.0000 0 -0.0000 0.0000 0.0000 1.0000 0 0.0000 0.0000 0 0.0000 1.0000 0.0000 0.0000 0.0000 0.0000 -0.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 2.11 Determinante de una Matriz.Se calcula mediante det(matriz), el resultado es un número. El determinante solo existe para matrices cuadradas, siempre y cuando no sean singulares. Calcular el determinante de la matriz: >> a=magic(3) a= 8 1 6 3 5 7 4 9 2 >> det(a) ans = -360 2.12 Reducción escalonada por filas (reduced row echelon form).Se realiza mediante la función rref(matriz). Trabaja sobre matrices rectangulares o cuadradas. >> rref(magic(4)) ans = 1 0 0 1 0 1 0 3 0 0 1 -3 0 0 0 0 17
Dante Pinto Jeria >> rref(magic(3)) ans = 1 0 0 0 1 0 0 0 1 2.13 Rango de una matriz.Se calcula mediante rank(matriz). Indica el número de filas diferentes de cero que tiene la matriz después de realizar una reducción escalonada de filas. Así, por ejemplo, para los dos ejemplos anteriores se tiene: >> rank(magic(4)) ans = 3 >> rank(magic(3)) ans = 3 2.14 Media aritmética de los elementos de una matriz.La media aritmética o promedio se calcula de las columnas de la matriz. >> mean(magic(4)) ans = 8.5000 8.5000 8.5000 8.5000 Si se quisiera el promedio de todos los elementos de la matriz se teclea: >>mean(mean(magic(4))) ans = 8.5000 2.15 Máximos y mínimos.Se calculan con max(matriz) y min(matriz) respectivamente. Se calculan por columnas. >> max(magic(4)) ans = 16 14 15 13 >> min(magic(4)) ans = 4 2 3 1
18
Dante Pinto Jeria Para el máximo o mínimo de todos los elementos. >> max(max(magic(4))) ans = 16 >> min(min(magic(4))) ans = 1 2.16 Generación de números aleatorios.Se generan números aleatorios con las funciones rand(m,n) y randn(m,n). La segunda da números aleatorios normalmente distribuidos. >>rand(4) ans = 0.7577 0.1712 0.0462 0.3171 0.7431 0.7060 0.0971 0.9502 0.3922 0.0318 0.8235 0.0344 0.6555 0.2769 0.6948 0.4387 >> rand(2,3) ans = 0.3816 0.7952 0.7655 0.1869
0.4898 0.4456
>> randn(3,4) ans = 0.6277 -0.8637 -1.1135 -0.7697 1.0933 0.0774 -0.0068 0.3714 1.1093 -1.2141 1.5326 -0.2256 2.17 Resolución de sistemas de ecuaciones lineales.Un sistema de ecuaciones lineales tiene una matriz de coeficientes A, un vector de incógnitas y un vector de términos independientes.
AX=B Para resolver un sistema de ecuaciones lineales se pueden utilizar dos métodos. 1) X= A-1 B 2) X=A\B Así, por ejemplo, resolver el sistema 19
Dante Pinto Jeria
x1-4 x2 + x3=10 3x1+3x2- 2x3=20 x1+6x2+3x3=30 de las tres formas, para ello primero se guardan los coeficientes n las variables A y B >> A=[1 -4 1;3 3 -2;1 6 3];B=[10;20;30]; Primera forma >> X=inv(A)*B X= 9 1 5 Segunda forma >> X=A\B X= 9.0000 1.0000 5.0000 2.18 Operaciones elemento por elemento.Se pueden realizar las operaciones elemento por elemento si es que después del nombre de la matriz se pone un punto (.) Así, por ejemplo, si se tienen las siguientes matrices >> a=[1 2 3;4 5 6;7 8 9];b=[2 3 2;2 3 2;2 3 2]; >> a.*b ans = 2 6 6 8 15 12 14 24 18 Si no se hubiese puesto el punto, se habría realizado la multiplicación tradicional de matrices.
20
Dante Pinto Jeria También funciona con potencias, así por ejemplo, con la misma matriz a anterior >> a.^2 ans = 1 4 9 16 25 36 49 64 81 Si no se hubiese utilizado el punto decimal el resultado sería el equivalente a la multiplicación matricial de una matriz por si misma. >> a^2 ans = 30 36 42 66 81 96 102 126 150 2.19 Función meshgrid.Esta función tiene la sintaxis [X,Y]=meshgrid(x,y) Transforma el dominio especificado por los vectores x e y en arreglos X e Y que pueden ser usados para la evaluación de funciones de dos variables y gráficas de superficies en 3D. Las filas del arreglo de salida X son copias del vector x y las columnas del arreglo de salida Y son copias del vector y. Si solo se utiliza un argumento [X,Y]=meshgrid(x),tanto X como Y son copias de x. Esta función resulta como dos ciclos for i for j anidados. >> [X,Y] = meshgrid(1:4, 1:4) X= 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 Y= 1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
2.19 Tabla resumen de operaciones.A continuación se muestra una tabla que resume algunas de las operaciones con vectores, si es que se tienen los vectores columna x y y con los siguientes valores
21
Dante Pinto Jeria
22
Dante Pinto Jeria
2.20 Exportar e importar a EXCEL.Para exportar a Excel se utiliza el comando xlswrite(archivo,matriz,hoja,rango). Para importar de Excel se utiliza el comando xlsread(archivo,hoja,rango). Así, por ejemplo, si se quiere exportar la matriz mágica de tamaño 5 a una hoja Excel llamada magia y ubicada en la unidad c: >> a=magic(5); >> xlswrite('c:\magia.xlsx',a) Si se quiere exportar en una hoja específica y en un rango específico >>xlswrite('c:\magia.xlsx',a,'Hoja2','C3:G7') Ahora si es que queremos importar a la variable b los datos de la hoja2 del archivo amgia de Excel, anteriormente guardado, se procede: >> b=xlsread('c:\magia.xlsx','Hoja2','C3:G7') b= 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
2.3 EJEMPLOS DE APLICACIONES.Ejemplo2.1: Crear una matriz de 4*4 con números aleatorios entre 15 y 85. >> 15+fix(70*rand(4)) ans = 69 21 55 72 42 24 19 16 31 80 31 18 43 81 39 26 Ejemplo2.2: Dada una matriz mágica de 5*5 sumar todos los elementos de las columnas impares. 23
Dante Pinto Jeria >> a=magic(5); >> sum(sum(a(1:2:end,:))) ans = 195 Ejemplo2.3: En una matriz mágica, de tamaño 6, de cada columna impar encontrar el mínimo, e indicar su índice relativo. >> a=magic(6) a= 35 1 6 26 19 24 3 32 7 21 23 25 31 9 2 22 27 20 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11 >> [m ind]=min(a(:,1:2:end)) m= 3 2 10 ind = 2 3 4 Ejemplo2.4: De la matriz mágica de de tres. >> a=1+fix(100*rand(9)) a= 65 19 45 54 48 93 74 37 31 36 24 44 65 63 51 94 85 19 46 79 52 88 20 91 55 9 82 56 23 98 30 93 80 63 18 44 75 78 65 59 23 12 19 49 38 21 44 26 69 44 82 31 32 41 >> mean(a(3:3:end,:)')' ans =
24
tamaño 9, calcular el promedio de las filas múltiplos
60 27 61 72 23 12 30 32 43
51 24 9 46 27 97 81 55 3 53 93 24 74 49 49 63 58 68
Dante Pinto Jeria 62.4444 50.7778 52.0000 Ejemplo2.5: Encontrar el índice, de referencia continua, correspondiente al máximo valor de los elementos de la siguiente matriz de 9*9. a=
>> find(a==max(max(a))) ans = 50
25
Dante Pinto Jeria
CAPÍTULO III GRÁFICOS 3.1 INTRODUCCIÓN.Matlab tiene muchas rutinas de alto nivel para gráficas. En Matlab las variables independientes no son generadas de manera automática, sino que el usuario debe generarlas. Los gráficos que genera Matlab pueden ser clasificados como en dos y tres dimensiones. Si se desea mantener un gráfico anterior y sobreponer un gráfico posterior, se debe tecleat el comando >> hold on; Se mantienen los gráficos anteriores, hasta que se teclea >>hold off;
3.2 GRÁFICOS 2D.3.2.1 Función plot.Esta es la más usada y simple de las funciones gráficas. La sintaxis es la siguiente: plot(Y) plot(X1,Y1,...,Xn,Yn) plot(X1,Y1,EspecLinea,...,Xn,Yn,EspecLinea) plot(X1,Y1, EspecLinea,'NombrePropiedad',ValorPropiedad) plot(axes_handle,X1,Y1, EspecLinea, 'NombrePropiedad',ValorPropiedad) h = plot(X1,Y1, EspecLinea, 'NombrePropiedad',ValorPropiedad)
Los colores y tipos de línea vienen dados según las siguientes tablas: y amarillo m magenta c cyan r rojo g verde b azul w blanco k negro --. * . s 26
Continua Línea cortada Línea y punto Estrellas Puntitos Cuadrados
Dante Pinto Jeria o : x + ^ v > < d p h
círculos Punteado Marca Mas Triángulo hacia arriba Triángulo hacia abajo Triángulo a la derecha Triángulo a la izquierda Diamante Pentagrama Hexagrama
Ejemplo3.1: >> x=0:pi/100:3*pi;y=sin(x); >> plot(x,y,'k-','LineWidth',2); 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1
0
1
2
3
4
5
6
7
8
9
10
Ejemplo3.2: >> plot(x,y,'r:','LineWidth',3);
27
Dante Pinto Jeria 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1
0
1
2
3
4
5
6
7
8
9
10
Ejemplo3.3: Graficar el seno y el coseno, con una rejilla, con un título, una leyenda, una etiqueta en x y una en y >> x=0:pi/100:3*pi;y1=sin(x);y2=cos(x); >> plot(x,y1,'r-',x,y2,'b--');legend('seno','coseno');title('Dos gráficas, de 0 a 2\pi');xlabel('Eje X');ylabel('Eje Y');grid on; Dos gráficas, de 0 a 2 1 seno coseno
0.8 0.6 0.4
Eje Y
0.2 0 -0.2 -0.4 -0.6 -0.8 -1
0
1
2
3
4
5 Eje X
6
7
8
9
10
Para que aparezca el símbolo π se pone dentro de las comillas simples ’…\pi’
28
Dante Pinto Jeria Ejemplo3.4: Graficar el logo que aparece en la carátula de este texto, cuya ecuación es r=sin(5t/8), con 0≤ t ≤ 16 π Como está en forma polar, habrá que convertir a la forma rectangular x=sin(5t/8)cos(t); y=sin(5t/8)sin(t) >> t=0:pi/100:16*pi;r=sin(5*t/8);x=r.*cos(t); y=r.*sin(t); >> plot(x,y,'k-','Linewidth',2);axis equal;axis off;set(gcf,'Color',[1,1,1])
Se utiliza la función set(gcf,'Color',[1,1,1]) para modificar el color dl fondo del gráfico, en este caso se puso el fondo blanco. Ejemplo3.5: Graficar con marcadores. x = -pi:pi/10:pi;y = tan(sin(x)) - sin(tan(x)); plot(x,y,'--rs','LineWidth',2,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','g',... 'MarkerSize',10)
29
Dante Pinto Jeria 3
2
1
0
-1
-2
-3 -4
-3
-2
-1
0
1
2
3
4
Ejemplo3.6: Realizar un gráfico, modificando los ejes y las marcas de los ejes. > x = -pi:.1:pi; y = sin(x); plot(x,y) set(gca,'XTick',-pi:pi/2:pi) set(gca,'XTickLabel',{'-pi','-pi/2','0','pi/2','pi'}) 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1
-pi
-pi/2
0
pi/2
pi
3.2.2 Función plotyy.Esta función grafica con el eje y tanto a la izquierda como a la derecha de la figura.
30
Dante Pinto Jeria plotyy(X1,Y1,X2,Y2) plotyy(X1,Y1,X2,Y2,función) plotyy(X1,Y1,X2,Y2,'funcion1','funcion2') [AX,H1,H2] = plotyy(...)
Ejemplo3.7: x = 0:0.01:20; y1 = 200*exp(-0.05*x).*sin(x); y2 = 0.8*exp(-0.5*x).*sin(10*x); [AX,H1,H2] = plotyy(x,y1,x,y2,'plot'); 200
0.8
150
0.6
100
0.4
50
0.2
0
0
-50
-0.2
-100
-0.4
-150
-0.6
-200
0
2
4
6
8
10
12
14
16
18
-0.8 20
Ejemplo3.8: Modificar las líneas del anterior ejemplo. x = 0:0.01:20; y1 = 200*exp(-0.05*x).*sin(x); y2 = 0.8*exp(-0.5*x).*sin(10*x); [AX,H1,H2] = plotyy(x,y1,x,y2,'plot');set(H1,'LineStyle','--');set(H2,'LineStyle',':') 200
0.8
150
0.6
100
0.4
50
0.2
0
0
-50
-0.2
-100
-0.4
-150
-0.6
-200
0
2
4
6
8
10
12
14
16
18
-0.8 20
31
Dante Pinto Jeria
3.2.3 Funciónes semilogx y semilogy.Trazan gráficas semilogarítmicas. La sintaxis es: semilogx(Y) semilogy(...) semilogx(X1,Y1,...) semilogx(X1,Y1,EspecLinea,...) semilogx(...,'NombPropiedad',ValorPropiedad,...) h = semilogx(...) h = semilogy(...)
Ejemplo3.9: Trazar una gráfica con el eje y logarítmico y el eje x normal. >> x = 0:.1:10; semilogy(x,10.^x);grid on; 10
10
8
10
6
10
4
10
2
10
0
10
0
1
2
3
4
5
6
7
3.2.4 Función loglog.Traza gráficas en escala log-log. La sintaxis es la siguiente: loglog(Y) loglog(X1,Y1,...) loglog(X1,Y1,EspecLinea,...) loglog(...,'NombPropiedad',ValorPropiedad,...) h = loglog(...)
32
8
9
10
Dante Pinto Jeria Ejemplo3.10: x = logspace(-1,2); loglog(x,exp(x),'r-s','LineWidth',1); grid on; 50
10
40
10
30
10
20
10
10
10
0
10
-1
10
0
10
1
10
2
10
3.2.5 Función polar.Traza gráficas polares. Su sintaxis es: polar(theta,rho) polar(theta,rho,EspecLinea) polar(manejados_ejes,...) h = polar(...)
Ejemplo3.11: Trazar el logo de la carátula. >> t=0:pi/100:16*pi;r=sin(5*t/8); >> polar(t,r,'-k');set(gcf,'Color',[1,1,1])
33
Dante Pinto Jeria 90
1
120
60 0.8 0.6
150
30 0.4 0.2
180
0
210
330
240
300 270
3.2.6 Función compass.La función brújula, grafica flechas saliendo del origen. La sintaxis es: compass(U,V) compass(Z) compass(...,EspecLinea) compass(manejador_ejes,...) h = compass(...)
Ejemplo3.12: Realizar la gráfica tipo brújula de los valores propios de una matriz. >> Z = eig(randn(20,20)); compass(Z);set(gcf,'Color',[1,1,1]) 90
5
120
60 4 3
150
30 2 1
180
0
210
330
240
300 270
3.2.7 Función line.34
Dante Pinto Jeria Dibuja líneas. La sintaxis es: line line(X,Y) line(X,Y,Z) line(X,Y,Z,'NombPropiedad',ValorPropiedad,...) line('XData',x,'YData',y,'ZData',z,...) h = line(...)
Ejemplo3.13: >>line([0 1],[0 1],'Color','r','LineWidth',4) 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
3.2.8 Función hist.Grafica un histograma. La sintaxis es: n = hist(Y) n = hist(Y,x) n = hist(Y,nbins) [n,xout] = hist(...) hist(...) hist(manejador_ejes,...)
Ejemplo3.14: >> x = -4:0.1:4; y = randn(10000,1); hist(y,x)
35
Dante Pinto Jeria 450 400 350 300 250 200 150 100 50 0 -5
-4
-3
-2
-1
0
1
2
3
4
5
Ejemplo3.15: Cambiar el color del anterior gráfico de manera que sea rojo con bordes blancos. >> h = findobj(gca,'Type','patch'); set(h,'FaceColor','r','EdgeColor','w') 450 400 350 300 250 200 150 100 50 0 -5
-4
-3
-2
-1
0
1
2
3
4
5
El comando findobj encuentra objetos con valores de propiedades específicos. 3.2.9 Función bar, barh.Dibuja barras verticales y horizontales respectivamente. La sintaxis es: bar(Y) bar(x,Y) bar(...,ancho) bar(...,'estilo') bar(...,'color_barra') bar(...,'NombPropiedad',ValorPropiedad,...)
36
Dante Pinto Jeria bar(manejador_ejes,...) barh(manejador_ejes,...) h = bar(...) barh(...) h = barh(...)
Ejemplo3.16: >> x = -2.9:0.2:2.9; bar(x,exp(-x.*x),'r') 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 -3
-2
-1
0
1
2
3
Ejemplo3.17: >> x = -2.9:0.2:2.9; barh(x,exp(-x.*x),'b') 3
2
1
0
-1
-2
-3
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
3.2.10 Función pie.Realiza la gráfica de una torta. Su sintaxis es: pie(X) pie(X,explotar) pie(...,etiquetas) pie(manejador_ejes,...) h = pie(...)
37
Dante Pinto Jeria
Ejemplo3.18: >> pie([1 2 1.4 4 1.5 3]) 8% 23% 16%
11%
12%
31%
Ejemplo3.19: Dibujar una torta haciendo énfasis en la segunda tajada. >> x = [1 3 0.5 2.5 2]; explotar = [0 1 0 0 0]; pie(x,explotar) colormap jet 11% 22%
33%
28%
6%
3.2.13 Función patch.Crea uno o más polígonos llenados. Su sintaxis es: patch(X,Y,C) patch(X,Y,Z,C) patch(FV) patch(X,Y,C,'NombrePropiedad',ValorPropiedad...) patch('NombrePropiedad',ValorPropiedad,...) manejador = patch(...)
38
Dante Pinto Jeria
Ejemplo3.20: >> xdato = [2 2 0 2 5; 2 8 2 4 5; 8 8 2 4 8]; ydato = [4 4 4 2 0; 8 4 6 2 2; 4 0 4 0 0]; zdato = ones(3,5); patch(xdato,ydato,zdato,'w') 8 7 6 5 4 3 2 1 0
0
1
2
3
4
5
6
7
8
Ejemplo3.21: Repetir el anterior ejemplo, pero utilizando vértices y caras. >> verts = [2 4; ... 2 8; ... 8 4; ... 8 0; ... 0 4; ... 2 6; ... 2 2; ... 4 2; ... 4 0; ... 5 2; ... 5 0 ]; caras = [ ... 1 2 3; ... 1 3 4; ... 39
Dante Pinto Jeria 5 6 1; ... 7 8 9; ... 11 10 4 ]; >> p=patch('Faces',caras,'Vertices',verts,'FaceColor','r'); 8 7 6 5 4 3 2 1 0
0
1
2
3
4
5
6
7
8
3.2.14 Función triplot.Esta función grafica mallas triangulares. Su sintaxis es: triplot(TRI,x,y) triplot(TRI,x,y,color) h = triplot(...) triplot(...,'param','value','param','value'...)
Ejemplo3.22: Dados los índices y coordenadas siguientes, dibujar la malla de elementos finitos triangulares. Después de almacenar las coordenadas y los índices en las variables coorde e indices, respectivamente, se teclea: >> triplot(indices, coorde(:,1), coorde(:,2),'k');
40
Dante Pinto Jeria 10 9 8 7 6 5 4 3 2 1 0
indices = 1 2 2 5 2 3 4 5 1 4 4 8 4 6 7 8 1 7 7 11 7 9 10 11 12 11 11 14 11 9 13 14
coorde = 2.0000 1.0000 0 3.5000 2.5000 5.0000 5.0000 6.5000 8.0000 3.5000 6.5000 5.0000
0
1
2
3
4
5
6
7
8
9
10
4 4 5 6 7 7 8 9 10 10 11 12 13 13 14 15
5.0000 2.5000 0 3.0000 0.5000 1.0000 5.0000 3.0000 5.0000 7.0000 7.0000 9.0000
41
Dante Pinto Jeria 7.5000 9.0000 10.0000
9.5000 7.5000 10.0000
3.2.15 Función step.Dibuja la respuesta paso de sistemas lineales invariantes en el tiempo. Su sintaxis es: step step(sys) step(sys,t) step(sys1,sys2,...,sysN) step(sys1,sys2,...,sysN,t) y = step(sys,t) [y,t] = step(sys) [y,t,x] = step(sys) % solamente par modelos en el espacio de estados
Ejemplo3.23: Graficar la respuesta de la función de transferencia s/(s2+2s+3) frente a una entrada escalón (paso). >> step([1 ],[1 2 3]) Step Response 0.4
0.35
0.3
Amplitude
0.25
0.2
0.15
0.1
0.05
0
0
1
2
3
4
5
6
7
8
Time (sec)
3.2.16 Función impulse.Da la respuesta a una función impulso. Su sintaxis es: impulse impulse(sys) impulse(sys,t)
Ejemplo3.24: Graficar la respuesta de la función de transferencia s/(s2+2s+3) frente a una entrada impulso. >> impulse([1 ],[1 2 3])
42
Dante Pinto Jeria Impulse Response 0.3
0.25
Amplitude
0.2
0.15
0.1
0.05
0
-0.05
0
1
2
3
4
5
6
7
8
Time (sec)
3.2.17 Función rlocus.Grafica la localización de raíces de una función de transferencia. Su sintaxis es: rlocus(sys) rlocus(sys1,sys2,...)
Ejemplo3.25: Graficar la localización de raíces de la siguiente función de transferencia.
>> h = tf([2 5 1],[1 2 3]); rlocus(h) Root Locus 1.5
1
Imaginary Axis
0.5
0
-0.5
-1
-1.5 -2.5
-2
-1.5
-1
-0.5
0
0.5
Real Axis
3.2.18 Función subplot.Crea gráficos en mosaico. La sintaxis es: h = subplot(m,n,p) or subplot(mnp) subplot(m,n,p,'replace')
43
Dante Pinto Jeria subplot(m,n,P) subplot(h) subplot('Position',[left bottom width height]) subplot(..., prop1, value1, prop2, value2, ...) h = subplot(...)
Ejemplo3.26: >> subplot(2,2,[1 3]) subplot(2,2,2) subplot(2,2,4) 1
1
0.9
0.8 0.6
0.8
0.4 0.7
0.2
0.6
0
0
0.5
1
0
0.5
1
0.5 1
0.4
0.8
0.3
0.6 0.2
0.4
0.1 0
0.2 0
0.5
1
0
Ejemplo3.27: >> subplot(2,2,1);subplot(2,2,2);subplot(2,2,3);subplot(2,2,4)
44
Dante Pinto Jeria
3.3 GRÁFICOS 3D.3.3.1 Función mesh, meshc, meshz.Realiza la gráfica en 3D de mallas. La función meshc, dibuja un contorno debajo de la función. La función meshz dibuja una cortina debajo del dibujo en 3D. Su sintaxis es: mesh(X,Y,Z) mesh(Z) mesh(...,C) mesh(...,'NombreProp',ValorPropiedad,...) mesh(manejador_ejes,...) meshc(...) meshz(...) h = mesh(...)
Ejemplo3.28: >> [X,Y] = meshgrid(-2:.1:2, -2:.1:2); Z = X .* exp(-X.^2 - Y.^2); mesh(X,Y,Z)
0.5
0
-0.5 2 1
2 1
0
0
-1
-1 -2
-2
Se puede hacer una animación en tiempo real de la gráfica, haciendo clic en el ícono
45
Dante Pinto Jeria Y luego con las flechas del teclado o con el ratón y presionando el botón izquierdo, se hace rotar la figura. Ejemplo3.29: Utilizar meshc >> [X,Y] = meshgrid(-2:.1:2, -2:.1:2); Z = X .* exp(-X.^2 - Y.^2); meshc(X,Y,Z)
0.5
0
-0.5 2 1
2 1
0
0
-1
-1 -2
-2
Ejemplo3.30: Utilizar meshz >> [X,Y] = meshgrid(-2:.1:2, -2:.1:2); Z = X .* exp(-X.^2 - Y.^2); meshz(X,Y,Z)
0.5
0
-0.5 2 1
2 1
0
0
-1
-1 -2
46
-2
Dante Pinto Jeria 3.3.2 Función surf, surfc.Esta función grafica un superficie sombreada, en 3D. Y la función surfc, grafica lo mismo, pero con un contorno en la parte inferior. Su sintaxis es surf(Z) surf(Z,C) surf(X,Y,Z) surf(X,Y,Z,C) surf(...,'NombPropiedad',ValorPropiedad) surf(manejador_ejes,...) surfc(...) h = surf(...)
Ejemplo3.31: >> [X,Y] = meshgrid(-2:.1:2, -2:.1:2); Z = X .* exp(-X.^2 - Y.^2); surf(X,Y,Z)
0.5
0
-0.5 2 1
2 1
0
0
-1
-1 -2
-2
3.3.3 Función polt3.Realiza la gráfica de curvas en 3D.La sintaxis es: plot3(X1,Y1,Z1,...) plot3(X1,Y1,Z1,EspecLinea,...) plot3(...,'NombrePropiedad',ValorPropiedad,...) h = plot3(...)
Ejemplo3.32: >>t = 0:pi/50:10*pi;plot3(sin(t),cos(t),t);grid on;axis square
47
Dante Pinto Jeria
40
30
20
10
0 1 0.5
1 0.5
0
0
-0.5
-0.5 -1
-1
3.3.4 Función surfl.Realiza una gráfica de una superficie, con iluminación basada en mapa de colores. Su sintaxis es: surfl(Z) surfl(...,'light') surfl(...,s) surfl(X,Y,Z,s,k) h = surfl(...)
Ejemplo3.33: >> [x,y] = meshgrid(-3:1/8:3); z = peaks(x,y); surfl(x,y,z); shading interp colormap(gray); axis([-3 3 -3 3 -8 8])
48
Dante Pinto Jeria
5
0
-5
2 0 -2 -3
0
-1
-2
2
1
3
3.3.5 Función contour.Esta funcion grafica los contornos o curvas de nivel de superficies en el espacio. Su sintaxis es: contour(Z) contour(Z,n) contour(Z,v) contour(X,Y,Z) contour(X,Y,Z,n) contour(X,Y,Z,v) contour(...,LineSpec) contour(axes_handle,...) [C,h] = contour(...)
Ejemplo3.34: >>[X,Y] = meshgrid([-2:.25:2]); Z = X.*exp(-X.^2-Y.^2); contour(X,Y,Z,30) 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2
-1.5
-1
-0.5
0
0.5
1
1.5
2
49
Dante Pinto Jeria Ejemplo3.35: >> [X,Y] = meshgrid([-2:.25:2]);Z = X.*exp(-X.^2-Y.^2); [C,h] = contour(interp2(Z,4)); text_handle = clabel(C,h); set(text_handle,'BackgroundColor',[1 1 .6],'Edgecolor',[.7 .7 .7]) 250
0 0.1
0.1
-0 .3
0.1
-0 .3
-0 .4
-0 .2
0.1
0 0.2
-0 .2
0.1
-0.1
50
0.3
0.4
0.3
-0.1
-0 .1
100
0.2
150
-0 .1
.2 -0
0. 2
-0.1
200
0
50
100
150
200
250
Ejemplo3.36: Realizar la gráfica del campo de gradientes. >> [X,Y] = meshgrid(-2:.2:2); Z = X.*exp(-X.^2 - Y.^2); [DX,DY] = gradient(Z,.2,.2); contour(X,Y,Z); hold on; quiver(X,Y,DX,DY); colormap hsv; hold off; 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2
50
-1.5
-1
-0.5
0
0.5
1
1.5
2
Dante Pinto Jeria La función quiver realiza la gráfica de flechas que pueden representar velocidades o cambio repentino. 3.3.6 Función contour3.Realiza una gráfica de contorno en 3D. Su sintaxis es: contour3(Z) contour3(Z,n) contour3(Z,v) contour3(X,Y,Z) contour3(X,Y,Z,n) contour3(X,Y,Z,v) contour3(...,EspecLinea) contour3(manejador_ejes,...) [C,h] = contour3(...)
Ejemplo3.37: >> [X,Y] = meshgrid([-2:.25:2]); Z = X.*exp(-X.^2-Y.^2); contour3(X,Y,Z,30) surface(X,Y,Z,'EdgeColor',[.8 .8 .8],'FaceColor','none') grid off view(-15,25) colormap cool 0.5
0
-0.5 2
0
-2
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
51
Dante Pinto Jeria
CAPÍTULO IV CÁLCULO NUMÉRICO Y SIMBÓLICO 4.1 CÁLCULO NUMÉRICO.4.1.1 Función roots.Encuentra raíces de polinomios. La función roots(c) calcula las raíces de los polinomios cuyos coeficientes son los elementos del vector c. Si c tiene n+1 componentes el polinomio es c(1)*x^n + ... + c(n)*x + c(n+1). Ejemplo4.1: Hallar las raíces de x4-3x3-x+6=0 >> roots([1 -3 0 -1 6]) ans = 2.8671 1.4273 -0.6472 + 1.0234i -0.6472 - 1.0234i 4.1.2 Función fzero.Calcula las raíces de funciones continuas de una variable. La sintaxis es: x = fzero(fun,x0) x = fzero(fun,x0,opciones) [x,fval] = fzero(...) [x,fval,etiquetasalida] = fzero(...) [x,fval,etiquetasalida,salida] = fzero(...)
Ejemplo4.2: Hallar la raíz de x*sin(x)=0, cerca de x0=2 >> f=@(x)x*sin(x);z=fzero(f,2) z= 3.1416 4.1.3 Función poly.Convierte raíces a polinomios. Ejemplo4.3: Hallar el polinomio, del cual las raíces, son x=1,2,3 >> poly([1 2 3]) ans = 1 -6 11 -6 52
Dante Pinto Jeria Lo que corresponde a x3-6x2+11x-6 4.1.4 Función polyval.Evalúa un polinomio en un valor determinado; y = polyval(p,x) da como resultado el valor de un polinomio de grado n evaluado en x. El argumento de entrada p es un vector de longitud n+a, cuyos elementos son los coeficientes en orden descendente de potencia del polinomio a ser evaluado. Ejemplo4.4: Evaluar el polinomio x3-6x2+11x-6 en x=6 >> polyval([ 1 -6 11 -6 ],6) ans = 60 4.1.5 Función polyfit.Ajusta un polinomio de grado n a los datos x e y; p = polyfit(x,y,n) Ejemplo4.5: Ajustar un polinomio de segundo grado para los puntos (1,0);(4,4);(7,0) >> polyfit([1;4;7],[0;4;0],2) ans = -0.4444 3.5556 -3.1111 Lo que corresponde a -0.4444x2+3.5556 x-3.1111 Ejemplo4.6: Realizar el mismo ejemplo anterior, pero con formato racional >> format rat >> polyfit([1;4;7],[0;4;0],2) ans = -4/9 32/9 -28/9 4.1.6 Función conv.Realiza la convolución y la multiplicación de polinomios. Ejemplo4.7: Multiplicar (x+1)*(2x2-3x+5) >> conv([0 1 1],[2 -3 5]) ans = 0 2 -1 2 5 Lo que corresponde a 2x3-x2+2x+5
53
Dante Pinto Jeria 4.1.7 Función deconv.Realiza la deconvolución. La sintaxis es [q,r] = deconv(v,u) donde q es el cociente y r es el residuo. Ejemplo4.8: >>u = [1 2 3 4];v = [10 20 30]; La convolución es >>c = conv(u,v) c= 10 40 100
160
170
120
Se usa la deconvolución para recuperar u: [q,r] = deconv(c,u) q= 10 20 30 r= 0 0 0 0
0
0
4.1.8 Función polyder.Realiza la derivada de un polinomio. Su sintaxis es k = polyder(p) k = polyder(a,b) [q,d] = polyder(b,a)
cuando se tiene polyder(a,b), calcula la derivada del producto de a por b. cuando se tiene [q,d] = polyder(b,a), da como resultado el numerador q y el denominador d de la derivada del cociente de b/a. Ejemplo4.9: Hallar la derivada de 4x3-2x2+3x-5 >> polyder([4 -2 3 -5]) ans = 12 -4 3 Ejemplo4.10: Hallar la derivada de (x+1)(x2-2x-1) >> polyder([1 1],[1 -2 -1]) ans = 3 -2 -3 Ejemplo4.11: Hallar la derivada de (x+1) / (x2-2x-1) >> [q,d]=polyder([1 1],[1 -2 -1]) q= -1 -2 1 d= 54
Dante Pinto Jeria 1
-4
2
4
1
4.1.9 Función polyint.Integra analíticamente un polinomio. La sintaxis es: polyint(p,k) polyint(p)
Ejemplo4.12: Integrar el polinomio con una constante k=0 >> polyint([1 2 3 4]) ans = 1/4 2/3 3/2 4 0 Ejemplo4.13: Integrar el polinomio con una constante k=3 >> polyint([1 2 3 4],3) ans = 1/4 2/3 3/2 4 3 4.1.10 Función residue.Convierte entre la expansión en fracciones parciales y coeficientes polinomiales. Su sintaxis es: [r,p,k] = residue(b,a) [b,a] = residue(r,p,k)
Convierte entre expresiones tipo:
a expresiones como la siguiente, cuando no se tienen raíces repetidas.
o a expresiones como la siguiente, cuando se tienen raíces repetidas.
Ejemplo4.14: Expandir en fracciones parciales
>> b = [ 5 3 -2 7];a = [-4 0 8 3]; >> [r, p, k] = residue(b,a) r= -1.4167 -0.6653 55
Dante Pinto Jeria 1.3320 p= 1.5737 -1.1644 -0.4093 k= -1.2500 Ejemplo4.15: Realizar el proceso inverso con los anteriores datos. >> [b,a] = residue(r,p,k) b= -1.2500 -0.7500 0.5000 -1.7500 a= 1.0000 -0.0000 -2.0000 -0.7500 Lo cual puede interpretarse como
Debe hacerse notar que el resultado está normalizado para el coeficiente líder en el denominador. 4.1.11 Función feedback.La sintaxis es: sys = feedback(sys1,sys2)
Ejemplo4.16: Hallar la función de transferencia resultante de:
56
Dante Pinto Jeria
>> feedback(tf([2 5 1],[1 2 3]),tf([0 5 10],[0 1 10])) Transfer function: 2 s^3 + 25 s^2 + 51 s + 10 --------------------------11 s^3 + 57 s^2 + 78 s + 40 Se debe utilizar la función tf para convertir a funciones de transferencia. 4.1.12 Función series.Encuentra la función de transferencia en cascada (serie). La sintaxis es: series sys = series(sys1,sys2) sys = series(sys1,sys2,outputs1,inputs2)
Ejemplo4.17: Hallar la función de transferencia en cascada de: G1(s)=10/(s2+2s+10); G2(s)=5/(s+5) >> num1=[0 0 10];den1=[1 2 10];num2=[0 5];den2=[1 5]; >> [num,den]=series(num1,den1,num2,den2); >> printsys(num,den) num/den = 50 ----------------------s^3 + 7 s^2 + 20 s + 50 4.1.13 Función parallel.Encuentra la función de transferencia en paralelo. La sintaxis es: 57
Dante Pinto Jeria parallel sys = parallel(sys1,sys2) sys = parallel(sys1,sys2,inp1,inp2,out1,out2) sys = parallel(sys1,sys2,'nombre')
Ejemplo4.18: Hallar la función de transferencia en paralelo de: G1(s)=10/(s2+2s+10); G2(s)=5/(s+5) >> num1=[0 0 10];den1=[1 2 10];num2=[0 5];den2=[1 5]; >> [num,den]=parallel(num1,den1,num2,den2); >> printsys(num,den) num/den = 5 s^2 + 20 s + 100 ----------------------s^3 + 7 s^2 + 20 s + 50 4.1.14 Función tf2ss.Esta función convierte de la función de transferencia al espacio de estados. La sintaxis es: [A,B,C,D] = tf2ss(num,den) x' = Ax + Bu y = Cx + Du del sistema: num(s) H(s) = -------den(s) Ejemplo4.19: Convertir al espacio s/(s3+14s2+56s+160). >> num=[0 0 1 0];den=[1 14 56 160]; >> [A,B,C,D]=tf2ss(num,den) A=
58
de
estados
la
función
de
transferencia
Dante Pinto Jeria -14 -56 -160 1 0 0 0 1 0 B= 1 0 0 C= 0
1
0
D= 0 4.1.15 Función ss2tf.Esta función convierte dl espacio de estados a la función de transferencia. La sintaxis es: [num,den] = ss2tf(A,B,C,D,iu) iu se debe especificar para sistemas con más de una entrada. Por ejemplo si el sistema tiene tres entradas (u1,u2,u3), entonces iu debe ser o 1,2 o 3, donde 1 se refiere a u1, 2 a u2 y 3 a u3. NUM(s) -1 H(s) = -------- = C(sI-A) B + D DEN(s) Del sistema: x' = Ax + Bu y = Cx + Du Ejemplo4.20: Obtenga la función de transferencia del sistema definido por las siguientes ecuaciones en el espacio de estados:
>> A=[0 1 0;0 0 1;-5 -25 -5]; >> B=[0;25;-120]; >> C=[1 0 0]; 59
Dante Pinto Jeria >> D=[0]; >> [num,den]=ss2tf(A,B,C,D) num = 0 0.0000 25.0000 5.0000 den = 1.0000 5.0000 25.0000 5.0000 >> printsys(num,den) num/den = 8.8818e-015 s^2 + 25 s + 5 -------------------------s^3 + 5 s^2 + 25 s + 5 4.1.16 Función solve.Esta función permite resolver sistemas de ecuaciones no lineales. La sintaxis es SOLVE('ecu1','ecu2',...,'ecuN','var1,var2,...,varN') SOLVE('ecu1','ecu2',...,'ecuN','var1','var2',...'varN') Ejemplo4.21: >> [x,y] = solve('x^2 + x*y + y = 3','x^2 - 4*x + 3 = 0') x= 1 3 y= 1 -3/2
4.2 CÁLCULO SIMBÓLICO.Matlab realiza cálculos simbólicos, aunque no es la especialidad de este programa. Por lo tanto presenta algunas limitaciones frente a otros programas como Mathematica, que si es especialista en cálculo simbólico. Para estas funciones, es necesario, declarar las variables como simbólicas, esto se realiza mediante el comando syms, seguido del nombre de la variable. Así, por ejemplo syms x,y declara como simbólicas las variables x e y 4.2.1 Función limit.Encuentra el límite de una función. Su sintaxis es: limit(f,x,a) toma el límite de la expresión simbólica f como x -> a. limit(f,a) usa symvar(f) como la variable independiente. limit(f) usa a = 0 como el punto límite. limit(f,x,a,'right') or limit(f,x,a,'left') especifica la dirección del límite lateral 60
Dante Pinto Jeria Ejemplo4.22: >> syms x;limit('sin(x)/x',x,0) ans = 1 4.2.2 Función diff.Calcula la derivada simbólica. La sintaxis es: diff(expr) diff(expr, diff(expr, diff(expr, diff(expr, diff(expr,
v) sym('v')) n) v, n) n, v)
diff(expr)
deriva una expresión simbólica expr con respecto a su variable libre (sin ningún valor asignado) determinada por symvar. diff(expr, v)
y diff(expr, sym('v')) deriva expr con respect a v.
diff(expr, n)
deriva expr n veces. n es un entero positivo
diff(expr, v, n)
y diff(expr, n, v) deriva expr con respecto a v n veces.
Ejemplo4.23: >> syms x; >> diff('sin(x)^3',x) ans = 3*cos(x)*sin(x)^2 4.2.4 Función int.Integra una expresión simbólica. Su sintaxis es: int(expr) int(expr, v) int(expr, a, b) int(expr, v, a, b)
int(expr) realiza la integral indefinida de expr con respecto a su variable simbólica definida por symvar. int(expr, v) realiza la integral indefinida de expr con respecto a su variable simbólica definida por la variable escalar v.
61
Dante Pinto Jeria int(expr, a, b) realiza la integral definida desde a a b de expr con respecto a la variable simbólica por omisión. a y b son simbólicas o doble escalares. int(expr, v, a, b) realiza la integral definida de expr con respecto a v desde a a b. Ejemplo4.24: Integrar
>> sym x; >> int((6*x+1)*sin(sqrt(3*x^2+x-1))/sqrt(3*x^2+x-1)) ans = (-2)*cos((3*x^2 + x - 1)^(1/2)) 4.2.5 Función collect.Reúne coeficientes. La sintaxis es: R = collect(S) R = collect(S,v) R = collect(S) regresa arreglo S de polinomios. R = collect(S,v)
un arreglo de polinomios reunidos para cada polinomio en el
reúne términos que contienen la variable v.
Ejemplo4.25: Simplificar x+1+x+5x2+1-2x-2x2 >> syms x; >> collect(x+1+x+5*x^2+1-2*x-2*x^2) ans = 3*x^2 + 2 4.2.6 Función expand.Expande simbólicamente polinomios y funciones elementales. La sintaxis es: expand(S)
Ejemplo4.26: >>syms x; >>expand((x-2)*(x-4)) ans = x^2 - 6*x + 8
62
Dante Pinto Jeria Ejemplo4.27: >>syms x y; >>expand(cos(x+y)) ans = cos(x)*cos(y) - sin(x)*sin(y) Ejemplo4.28: >>syms a b; >>expand(exp((a+b)^2)) ans = exp(2*a*b)*exp(a^2)*exp(b^2) Ejemplo4.29: >>syms t; >>expand([sin(2*t), cos(2*t)]) ans = [ 2*cos(t)*sin(t), cos(t)^2 - sin(t)^2]
4.2.7 Función factor.Factoriza una expresión de manera simbólica. Ejemplo4.30: >> factor(1024) ans = 2 2 2 2 2 2 2 2 2 2 Ejemplo4.31: >>syms x y; >>factor(x^3-y^3) ans = (x - y)*(x^2 + x*y + y^2) Ejemplo4.32: >>syms a b; >>factor([a^2 - b^2, a^3 + b^3]) ans = [ (a - b)*(a + b), (a + b)*(a^2 - a*b + b^2)] 4.2.8 Función numden.Devuelve el numerador y el denominador. La sintaxis es: [N,D] = numden(A)
Ejemplo4.33: >>[n, d] = numden(sym(4/5)) n= 4 63
Dante Pinto Jeria
d= 5 Ejemplo4.34: >>syms x y; >>[n,d] = numden(x/y + y/x) n= x^2 + y^2 d= x*y Ejemplo4.35: >>syms a b >>A = [a, 1/b] [n,d] = numden(A) A= [a, 1/b] n= [a, 1] d= [1, b]
4.2.9 Función simplify.Realiza la simplificación simbólica. La sintaxis es R = simplify(S)
Ejemplo4.36: >>syms x; >>simplify(sin(x)^2 + cos(x)^2) ans = 1 Ejemplo4.37: >>syms a b c; >>simplify(exp(c*log(sqrt(a+b)))) ans = (a + b)^(c/2)
Ejemplo4.38: >>S = [(x^2 + 5*x + 6)/(x + 2), sqrt(16)]; 64
Dante Pinto Jeria >>R = simplify(S) R= [ x + 3, 4]
4.2.10 Función simple.Busca la forma más simple de una expresión simbólica. Ejemplo4.39: >>syms x; >>f = cos(x)^2 + sin(x)^2; >>f = simple(f) f= 1 >>g = cos(3*acos(x)); >>g = simple(g) g= 4*x^3 - 3*x
4.2.11 Función subs.Substituye simbólicamente, en una expresión simbólica o en una matriz. La sintaxis es: R = subs(S) R = subs(S, nuevo) R = subs(S, viejo, nuevo)
Ejemplo4.40: >>syms a b; >>subs(a + b, a, 4) ans = b+4 Ejemplo4.41: >>syms a b; >>subs(cos(a) + sin(b), {a, b}, {sym('alpha'), 2}) ans = sin(2) + cos(alpha) Ejemplo4.42: Suponiendo que a = 980 y C2 = 3 existen en el workspace. The statement >>y = dsolve('Dy = -a*y') y= C2/exp(a*t) 65
Dante Pinto Jeria a = 980; C2 = 3; subs(y) ans = 3/exp(980*t)
4.2.12 Función dsolve.Resuelve ecuaciones diferenciales ordinarias de manera simbólica. La sintaxis es: dsolve('eq1','eq2',...,'cond1','cond2',...,'v') dsolve(...,'IgnoreAnalyticConstraints',value)
Ejemplo4.43: Resolver my’’+cy’+ky=0 >> dsolve('m*D2y=-c*Dy+-k*y') ans = C3/exp((t*(c + (c^2 - 4*k*m)^(1/2)))/(2*m)) + C2/exp((t*(c - (c^2 4*k*m)^(1/2)))/(2*m)) Ejemplo4.44: >>dsolve('Dx = -a*x') ans = C2/exp(a*t) Ejemplo4.45: >>dsolve('Df = f + sin(t)') ans = C4*exp(t) - sin(t)/2 - cos(t)/2 Ejemplo4.46: >>dsolve('(Dy)^2 + y^2 = 1','s') ans = 1 -1 cosh(C7 + s*i) cosh(C11 - s*i) Ejemplo4.47: >>dsolve('Dy = a*y', 'y(0) = b') ans = b*exp(a*t) Ejemplo4.48: >>dsolve('D2y = -a^2*y', 'y(0) = 1', 'Dy(pi/a) = 0') ans = (1/exp(a*t*i))/2 + exp(a*t*i)/2 Ejemplo4.49: >>z = dsolve('Dx = y', 'Dy = -x') 66
Dante Pinto Jeria z= x: [1x1 sym] y: [1x1 sym] Se introduce z.x y z.y par aver los resultados: z.x ans = C20*cos(t) + C19*sin(t) z.y ans = C19*cos(t) - C20*sin(t)
4.2.13 Función laplace.Calcula la transformada de Laplace. Su sintaxis es: laplace(F) laplace(F, t) laplace(F, w, z)
Ejemplo4.50: >> syms t >> laplace(sin(t)) ans = 1/(s^2 + 1) Ejemplo4.51: >> syms x t w;laplace(cos(t*w),x) ans = x/(w^2 + x^2)
4.2.14 Función ilaplace.Calcula la transformada inversa de Laplace. Su sintaxis es: F = ilaplace(L) F = ilaplace(L,y) F = ilaplace(L,y,x)
Ejemplo4.52 >> g=laplace(exp(t)) g= 1/(s - 1) >> ilaplace(g) ans = exp(t) 67
Dante Pinto Jeria
Ejemplo4.53: >> ilaplace(t^(-sym(5/2)),x) ans = (4*x^(3/2))/(3*pi^(1/2))
4.2.15 Función fourier.Calcula la transformada de Fourier. La sintaxis es: F = fourier(f) F = fourier(f,v) F = fourier(f,u,v)
Ejemplo4.54: >> syms t; >> fourier(1/t) ans = pi*(2*heaviside(-w) - 1)*i
4.2.16 Función ifourier.Calcula la transformada inversa de Fourier. La sintaxis es: f = ifourier(F) f = ifourier(F,u) f = ifourier(F,v,u)
Ejemplo4.55: >> syms t w x >> ifourier(w*exp(-3*w)*sym('heaviside(w)')) ans = 1/(2*pi*(- 3 + x*i)^2)
4.2.17 Función ztrans.Realiza la transformada Z. Su sintaxis es: F = ztrans(f) F = ztrans(f, w) F = ztrans(f, k, w)
Ejemplo4.56: >> syms k n w z >> ztrans(2^n) ans = z/(z - 2) Ejemplo4.57: 68
Dante Pinto Jeria >> ztrans(sin(k*n),w) ans = (w*sin(k))/(w^2 - 2*cos(k)*w + 1)
4.2.18 Función iztrans.Calcula la transformada Z inversa. Su sintaxis es: f = iztrans(F) f = iztrans(F,k) f = iztrans(F,w,k)
Ejemplo4.58: >> iztrans(z/(z-2)) ans = 2^n Ejemplo4.59: >> iztrans(exp(x/z),z,k) ans = x^k/factorial(k)
4.2.19 MuPad.Matlab 2010, tiene incorporada una caja de herramientas (toolbox), que contiene el programa de álgebra computarizada (CAS) MuPad. Para cargar esta caja de herramientas se debe teclear >>mupad Este programa permite realizar diferentes cálculos simbólicos y gráficas muy elaboradas. Tiene su propia sintaxis independiente de Matlab.
69
Dante Pinto Jeria
70
Dante Pinto Jeria MuPad tiene las siguientes diferencias con Matlab. Tarea
Sintaxis de MATLAB
Sintaxis de MuPAD
Asignar
=
:=
Lista de variables
whos
anames(All, User)
Valor numérico de una expresión
double(expression)
float(expression)
Supresión de la salida
;
:
Entrada de una matriz
[x11,x12,x13; x21,x22,x23]
matrix([[x11,x12,x13], [x21,x22,x23]])
{a,b,c}
cell array
set
Comandos de algebra Lineal
Nothing extra needed
linalg:: prefix, or use(linalg)
Autocompletar
Tab
Ctrl-space
Igualdad, Desigualdad en comparación
==, ~=
=,
En cuanto a expresiones, estas son las diferencias: Expresión de MATLAB Expresión de MuPAD
Inf
infinity
pi
PI
i
I
NaN
undefined
fix
trunc
log
ln
asin
arcsin
71
Dante Pinto Jeria
Expresión de MATLAB Expresión de MuPAD
acos
arccos
atan
arctan
asinh
arcsinh
acosh
arccosh
atanh
arctanh
acsc
arccsc
asec
arcsec
acot
arccot
acsch
arccsch
asech
arcsech
acoth
arccoth
besselj
besselJ
bessely
besselY
besseli
besselI
besselk
besselK
lambertw
lambertW
sinint
Si
cosint
Ci
eulergamma
EULER
conj
conjugate
72
Dante Pinto Jeria
Expresión de MATLAB Expresión de MuPAD
catalan
CATALAN
laplace
transform::laplace
ilaplace
transform::invlaplace
ztrans
transform::ztrans
iztrans
transform::invztrans
Copiando variables y expresiones entre el espacio de trabajo (Workspace) y los Notebooks de MuPad. Se pueden copiar variables entre el notebook de MuPad a una variable en el worksapce de Matlab, usando un comando de Matlab y viceversa. Para ello es necesario conocer el manejador del notebook de Mupad al que se quiere acceder. La única forma de asignar variables entre un notebook de MuPad y el workspace de Matlab es necesario empezar el notebook usándola sintaxis.
nb = mupad; (Se puede usar cualquier otra variable en lugar de manejador nb) o abrir un archivo de notebook existente, con
nb = mupad(nombre_archivo); Para copiar una variable en el espacio de trabajo de Matlab a un notebook de MuPad con el mismo nombre, se debe introducir, en la línea de comandos de Matlab:
setVar(notebook_manejador,variable) Por ejemplo, si nb es el manejador del notebook y z es la variable, se debe teclear
setVar(nb,z) Para asignar una expresión a una variable en un notebook de MuPad se debe introducir, en la línea de comandos de Matlab
setVar(notebook_manejador,'variable',expresión)
73
Dante Pinto Jeria Por ejemplo, si nb es el manejador del notebook , exp(x) - sin(x) es la expresión, y z es la variable, se introduce
syms x setVar(nb,'z',exp(x) - sin(x)) Para copiar una variable simbólica en un notebook de MuPad a una variable en el espacio de trabajo en Matlab, se debe introducir en la línea de comandos de Matlab
MATLABvar = getVar(notebook_manejador,'variable'); Por ejemplo, si nm es el manejador del notebook, z es la variable en el notebook de MuPad, y u es la variable en el espacio de trabajo de Matlab, se introduce.
u = getVar(nb,'z')
74
Dante Pinto Jeria
CAPÍTULO V PROGRAMACIÓN EN CÓDIGO M 5.1 INTRODUCCIÓN.El lenguaje de programación de Matlab se llama código M. Este lenguaje tiene las mismas estructuras básicas de programación de cualquier otro lenguaje, es decir, bucles y condicionales, entradas y salidas, manejo de funciones y procedimientos. Para entrar al entorno de programación se debe ir a File, New, Script
Otra forma es teclear en la línea de comandos del espacio de trabajo de Matlab, la palabra edit seguida del nombre que se le quiere asignar al programa. >>edit primero Luego aparece un mensaje que indica que el archivo no existe y pregunta si es que debemos crearlo, a lo que se responde que sí.
Inmediatamente aparece el entorno de programación
75
Dante Pinto Jeria
En el entorno de programación se introduce el código del programa, por ejemplo: disp('Hola Mundo Cruel');
Luego se guarda el programa. Para ejecutar se debe teclear, en el espacio de trabajo, el nombre del programa y luego ENTER. >> primero Hola Mundo Cruel >> Para introducir comentarios en el código del programa, se debe utilizar el símbolo % seguido del comentario. Todo lo que se encuentra en la misma línea que el símbolo % no se ejecuta, y aparece en color verde dentro del entorno de programación. Para editar un programa se debe teclear lo mismos que s hizo para crearlo, es decir, edit seguido del nombre del programa. Los operadores lógicos fundamentales son los siguientes: Nombre Símbolo Empleo And && a && b Or || a || b Not ~ ~a Xor xor a xor b
76
Dante Pinto Jeria
5.2 COMANDOS BÁSICOS DE PROGRAMACIÓN.Matlab tiene muy pocos comandos para la programación, y son casi los mismos que los utilizados en otros lenguajes de programación, como C/C++. 5.2.1 Comando input.Este comando pide la introducción de datos por parte del usuario. La sintaxis es: Resulado_evaluado = input(mensaje) Resultado_cadena = input(mensaje, 's')
Ejemplo5.1: >> a=input('Introduzca el valor de la hipotenusa: ') Introduzca el valor de la hipotenusa: 5 a= 5 Ejemplo5.2: Comprobar que el comando input permite evaluar una expresión. >> a=input('Introduzca el valor de la hipotenusa: ') Introduzca el valor de la hipotenusa: 8/9 a= 0.8889 Ejemplo5.3: >> respuesta = input('¿Quiere mas? S/N : ', 's'); ¿Quiere mas? S/N : s >> respuesta respuesta = s Ejemplo5.4: Utilizar un mensaje formateado mediante la función sprintf. >> a=2;b=4;c=input(sprintf('Introduzca el dato numero %i, para la matriz %i : ',a,b)) Introduzca el dato numero 2, para la matriz 4 : 9 c= 9 La función sprintf da formato a una cadena de texto, donde se encuentren los indicadores %i reemplaza el correspondiente valor, en este caso a y b. Esta función es muy similar a la 77
Dante Pinto Jeria función printf del lenguaje C. Los caracteres de conversión, que se pueden usar y que siguen después del símbolo %, son d, i, o, u, x, X, f, e, E, g, G, c, s.
5.2.2 Comando disp.Este comando permite la salida por pantalla de algún resultado. Si lo expuesto está almacenado en una variable, se muestra solo el contenido de la variable y no así el nombre de la variable. Ejemplo5.5: >> a=5;disp(a) 5
5.2.3 Comando if-end, if-else-end.Este es comando condicional, por excelencia. Su sintaxis es: if expresión, declaraciones, end if expresion1 declaraciones1 elseif expresion2 declaraciones2 else declaraciones3 end
Ejemplo5.6: Escribir un programa que indique si un año es bisiesto. Para esto se debe considerar lo siguiente: un año es bisiesto si es múltiplo de 4 excepto que también sea múltiplo de 100 y lo anterior queda descartado si también es múltiplo de 400. Así, por ejemplo el año 2000 es múltiplo de 4 por tanto en primera instancia decimos que es bisiesto, pero como también es múltiplo de 100 decimos que no es bisiesto, pero en definitiva al ver que es múltiplo de 400 concluimos que si es bisiesto. La tabla de verdad es la siguiente, donde a, b y c indican la multiplicidad respecto 4,100 y 400. a
b
c
(a^~b)v(a^c)
0
0
0
0
0
0
1
0
0
1
0
0
0
1
1
0
1
0
0
1
78
Dante Pinto Jeria 1
0
1
1
1
1
0
0
1
1
1
1
%_Programa bisiesto %_Dante Pinto Jeria, P-10-X-2010 n=input('Introduzca un año: '); a=mod(n,4);b=mod(n,100);c=mod(n,400); if (a && ~b) || (a && c) disp(sprintf('El año %i, NO es bisiesto',n)); else disp(sprintf('El año %i, ES bisiesto',n)); end
Este programa utiliza la función mod, que devuelve el residuo de la división de los dos argumentos, así por ejemplo: mod(5,2) da como resultado 1.
5.2.4 Comando for-end.Este comando realiza un bucle. La sintaxis es: for indice = valores declaraciones del programa : End
Ejemplo5.7: Mostrar números desde 1 hasta 0 en orden descendente, cada 0.1 >> for s = 1.0: -0.1: 0.0 disp(s) end 1 0.9000 0.8000 0.7000 0.6000 0.5000 0.4000 0.3000 0.2000 0.1000 0
79
Dante Pinto Jeria Ejemplo5.8: Realizar un programa que dibuje líneas entrecruzadas. Usar dos bucles for anidados. %_Programa figura, para dibujar líneas entrecruzadas %_Dante Pinto Jeria, P-6-X-2010 clc; alpha=input('Introduzca un numero de 3 a 30:'); if alpha30 alpha=15; end alpha=360/alpha; for i=0:alpha:360 for j=i:alpha:360 x1=cosd(i); y1=sind(i); x2=cosd(j); y2=sind(j); line([x1 x2],[y1 y2],'Color',[1,0,0]); end end axis equal;axis off;set(gcf,'Color',[1,1,1]);
La ejecución del programa con 25 puntos da como resultado:
80
Dante Pinto Jeria Ejemplo5.9: Realizar un programa que muestre una película con los cambios que se le hacen a una superficie en 3D. %_Programa peli, realiza una animación de los cambios que se hacen %_a una gráfica %_Dante Pinto Jeria %_P-11-10-2010 Z = peaks; surf(Z); axis tight set(gca,'nextplot','replacechildren'); % Graba la película for j = 1:20 surf(sin(2*pi*j/20)*Z,Z) F(j) = getframe; end % Reproduce la película 10 veces movie(F,10)
La ejecución de este programa produce:
5
0
-5
40 30
40 30
20 10
20 10
5
0
-5
40 30
40 30
20 10
20 10
81
Dante Pinto Jeria
Ejemplo5.10: Mostrar el uso de la función subplot. % Programa mosaigraf, para demostrar el uso de subplot %_P-13-X-2010 k=0; for n=1:3:10 n10=10*n; x=linspace(-2,2,n10); y=x./(1+x.^2); k=k+1; subplot(2,2,k) plot(x,y,'k') title(sprintf('Gráfico %g. Trazado con n = %g puntos.',k,n10)) xlabel('x') ylabel('y') axis([-2,2,-.8,.8]) grid pause(3); end
La ejecución de este programa da como resultado: Gráfico 2. Trazado con n = 40 puntos.
0.5
0.5
0
0
y
y
Gráfico 1. Trazado con n = 10 puntos.
-0.5 0 1 2 x Gráfico 3. Trazado con n = 70 puntos.
-1
0 1 2 x Gráfico 4. Trazado con n = 100 puntos.
0.5
0.5
0
0
-0.5 -2
82
-2
y
y
-2
-0.5 -1
-0.5 -1
0 x
1
2
-2
-1
0 x
1
2
Dante Pinto Jeria 5.2.5 Comando while-end.Este comando realiza las declaraciones del programa hasta que la cláusula –prueba sea falsa. Pero primero realiza la prueba, por tanto si la cláusula-prueba es falsa la cláusulabucle no se realiza ni una sola vez. Su sintaxis es: while claúsula_prueba declaraciones del programa : end
Ejemplo5.11: Realizar un programa que forme una matriz mágica impar. Las matrices mágicas son aquellas que suman el mismo número en filas, columnas y diagonales. Utilizar el algoritmo de Loubere. %_Programa para matriz mágica de números impares %_Dante Pinto Jeria, P-6-X-2010 clc; n=input('Introduzca el numero impar, del tamaño de la matriz: '); n = floor(real(double(n(1)))); if mod(n,2)==0 disp('EL NUMERO INTRODUCIDO NO ES IMPAR'); else M=rand(n)*0;c=1;I=n;J=ceil(n/2);M(I,J)=c; while cn && Jn && J>0 I=1; end if I> indicador= 'Bueno'; switch lower(indicador) case {'bueno','regular'} disp('Es aceptable') case 'malo' disp('Es malo') case 'excelente' disp('Es excelente') otherwise disp('No sé qué es lo que sea') end La función lower convierte un a cadena de texto a minúsculas. En contraposición existe la función upper, que convierte una cadena de texto a mayúsculas. La ejecución de este programa da como resultado: Es aceptable
5.2.7 Comando error.Este comando expone un mensaje y aborta una función. Su sintaxis es: error('msgIdent', 'msgString', v1, v2, ..., vN) error('msgString', v1, v2, ...) error('msgString') error(msgStruct)
5.3 USO DE FUNCIONES.84
Dante Pinto Jeria Las funciones son procedimientos que recogen datos de entrada, los procesan y devuelven un resultado. La estructura de una función es la siguiente: function [ argumentos_de_salida ] = Nombre_Funcion( argumentos_entrada ) declaraciones end
Las variables dentro de la función, son variables locales, es decir, solo tienen valides dentro de la función, fuera de ella no valen nada. Si es que se desearía que las variables tengan valor fuera de la función, se las debe declarar como variables globales en el entorno en el que se llama a la función. Para ello se utiliza el comando global seguido del nombre de la variable.
Ejemplo5.13: Escribir una función para que calcule si un año es o no bisiesto. Si es bisiesto devuelva un 1, caso contrario devuelva un 0. function salida = bisies(anio) a=mod(anio,4);b=mod(anio,100);c=mod(anio,400); if (a && ~b) || (a && c) salida=0; else salida=1; end end
Para ejecutar esta función, se la llama dándole un argumento. >> bisies(2010) ans = 0 Ejemplo5.14: Para el anterior ejemplo, definir la variable salida como global, para recuperar su valor. >> global salida;bisies(2012); >> salida salida = 1 Ejemplo5.15: Realizar una función que dados como datos el número de filas de una matriz y el índice relativo, devuelva la fila y la columna a la que pertenece ese índice.
85
Dante Pinto Jeria
Así en la anterior matriz si se le da como datos 2 (que es el número de filas y 10 (el índice) la función devolverá fila=2 y columna=5. function [f,c] = indice(m,I) c=1; while I>(c*m) c=c+1; end f=I-(c-1)*m; end
Para llamar a la función se debe utilizar la siguiente sintaxis. >> [f,c]=indice(2,10) f= 2 c= 5 Ejemplo5.16: Realizar una función que se llame bueno y permita la entrada de un valor y realice xvalor: si el número de entradas es menor que 4,3,2 asigne valores por omisión; si el llamado a la función se lo realiza de la forma bueno() dibuje la gráfica; si el llamado se lo realiza mediante la forma [x0,y0]=bueno() saque los valores. function [x0, y0] = bueno(valor,desde,hasta,cada) %_valores por omisión if nargin < 4, cada = .2; end if nargin < 3, hasta = 2; end if nargin < 2, desde = -2; end if nargin < 1 error('myApp:argChk', 'Número de argumentos equivocados') end x=desde:cada:hasta; y = x.^valor; if nargout == 0 %_si la entrada es bueno(), dibuja una gráfica plot(x, y) else %_si la entrada es [x0,y0]=bueno() da salida a los valores x0 = x; y0 = y; end end
Aquí se utilizan las variables nargin y nargout, que indican el número de entradas y salidas de la función respectivamente. 86
Dante Pinto Jeria La variable nargin indica con cuantos argumentos se llama a la función, así por ejemplo, si se llama bueno(2,3) nargin dará como resultado 2, bueno(1,1,2) dará como resultado 3. La variable nargout indica con cuantos argumentos se invoca la salida, así por ejemplo, [x0,y0]=bueno(1), dará como resultado 2; mientras que bueno(1) dará como resultado 0. Se añadió una línea en la que se interrumpe la función y se da un mensaje de error si el número de argumentos es menor que 1. Al ejecutar la función se obtiene: >> bueno(2) 4 3.5 3 2.5 2 1.5 1 0.5 0 -2
-1.5
-1
-0.5
0
0.5
1
1.5
2
>> [x0,y0]=bueno(2,-2,2,1) x0 = -2
-1
0
1
2
y0 = 4
1
0
1
4
87
Dante Pinto Jeria
CAPÍTULO VI USO DE LA INTERFAZ GRÁFICA DE USUARIO GUI 6.1 INTRODUCCIÓN.Matlab permite la creación de interfaces gráficas. De manera muy similar a lenguajes como Visual Basic, Visual C, etc. Par entrar al entorno de diseño de las GUI se pueden seguir cualquiera de los siguientes pasos: a) Ir a File, New y GUI.
b) Hacer clic en el ícono c) Escribir en el espacio de trabajo de Matlab: >>guide Después de cualquiera de los anteriores pasos, aparece:
Presionando OK, aparece la ventana de diseño.
88
Dante Pinto Jeria
La paleta de componentes es la siguiente:
Para configurar adecuadamente el entorno de diseño se utiliza el menú Preferences, que está en File.
89
Dante Pinto Jeria
En el cuadro de diálogo que aparece, se quita la marca del campo Add comments for newly generated callback functions, luego se presiona Apply y OK. Esto evita que en el entorno de programación de los GUI, se generen comentarios de manera automática. Estos comentarios muchas veces confunden y llenan toda la pantalla. Los componentes se arrastran de la paleta hacia el área de diseño. Haciendo clic en el componente y definiendo interactivamente el tamaño y la posición en el área de diseño mediante el ratón.
Haciendo clic con el botón derecho del ratón, sobre el componente, se despliega el cuadro de diálogo siguiente:
90
Dante Pinto Jeria El campo Property Inspector da salida al cuadro de diálogo de las propiedades del control.
Aquí se pueden realizar los cambios que se crean convenientes, como el color, el mensaje desplegado, etc.
91
Dante Pinto Jeria
Para cambiar el tamaño del texto, se utiliza el campo FontSize.
El nombre que se le asignará al componente, se cambia mediante el campo Tag.
También haciendo clic con el botón derecho del ratón sobre el componente se da acceso a View Callbacks.
Esto da acceso al entorno de programación. Si es la primera vez que se entra a los Callbakcs, se pedirá guardar la aplicación con algún nombre, luego muestra el entorno de programación correspondiente.
92
Dante Pinto Jeria
Debajo del la línea resaltada se puede añadir el código correspondiente, que estará asociado a este componente. Funcionamiento de la GUI. Un programa GUI tiene dos partes: un archivo .m y un archivo .fig. El archivo .m es el que contiene el código fuente y el .fig tiene la parte gráfica. Para ejecutar un programa GUI simplemente se teclea, en el espacio de trabajo de Matlab, el nombre del mismo. Así, por ejemplo, si se ha guardado con el nombre de prueba.fig, simplemente se escribe: >>prueba ENTER. Intercambio de datos entre los elementos de la parte gráfica y el código fuente. Los valores de las propiedades de los elementos (color, valor, posición, etc.) y los valores de las variables transitorias del programa se almacenan en una estructura, los cuales son accedidos mediante un único y mismo puntero para todos. handles.output = hObject;
handles, es el puntero a los datos de la aplicación. La definición de puntero es guardada con la instrucción: guidata(hObject, handles); Esta instrucción debe estar siempre al final de cualquier subrutina. Garantiza que cualquier cambio de propiedades y valores de variables quede almacenado.
Si, por ejemplo, dentro de una subrutina una operación dio como resultado una variable valor, para utilizar esta variable desde el programa o desde otra subrutina se la debe guardar de la siguiente manera: 93
Dante Pinto Jeria
handles.valor=valor; guidata(hObject,handles); La primera línea añade la variable valor a la estructura de datos de la aplicación apuntada por handles y la segunda línea guarda el valor.
Asignación y obtención de valores de los componentes. Se realiza mediante los comandos get y set. Así, por ejemplo, si se quiere que la variable numero recoja el valor de un editText se teclea lo siguiente: numero=get(handles.input1_editText,'String'); Para asignar el valor de la variable numero al statictext llamado text1, se escribe: set(handles.text1,'String',numero)
6.2 EJEMPLOS DE PROGRAMACIÓN.Ejemplo6.1: Crear una interfaz gráfica de usuario, que permita la entrada de una función de x y realice la integral simbólica de esa función. Primero se crea la interfaz gráfica con dos Static Text, un Edit Text y dos Push Button. Se cambian los colores y nombres mediante el Property Inspector, para que quede de la siguiente manera:
94
Dante Pinto Jeria
Luego se añade el código fuente mediante View Callbacks. function varargout = integra(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @integra_OpeningFcn, ... 'gui_OutputFcn', @integra_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT
% --- Executes just before integra is made visible. function integra_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles);
% --- Outputs from this function are returned to the command line. function varargout = integra_OutputFcn(hObject, eventdata, handles)
95
Dante Pinto Jeria varargout{1} = handles.output;
function calcular_Callback(hObject, eventdata, handles) global expresion; syms x; r=char(int(expresion,x)); set(handles.resultado,'String',r); guidata(hObject,handles); function entrada_Callback(hObject, eventdata, handles) global expresion; expresion=get(hObject,'String'); guidata(hObject,handles); function entrada_CreateFcn(hObject, eventdata, handles) % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end
function borrar_Callback(hObject, eventdata, handles) set(handles.entrada,'String',''); set(handles.resultado,'String','');
Lo que está resaltado con amarillo es el código que se añade, el resto es generado automáticamente por el programa. La ejecución de este programa da como resultado:
96
Dante Pinto Jeria
Ejemplo6.2: Realizar una GUI que simule el juego “craps” de lanzamiento de dos dados. Las reglas del juego son las siguientes: Un jugador gana si saca 7 u 11 en el primer lanzamiento de un par de dados, pierde si saca 2,3 ó 12 en el primer lanzamiento. Sin embargo, si en el primer lanzamiento saca un 4,5,6,8,9 ó 10 continúa tirando el dado hasta obtener el número que obtuvo en el primer lanzamiento o hasta obtener un 7. Si obtiene su primer número antes de obtener un 7, gana; en otro caso pierde. Calcular la probabilidad que el jugador gana en dos o menos lanzamientos. Lo primero es diseñar la interfaz gráfica, para ello se insertan en el área de diseño cuatro Static Text, dos Push Button. Y se cambian los colores y los textos como se muestra a continuación.
97
Dante Pinto Jeria
Luego, debajo del código generado automáticamente por el programa, se añade el código fuente asociado a cada uno de los Push Button, para ello usamos los View Callbacks function lanzar_Callback(hObject, eventdata, handles) global indi indi1 fin suma if indi1==1 a=fix(rand(1,1)*6)+1; b=fix(rand(1,1)*6)+1; c=num2str(a); set(handles.primero,'String',c); d=num2str(b); set(handles.segundo,'String',d); fin=0; set(handles.informe,'String',''); indi = indi+1; if indi==1 if a+b==2 || a+b==3 || a+b==12 set(handles.informe,'String','PERDISTE'); fin=1; indi1=0; end if a+b==7 || a+b==11 set(handles.informe,'String','GANASTE'); fin=1; indi1=0; end if fin == 0 suma=a+b;
98
Dante Pinto Jeria end else if a+b==7 set(handles.informe,'String','PERDISTE'); indi1=0; else if a+b==suma set(handles.informe,'String','GANASTE'); indi1=0; end end end end guidata(hObject,handles); function nuevo_Callback(hObject, eventdata, handles) global indi indi1 fin set(handles.informe,'String',''); set(handles.primero,'String',''); set(handles.segundo,'String',''); indi=0; fin=0; indi1=1;
6.3 CREACIÓN DE PROGRAMAS EJECUTABLES .EXE.Matlab permite la creación de programas con extensión .exe, estos programas pueden ejecutarse fuera del entorno de Matlab. Para esto se hace uso del comando mcc, desde la línea de comandos de Matlab. Por ejemplo, si se quiere que sea ejecutable el programa integra, se escribe:
El compilador genera los siguientes archivos:
Los códigos generados están en lenguaje C.
99
Dante Pinto Jeria
CAPÍTULO VII USO DE SIMULINK 7.1 INTRODUCCIÓN.Simulink es un programa añadido a Matlab. Sirve para programar visualmente un sistema dinámico (el cual está gobernado por ecuaciones diferenciales) y observar los resultados. Simulink está conformado por bibliotecas de bloques de construcción, estos bloques se conectan unos con otros a través de líneas, las cuales transmiten la información. Simulink, es en esencia un tipo de lenguaje orientado a bloques. La principal ventaja es la disponibilidad de plantillas de construcción de bloques, las cuales evitan la necesidad de escribir código para pequeños procesos matemáticos. Para entrar al entorno de Simulink se pueden realizar cualquiera de los siguientes pasos: Hacer clic en el ícono . Desde el menú Start, Simulink y Library Browser. Teclear en la ventana de comandos de Matlab: >>simulink Después, de cualquiera de los pasos anteriores, aparece la siguiente ventana:
Para abrir un nuevo archivo se debe ir a File, New y Model
Con lo que aparece la ventana de diseño: 100
Dante Pinto Jeria
Ahora se pueden arrastrar los íconos desde el catálogo de la biblioteca de Simulink (Simulink Library Browser) hacia la ventana de diseño. Ejemplo7.1: Representar una función seno y la integración de la función seno, al mismo tiempo. Para esto se necesita extraer la función seno (Sine Wave), que se encuentra en Sources, luego la función integrador (Integrator) que se encuentra en Continuos; luego un Mux y un Osciloscopio, que se encuentran en Commonly Used Blocks.
Se arrastran estos bloques a la ventana de diseño y luego se conectan con líneas. Una manera rápida de conectar bloques es marcar el bloque de partida y luego presionando la tecla control hacer clic con el botón izquierdo en el bloque destino.
10 1
Dante Pinto Jeria
Luego se guarda este pequeño modelo, con algún nombre, en este caso IntegradorBasico. Y se hace correr la simulación, haciendo clic en el botón , de la ventana de diseño. Haciendo doble clic en el ícono del osciloscopio, en la ventana de diseño
Aparece a continuación la gráfica correspondiente.
La línea morada es el seno y la línea amarilla el coseno. Si se quiere un autoescalado se debe presionar el ícono
102
.
Dante Pinto Jeria
Como se puede apreciar, el coseno está desplazado hacia arriba en una unidad. Para corregir esto se debe hacer doble clic en el ícono del integrador en la ventana de diseño.
Para abrir las propiedades del integrador.
Aquí se debe cambiar el campo Initial condition, y cambiarlo de cero a -1, para desplazar hacia abajo el resultado. Luego presionar Apply y OK. Haciendo correr de nuevo el simulador y presionando la autoescala, nuevamente, resulta:
10 3
Dante Pinto Jeria
Si se quiere ver en pantalla completa se debe presionar el ícono , de la ventana del osciloscopio, con lo que aparece en la ventana de comandos de Matlab:
Para anular esta pantalla completa, se vuelve a presionar
7.2 DISEÑO DE CONTROLADORES PID CON SIMULINK.Ejemplo7.2: Gobierno de un brazo robótico mediante controladores PID Se puede utilizar los controladores PID para gobernar (controlar) brazos robóticos como el mostrado en la figura
104
Dante Pinto Jeria
Una pelota es puesta sobre una viga y puede rodar a través de ella. El brazo robótico hace que la viga suba o baje un ángulo α. El brazo está unido a un mecanismo circular que puede rotar un ángulo θ. Cuando se va cambiando el ángulo α, la gravedad ocasiona que la pelota vaya rodando por la viga. Por tanto se necesita diseñar un controlador que regule la posición de la pelota, de manera que esta no se salga de la viga. Para esta aplicación se asume que la pelota rueda sin deslizamiento y que la fricción entre la viga y la pelota es despreciable. Las constantes y variables para este ejemplo están definidas como sigue: M Masa de la pelota 0.11 kg R Radio de la pelota 0.015 m d Longitud de descentrado 0.03 m g Aceleración de la grav. 9.8 m/s^2 L Longitud de la viga 1.0 m J Momento de inercia de la pelota 9.99e-6 kgm^2 r Posición de la pelota
La ecuación Lagrangiana del movimiento de la pelota, está dada por
10 5
Dante Pinto Jeria
Linealizando esta ecuación en relación con el ángulo de la viga, alpha = 0, da la siguiente aproximación lineal del sistema.
La ecuación que relaciona el ángulo de la viga, con el ángulo del brazo es aproximada por:
Reemplazando en la ecuación previa, se tiene:
Sacando la transformada de Laplace a ambos miembros de la ecuación(tomando como cero loa parámetros iniciales):
Reagrupando, se halla la función de transferencia del ángulo θ(s) del brazo a la posición de la pelota R(s).
En el espacio de estados, el sistema de ecuaciones linealizado se representa por:
106
Dante Pinto Jeria
Pero si es que se quiere controlar el ángulo α, se debe utilizar:
La representación en Matlab es la siguiente: a) Función de transferencia m R g L d J
= = = = = =
0.111; 0.015; -9.8; 1.0; 0.03; 9.99e-6;
K = (m*g*d)/(L*(J/R^2+m)); num = [-K]; den = [1 0 0]; printsys(num,den)
10 7
Dante Pinto Jeria La salida debe ser: num/den = 0.21 ---------s^2
Para una entrada paso de 0.25 m, la respuesta de la pelota es: step(0.25*num,den)
De esta gráfica se ve claramente que el sistema es inestable en lazo abierto, causando que la pelota ruede fuera de la viga. Por tanto se requiere de algún método para controlar la posición de la pelota.
b) En el espacio de estados. Las entradas para el espacio de estados son las siguientes: m R g J
= = = =
0.111; 0.015; -9.8; 9.99e-6;
H = -m*g/(J/(R^2)+m); A=[0 1 0 0 0 0 H 0 0 0 0 1
108
Dante Pinto Jeria 0 0 0 0]; B=[0;0;0;1]; C=[1 0 0 0]; D=[0];
La respuesta a una entrada paso de 0.25m puede ser vista mediante: step(A,B*.25,C,D)
Como en la gráfica de la función de transferencia, esta gráfica muestra que el sistema es inestable y que la pelota rodará fuera de la viga. Uso de controladores PID para solucionar la estabilidad del sistema. El diagrama de bloques para este ejemplo se muestra en la siguiente figura.
La función de transferencia para un controlador PID continuo es:
La salida es la suma de las acciones proporcional, integral, y derivativa, ponderadas de acuerdo a los parámetros independientes de ganancias P, I, y D. El coeficiente N ubica la localización del polo en el filtro derivativo. 10 9
Dante Pinto Jeria Para el modelado en Simulink se introducen los siguientes componentes en la ventana de diseño: una función paso (se encuentra en Sources), una ganancia (se encuentra en Commonly Used Blocks), un sumador (se encuentra en Commonly Used Blocks), un PID (se encuenttra en Continuous), una función de transferencia (se encuentra en Continuous), un creador de buses (se encuentra en Commonly Used Blocks), un osciloscopio (se encuentra en Sinks). Para modificar las propiedades de los bloques, se hace doble clic en el bloque y en la ventana que aparece se hacen los cambios deseados.
Se modificaron las propiedades de la ganancia, Gain=0.25 :
110
Dante Pinto Jeria Se cambiaron las propiedades de la función de transferencia, en los campos Numerator coefficients y Denominator coefficients.
Se modificó el sumador, para que los signos sean + - (mas y menos) en el campo List of signs
También se modificó el bus, para que tenga tres entradas, en el campo Number of inputs
11 1
Dante Pinto Jeria
Realizando la simulación, se observa:
La gráfica amarilla es la función paso, la celeste es la gráfica de la función de transferencia y la morada es la función de transferencia mas el controlador PID. Como se puede apreciar está totalmente inestable. Por lo tanto se debe calibrar el controlado PID. Para ello se hace doble clic en el bloque PID y aparece la ventana de propiedades del bloque PID.
112
Dante Pinto Jeria
Los parámetros por omisión son: P=1; I=1; D=0. Para el sintonizado del PID se presiona Tune, y aparece, después de un momento de cálculos
Aquí aparece el sistema ya estable, pero con un tiempo de 2 segundos, si es que nos parece muy grande, lo modificamos con la barra deslizable. En este caso lo modificamos para un segundo.
11 3
Dante Pinto Jeria
Y luego se presiona Apply y OK.
Después de hacer correr nuevamente el simulador. Se observa que se ha alcanzado la estabilidad. La gráfica de color morado muestra la función controlada por el PID.
114
Dante Pinto Jeria
Si es que se quiere sacar los resultados al espacio de trabajo de Matlab, se debe añadir en la ventana de diseño de Simulink, un bloque que saque datos al workspace . Ese bloque es To workspace y se encuentra en Sinks.
Se le cambió el nombre, haciendo doble clic en el bloque.
11 5
Dante Pinto Jeria
Después de hacer correr el simulador, en el espacio de trabajo de Matlab se teclea: >> plot(tout,salida.signals.values);grid on 0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0
0.5
1
1.5
2
2.5
3
3.5
4
4.5
5
La variable dependiente es una estructura, para acceder a los valores se pone: salida.signals.values La variable independiente se encuentra almacenada en tout.
116
View more...
Comments