Funciones definidas por el usuario El usuario pude agregar nuevas funciones al vocabulario de la MATLAB MATLAB, expresadas en términos de las funciones existentes. Los comandos existentes y las funciones que componen la nueva función de residir en un archivo de texto llamado M-file ((*.m) m) Los m-archivos pueden ser una secuencias de comandos (scripts) o funciones. Los scripts son simplemente los archivos que contienen una secuencia de instrucciones de MATLAB. Las funciones hacen uso de sus propias variables locales y aceptan argumentos de entrada. El nombre de un archivo-m debe comenzar con un carácter alfabético (a,b,..) y tiene una extensión de archivo *.m. El m-nombre de archivo, menos su extensión, es lo que MATLAB busca cuando intenta utilizar la secuencia o función. Ejemplo: g ; b12_g g.m;; archivo de calculo.m Nombre valido: algo123.m; Nombre no valido: 12nombre.m; ?123.m; 3d45+23.m; a+3-2.m SCRIPTS Un script es una secuencia de instrucciones que Matlab guardada en un archivo con extensión .m Un SCRIPT no aceptan entrada de argumentos ni salida de argumentos El Script, p , almacena las variables en el workspace p y estas pueden p ser utilizadas por otros scripts y/o la línea de comandos de MATLAB Existen dos formas de crear un Script 1. Desde la ventana de historia de comandos (esto se realiza una vez que se tenga t una serie i de d iinstrucciones t i o sentencias t i d desarrolladas ll d en lla ventana de comandos) 2.- Desde el editor de textos de MATLAB. Sin embargo, también se puede utilizar un editor de texto. Desde la ventana de historia de comandos Se seleccionan la líneas (sentencias) (sentencias), que deberá contener el script Se da clic con el botón derecho del ratón, y se selecciona crear M-file Se abre el editor, y se puede modificar y guardar con un nombre b adecuado d d a llas sentencias que se ejecutan Desde el editor de textos de MATLAB Para crear o editar un archivo-m Seleccionar : File File>New >New o File>Open File>Open Editor Matlab Área de trabajo El editor proporciona una interfaz gráfica de usuario para la edición de texto, así como para la depuración del M-archivo Ejercicio Crear un script, que resuelva la siguiente función log( ax bx c) sin( ax bx c) f 2 2 4x cos(( x 2) * (ax bx c) 2 2 Obtener los valores para a). ) x=9, a=1, b=3 y c=5 b). x=12, a=1, b=3 y c=5 c). x=9, a=7, b=3 y c=8 Modificar el script, (tomando de base el anterior), de tal forma que las variables de evaluación l ió estén é contenidos id en una matriz, i es d decir: i A A=[x,a,b,c]; [ b ] Ejercicio 2 Crear un script, que resuelva la practica 2. Ejemplo de un script Vamos a introducir en un script la secuencia de comandos que produzca la gráfica de la función sen x - cos(sqrt(2)x). Creando el archivo desde el editor de texto: x=-2 x= 2*pi: pi:.1:2 1:2*pi; pi; y=sin(x)-cos(sqrt(2)*x); plot(x,y,'r','linewidth',2) axis tight grid on xlabel('eje xlabel( eje x') x) ylabel('eje y') title('Grafica de y=sin(x)-cos(sqrt(2)*x)','FontSize',14) Crearla desde la ventana de comandos Ejemplo de un script Preparar un script solucion.m que resuelva el siguiente sistema de ecuaciones: 5x + 2ry + rz = 2 3x + 6y + (2r - 1)z = 3 2x + (r - 1)y + 3rz = 5 para un valor arbitrario del parámetro r que introduciremos antes de ejecutar el programa, de d esta t forma: f >> r=10; >> solucion Características generales de las funciones de MATLAB El concepto de función en MATLAB es semejante al de C y al de otros lenguajes de programación, aunque con algunas diferencias importantes. Al igual que en C, una función tiene nombre, valor de retorno y argumentos. function (y,w) = fact(x,z) output argument input argument function name Una función se llama utilizando su nombre en una expresión o utilizándolo como un comando más. Las funciones se definen en ficheros de texto *.m en la forma q que se verá más adelante. Los valores de retorno son el resultado de la función y sustituyen a ésta en la expresión p donde la función aparece p Los argumentos de cada función van a continuación del nombre entre paréntesis (y separados por comas si hay más de uno).. En MATLAB las funciones pueden tener valores de retorno matriciales múltiples; los valores de retorno se recogen entre corchetes, separados por comas Características generales de las funciones de MATLAB Una característica de MATLAB es que las funciones que no tienen argumentos no llevan paréntesis Los nombres de las funciones de MATLAB no son palabras reservadas del lenguaje Es posible crear una variable llamada sin o cos cos,, que ocultan las funciones correspondientes.. correspondientes Para poder acceder a las funciones hay que eliminar (clear clear)) las variables del mismo nombre que las ocultan, o bien haber definido previamente una referencia a función (function handle handle)). MATLAB permite que una función tenga un número de argumentos de entrada y valores de retorno retorno, variables; determinado sólo en tiempo de ejecución. Sintaxis general de una función function (y,w) (y w) = fact(x,z) fact(x z) output arg ment argument input argument function name Cuando se crea un archivo .m, que se utilizara como función, en la primera línea debe llevar siempre el nombre de la función, la sintaxis de la primer línea es function [out1, out2, ...] = funname(in1, funname(in1, in2, ...) Ejemplo: function c = poly(x) Sintaxis % %POLY Convert roots to polynomial. % POLY(A), when A is an N by N matrix, is a row vector with Comentarios % N+1 elements which are the coefficients of the % characteristic polynomial, DET(lambda*EYE(SIZE(A)) - A) . de Ayuda % [m,n] = size(x); if m == n Operaciones Subfunciones Las variables contenidas en el cuerpo de la función son variables locales locales. Dentro del mismo archivo se puede crear una subfunción. subfunción. La creación de una subfunción es definiendo una nueva función, función utilizando al sintaxis de creación creación.. Se S genera dentro d t del d l cuerpo de d la l función f ió o subfunción. subfunción bf ió . Las salidas de las subfunciones no son visibles solo son utilizadas dentro de la función función.. Ejemplo: Crear el siguiente archivo solu.m y ejecutarla para diferentes valores de xx. function [mean,stdev] mean,stdev] = stat(x) stat(x) Función n = length length(x); (x); principal mean = avg( avg(x,n); x,n); stdev = sqrt( sqrt(sum((x sum((x--avg( avg(x,n x,n)).^2)/n); )).^2)/n); function mean = avg avg((x,n) x,n) mean = sum sum(x)/n; (x)/n; Subfunción RESOLUCIÓN DE ECUACIONES NO LINEALES LINEALES Ejemplo: El factor de fricción f para los fluidos turbulentos en una tubería está dado por: llamada correlación de Colebrook, donde Re es el número de Reynolds, e es la rugosidad de la superficie de la tubería y D es el diámetro de la tubería Resolver la ecuación para f, tubería. f creando un archivo de función utilizando el método de punto fijo para los siguientes casos: (a) D = 0.1m, 0 1m e = 0.0025m, 0 0025m Re = 3 × 104 (b) D = 0.1m, e = 0.0005m, Re = 5 × 106 Solución: Para resolver el problema empleando el método de punto fijo se debe llevar la ecuación a la forma: Sugerencia: Realizar el siguiente cambio Solución Realizar el cambio La ecuación resulta E t Entonces l función la f ió de d iteración it ió del d l punto t fijo fij es es: Se resuelve la función de iteración de p punto fijo, j , dando valores a x hasta que x~~g(x) Considerar el intervalo de x[1,2] x[1 2] Solución function [sol,f]=pfijo(x,e,D,Re) % resuelve la ecuación de correlación de Colebrook %por el método de punto fijo g=1.14-2*log10(e/D+((9.35/Re)*x)); s=[x' [ g']; g ]; sol=s; f=1./sqrt(g); f=f ; f=f'; RESOLUCIÓN DE ECUACIONES NO LINEALES De manera más fácil podemos utilizar las rutinas internas de MATLAB, que encuentran raíces de ecuaciones no lineales. Algunas de estas son: fzero(fun,x0): fzero(fun x0): Encuentra una raíz de la función f (x) = fun, fun que debe ser definida antes o allí mismo con la instrucción inline. Esta instrucción busca un cero de f un cerca del punto x0 especificado por el usuario, y se basa en los métodos de la secante secante, bisección e interpolación ccuadrática adrática in inversa, ersa por lo que la función ingresada debe ser continua. Por ejemplo: >> x=fzero(inline(’0.5*exp(x/3)-sin(x)’),0) >> x = 6.7721e-001. >> x=fzero(inline('1.14-2*log10(0.025+3.1167e-4*x)'),0) x fzero(inline( 1.14 2 log10(0.025 3.1167e 4 x) ),0) Exiting fzero: aborting search for an interval containing a sign change because complex function value encountered during search. (Function value at -81.92 is 7.6882-2.7288i.) Ch k ffunction Check ti or ttry again i with ith a different diff t starting t ti value. l x= NaN RESOLUCIÓN DE ECUACIONES NO LINEALES LINEALES • roots(p): Encuentra todas las raíces de un polinomio p, tanto reales como complejas. l j P Para usarla l es necesario i ttener en cuenta t que en MATLAB, MATLAB un polinomio se representa por medio de un vector de coeficientes. Por ejemplo, para calcular todas las raíces del polinomio P (x) = x5 + 3x3 − 2x + 1, Se debe digitar la instrucción: >> rr=roots([1 roots([1 0 3 0 -2 2 1]) r= -3.3865e-002 3 3865e 002 +1.8892e+000i +1 8892e+000i -3.3865e-002 -1.8892e+000i -9.0261e-001 4 8517e-001 4.8517e 001 +2.7374e +2 7374e-001i 001i 4.8517e-001 -2.7374e-001i (donde el vector [1 0 3 0 -2 1] representa los coeficientes del polinomio P). con la cual obtenemos: Como vemos coincide con lo que esperábamos: Las raíces complejas siempre vienen por pares conjugados y hay al menos una raíz real. RESOLUCIÓN DE ECUACIONES NO LINEALES LINEALES En general para un polinomio de orden n esto es: Pn(x) = anxn + an-1xn -1+ …+ a3x3 + a2x2+ a1x1 + a0 , El vector de coeficientes del polinomio es: A [an ,a A=[a an-1,…,a a3 ,a a2 ,a1 ,a a0]; ] La aplicación de la función roots es: x=roots(an ,an-1,…,a3 ,a2 ,a1 ,a0); o x=roots(A); ( ); Con los datos del ejemplo anterior: >>a=[1 0 3 0 -2 1]; >>r=roots(a) ; Funciones para cálculos con polinomios l (A) poly(A) roots(pol) p y (p ) polyval(pol,x) li i característico í i d i A polinomio de lla matriz raíces del polinomio pol evaluación del p polinomio p pol p para el valor de x. Si x es un vector, pol se evalúa para cada elemento de x polyvalm(pol,A) evaluación del polinomio pol de la matriz A conv(p1 p2) conv(p1,p2) producto de convolución de dos polinomios p1 y p2 [c,r]=deconv(p,q) división del polinomio p por el polinomio q. En c se devuelve el cociente y en r el resto de la división residue(p1 p2) descompone el cociente entre p1 y p2 en suma de fracciones residue(p1,p2) simples (ver >>help residue) polyder(pol) calcula la derivada de un polinomio polyder(p1,p2) calcula la derivada de producto de polinomios polyfit(x,y,n) calcula los coeficientes de un polinomio p(x) de grado n que se ajusta a los datos p(x(i)) ~= y(i), interp1(xp,yp,x) calcula el valor interpolado para la abscisa x a partir de un conjunto de puntos dado por los vectores xp e yp. interp1(xp,yp,x,'m') interp1(xp,yp,x, m ) como la anterior, pero permitiendo especificar también el método de interpolación. La cadena de caracteres m admite los valores 'nearest', 'linear', 'spline', 'pchip', 'cubic' y 'v5cubic'. FUNCIONES DE FACTORIZACIÓN Y/O DESCOMPOSICIÓN MATRICIAL Normas de matrices: norm(A) normest(A) norma 2, es decir, máximo valor singular de A, max(svd(A)). norma-2, calcula una estimación o aproximación de la norma-2. Útil para matrices grandes en las que norm(A) necesita demasiado tiempo norm(A 2) norm(A,2) lo mismo que norm(A). norm(A) norm(A,1) norma-1 de A, máxima suma de valores absolutos por columnas, es decir: max(sum(abs((A)))). norm(A,inf) (A i f) norma-∞ de d A, A máxima á i suma d de valores l absolutos b l t por fil filas, es decir: max(sum(abs((A')))). Normas de vectores: norm(x,p) norma-p, es decir sum(abs(x)^p)^(1/p). norm(x) norma-2 ó norma euclídea; equivale al módulo o norm(x,2). norm(x inf) norm(x,inf) norma-∞, es decir max(abs(x)). norma max(abs(x)) norm(x,1) norma-1, es decir sum(abs(x)). Ejemplo de algunas funciones para cálculos con polinomios Para MATLAB un polinomio se puede definir mediante un vector de coeficientes. •Por ejemplo, ejemplo x4− 8 x2 + 6x − 10 = 0 Se puede representar mediante el vector [1, 0, -8, 6, -10]. MATLAB puede realizar diversas operaciones sobre él, como por ejemplo evaluarlo para un determinado valor de x (función polyval()) y calcular las raíces (función roots()) Evaluación del polinomio Raíces de la ecuación >> polyval(pol,1) ans = >> pol=[1 0 -8 6 -10]; -11 >> roots(pol); >> polyval(pol,0) ans = ans = -3.2800 -10 2.6748 >> polyval(pol,[0 polyval(pol [0 1 5]) 0.3026 + 1.0238i ans = 0.3026 - 1.0238i -10 -11 445 Ejemplo de algunas funciones para cálculos con polinomios Derivadas de polinomios utilizando la función polyder(pol) Por ejemplo, calcular la derivada de x4− 8 x2 + 6x − 10 = 0 Vector del polinomio >> pol=[1 0 -8 6 -10]; >> polyder(pol) ans = 4 0 -16 6 Calculo de la derivada de un producto de polinomios Por ejemplo, calcular la derivada de (3x2 + 6x +9)(x2 + 2x) Declaración de Vectores >> a = [3 6 9]; b = [1 2 0]; >> p=conv(a,b); p = 3 12 21 >>polyder(p); 12 42 18 >>polyder(a,b); 36 12 36 42 18 0 Producto de Vectores del polinomio V t d Vector de la l derivada d i d 18 Vector de la derivada Ejemplo de algunas funciones para cálculos con polinomios calculo los coeficientes de un polinomio p(x) de grado n que se ajusta a los datos p(x(i)) ~= y(i), polyfit(x,y,n) Por ejemplo, ajustar la función de error, erf (x), por un polinomio en x. Este es un proyecto arriesgado porque erf (x) es una función acotada, mientras que los polinomios son ilimitados, por lo que el ajuste podría no ser muy buena. En primer lugar generar un vector de x puntos, igualmente espaciados en el intervalo [0, 2.5], después evaluar erf (x) en estos puntos. >>x = (0: 0.1: 2.5)'; >>y = erf(x); Calcular los coeficientes del polinomio de aproximación de grado 6 6, utilizando la función polifit 0.0084 x6 -0.0983x5+ 0.4217x4 -0.7435x3 +0.1471x2 + >>p p=p polyfit(x,y,6) y ( y ) 1 1064 x + 0.0004=0 1.1064 0 0004=0 p= 0.0084 -0.0983 0.4217 -0.7435 0.1471 1.1064 0.0004 Evaluar los valores de x en el polinomio >> f = polyval(p,x); Obtener una tabla que muestra los datos, el ajuste, y el error >>tabla = [x, y, f ,y-f] tabla = 0 0.1000 0 2000 0.2000 0.3000 0.4000 0 5000 0.5000 0 0.1125 0 0.2227 2227 0.3286 0.4284 0 0.5205 5205 0.0004 0.1119 0 0.2223 2223 0.3287 0.4288 0 0.5209 5209 Gráficamente el resultado es:. >> x = (0: 0.1: 5)'; >>y = erf(x); >>f = polyval(p,x); polyval(p x); >>plot(x,y,'o',x,f,'-') >>axis([0 5 0 2]) -0.0004 0.0006 0 0.0004 0004 -0.0001 -0.0004 -0 0.0004 0004 2 15 1.5 1 0.5 0 0 1 2 3 4 5 Ejemplo de interpolación Interp1 Sintaxis yi = interp1(x,Y,xi) i t 1(Y i) yii = interp1(Y,xi) yi = interp1(x,Y,xi,method) yi = interp1(x,Y,xi,method,'extrap') yi = interp1(x interp1(x,Y,xi,method,extrapval) Y xi method extrapval) pp = interp1(x,Y,method,'pp') interp1(xp,yp,x) calcula el valor interpolado para la abscisa x a partir de un conjunto de puntos dado por los vectores xp e yp. interp1(xp,yp,x,'m') como la anterior, pero permitiendo especificar también el método de p La cadena de caracteres m interpolación. admite los valores 'nearest', 'linear', 'spline', 'pchip', 'cubic' y 'v5cubic'. Por ejemplo: Considerar dos vectores que representan el censo de los años 1900 a 1990 y la correspondiente población de Estados Unidos en millones de personas. t = 1900:10:1990; p = [75.995 91.972 105.711 123.203 131.669 150.697 179.323 203.212 226.505 249.633]; Utilizar la función interp1, para interpolar entre los datos del censo, para estimar la población en 1975 >> interp1(t,p,1975) ans = 214.8585 >>interp1(t,p,1975,'cubic') ans = 214.9056 >>interp1(t,p,1995,'cubic','extrap') ans = 261.1350 RESOLUCIÓN DE SISTEMAS DE ECUACIONES LINEALES En esta p parte se p presenta como usar MATLAB p para resolver sistemas de ecuaciones lineales. Al igual que en la sección anterior se utilizan tanto funciones internas de MATLAB como funciones propias creadas por el usuario. Pero además se p puede usar una combinación de los dos p procedimientos. Comencemos con las fáciles y sencillas funciones internas de MATLAB: Para resolver un sistema de ecuaciones lineales utilizando Matlab, lo primero que se debe hacer es escribirlo en la forma matricial Ax = b. Por ejemplo consideremos el siguiente sistema de ecuaciones: La forma matricial Ax = b es: OPERADORES PARA LA RESOLUCIÓN DE SISTEMAS DE ECUACIONES LINEALES MATLAB utiliza tili l los operadores d d división de di i ió para la l resolución l ió de d sistemas i t d de ecuaciones lineales. Por su gran importancia, estos operadores requieren una explicación Considérese el siguiente sistema de ecuaciones lineales, Ax = b donde x y b son vectores columna, y A una matriz cuadrada invertible. La resolución de este sistema de ecuaciones se puede escribir en las 2 formas siguientes (¡Atención a la 2a forma, basada en la barra invertida (\), que puede resultar un poco extraña!): x = inv(A)*b x = A\b Así pues, el operador división-izquierda por una matriz (barra invertida \) equivale a pre-multiplicar por la inversa de esa matriz OPERADORES PARA LA RESOLUCIÓN DE SISTEMAS DE ECUACIONES LINEALES Por ejemplo, considérese el siguiente ejemplo de matriz (1×2) que conduce a un sistema de infinitas soluciones >> A=[1 2], b=[2] A= 12 b= 2 >> x=A\b 5x y z 5 x 4y z 4 x y 3z 3 x= 0 1 A=[1 [ 2;; 1 0;; 0 1], ], b=[2 [ 0 0]' ] x=A\b, resto=A*x-b x= 0.3333 0.6667 A=[5 A [5 1 1; 1 1 4 1; 1 1 1 3] 3], b=[5 4 3]’ x=A\b, x A\b, resto resto=A*x-b Axb matriz de coeficientes Singular Una matriz cuadrada A es singular si no tiene columnas linealmente independientes. Si A es singular, la solución de Ax = B, o bien no existe, o no es única. El operador barra invertida, A\B, emite una advertencia si A es casi singular y plantea l t una condición di ió de d error sii detecta d t t singularidad i l id d exacta. t Si A es singular y Ax Ax= b tiene una solución, entonces se puede encontrar una solución particular que no es única, escribiendo P = pinv(A)*b pinv(A)*b PINV Pseudoinverse. X = PINV(A) produces a matrix t i X off the th same dimensions di i as A' so th thatt A*X*A = A, X*A*X = X and A*X and X*A are Hermitian P es la matriz seudoinversa de A. Si Ax = b no tiene una solución exacta, pinv (A) devuelve una solución de mínimos cuadrados. OTROS TIPOS DE DATOS DE MATLAB p j Se ha visto la “especialidad” de MATLAB: trabajar con vectores y matrices. MATLAB puede d también t bié trabajar t b j con otros t ti tipos d datos: de d t 1. Conjuntos o cadenas de caracteres, 1 caracteres fundamentales en cualquier lenguaje de programación. 2. Hipermatrices, o matrices de más de dos dimensiones. 3. Estructuras, o agrupaciones 4. Vectores o matrices de celdas (cell arrays), que son vectores o matrices cuyos elementos pueden ser cualquier otro tipo de dato. dato 5. Matrices dispersas, que son matrices que pueden ser de muy gran tamaño con la mayor parte de sus elementos cero Cadenas de caracteres MATLAB trabaja también con cadenas de caracteres, con ciertas semejanzas y diferencias respecto a C/C++ y Java A continuación se pueden ver algunos ejemplos y practicar con ellos: >> c='cadena' c= cadena >> size(c) % dimensiones del array ans = 16 >> double(c) % convierte en números ASCII cada carácter ans = 99 97 100 101 110 97 >> char(abs(c)) % convierte números ASCII en caracteres ans = cadena >> cc=char('más','madera') % convierte dos cadenas en una matriz cc = más madera >> size(cc) % se han añadido tres espacios a 'más' Funciones más importantes para manejo de cadenas de caracteres double(c) char(v) char(c1,c2) convierte en números ASCII cada carácter convierte un vector de números v en una cadena de caracteres crea una matriz de caracteres, completando con blancos las cadenas más cortas deblank(c) elimina los blancos al final de una cadena de caracteres disp(c) imprime el texto contenido en la variable c ischar(c) detecta si una variable es una cadena de caracteres isletter() detecta si un carácter es una letra del alfabeto. isspace() detecta si un carácter es un espacio en blanco. strcmp(c1 c2) strcmp(c1,c2) comparación de cadenas cadenas. Si las cadenas son iguales devuelve un uno, uno y si no lo son, devuelve un cero strcmpi(c1,c2) igual que strcmp(c1,c2), pero ignorando la diferencia entre mayúsculas y minúsculas strncmp(c1,c2,n) compara los n primeros caracteres de dos cadenas c1==c2 compara dos cadenas carácter a carácter. Devuelve un vector o matriz de unos y ceros int2str(v) convierte un número entero en cadena de caracteres num2str(x,n) convierte un número real x en su expresión por medio de una cadena de caracteres, con cuatro cifras decimales por defecto (pueden especificarse f más á cifras, f con un argumento opcional n)) str2double(str) convierte una cadena de caracteres representando un número real en el número real correspondiente Ejemplos >> num2str(pi) % el resultado es una cadena de caracteres, no un número ans = 3.142 >> ans =num2str(pi,8) =num2str(pi 8) 3.1415927 Es habitual convertir los valores numéricos en cadenas de caracteres para poder imprimirlos como títulos en los dibujos o gráficos. Véase el siguiente ejemplo: >> fahr =70; grd=(fahr-32)/1.8; >> title([ title(['Temperatura Temperatura ambiente: ',num2str(grd),' grados centígrados']) >> st1=strcat(‘C:\Documents t1 t t(‘C \D t and d Settings\personal\Mis documentos\ '); Hipermatrices (arrays de más de dos dimensiones) MATLAB permite trabajar con hipermatrices, es decir con matrices de más de dos dimensiones Las funciones que operan con matrices de más de dos dimensiones son análogas a las funciones vistas previamente, aunque con algunas diferencias. Por ejemplo, las siguientes sentencias generan, en dos pasos, una matriz de 2×3×2: >> AA(:,:,1)=[1 AA(: : 1)=[1 2 3; 4 5 6] >>AA = 123 456 >> AA(:,:,2)=[2 3 4; 5 6 7] >>AA(:,:,1) (,, )= 123 456 >>AA(:,:,2) >>AA(: : 2) = 234 567 FUNCIONES QUE TRABAJAN CON HIPERMATRICES Algunas funciones de MATLAB para generar matrices admiten más de dos g p g subíndices y pueden ser utilizadas para generar hipermatrices. Entre ellas están rand(), rand() randn(), randn() zeros() y ones() >> BB BB= =randn(2,3,2) randn(2,3,2) BB(: BB(:,:,1) BB (: : 1) = (:,:,1) -0.4326 0.1253 -1.1465 -1.6656 0.2877 1.1909 BB(:,:,2) BB (:,:,2) = 1.1892 0.3273 -0.1867 -0.0376 0.1746 0.7258 La función cat cat() () permite concatenar matrices según las distintas “dimensiones”: >> A= A=zeros zeros(2,3); (2,3); B= B=ones ones(2,3); (2,3); >> cat(1,A,B) >> cat(2,A,B) cat(2 A B) >> cat(3,A,B) FUNCIONES QUE TRABAJAN CON HIPERMATRICES Las siguientes funciones de MATLAB se pueden emplear también con g p p hipermatrices size() devuelve tres o más valores (el n nº de elementos en cada dimensión) ndims() devuelve el número de dimensiones squeeze() elimina las dimensiones que son igual a uno reshape() distribuye el mismo número de elementos en una matriz con distinta forma o con distintas dimensiones permute(A,v) permute(A v) permuta las dimensiones de A según los índices del vector v ipermute(A,v) realiza la permutación inversa Respecto al resto de las funciones de MATLAB, se pueden establecer las siguientes reglas 1. Todas las funciones de MATLAB que operan sobre escalares (sin(), cos(), etc.) se aplican li sobre b hipermatrices hi ti elemento l t a elemento l t 2. Las funciones que operan sobre vectores (sum(), max(), etc.) se aplican a matrices e hipermatrices según la primera dimensión, resultando un array de menor dimensión 3 Las funciones matriciales propias del Álgebra Lineal (det (), 3. () inv(), inv() etc.) etc ) no se pueden aplicar a hipermatrices. Para poderlas aplicar hay que extraer primero las matrices correspondientes (por ejemplo, con el operador dos puntos (:). Estructuras Una estructura (struct) es una agrupación de datos de tipo diferente nombre bajo un mismo nombre. Estos datos se llaman miembros (members) o campos (fields). Una estructura es un nuevo tipo de dato, del que luego se pueden crear muchas variables (objetos o instances). Por ejemplo, la estructura alumno puede contener los campos nombre (una cadena de caracteres) y carnet (un número). CREACIÓN DE ESTRUCTURAS Una posible forma de hacerlo es crear uno a uno los distintos campos, campos como en el ejemplo siguiente >> alu.nombre='Miguel' g alu = nombre: 'Miguel' >> al alu.carnet=75482 carnet=75482 alu = nombre: 'Miguel' carnet: 75482 >> alu Estructuras También p puede crearse la estructura p por medio de la función st struct() uct() >> al = struct('nombre', 'Ignacio', 'carnet', 76589) al = nombre: b 'I'Ignacio' i ' carnet: 76589 Los nombres de los campos se pasan a la función struct() entre apóstrofos ((')), seguidos del valor que se les quiere dar. Este valor puede ser la cadena vacía ('') o la matriz vacía ([ ]). FUNCIONES PARA OPERAR CON ESTRUCTURAS fieldnames() devuelve un vector de celdas con cadenas de caracteres que recogen los nombres de los campos de una estructura isfield(ST,s) ( ) p permite saber si la cadena s es un campo p de una estructura ST isstruct(ST) permite saber si ST es o no una estructura rmfield(ST,s) elimina el campo s de la estructura ST getfield(ST,s) g ( , ) devuelve el valor del campo p especificado. p Si la estructura es un arrayy hay que pasarle los índices como cell array (entre llaves {}) como segundo argumento Vectores o matrices de celdas (Cell Arrays) Un vector (matriz o hipermatriz) de celdas es un vector (matriz o hipermatriz) cuyos elementos son cada uno de ellos una variable de tipo cualquiera. En un array ordinario todos sus elementos son números o cadenas de caracteres. Sin embargo, en un array de celdas, el primer elemento puede ser un número; el segundo una matriz; el tercero una cadena de caracteres; el cuarto una estructura,, etc.. CREACIÓN DE VECTORES Y MATRICES DE CELDAS La creacion de Cell Arrays Arrays,, es utilizando llaves {}, por ejemplo: >> vc(1)={[1 vc(1)={[1 2 3]} vc = [1x3 double double]] >> vc(2)={'mi vc(2)={'mi nombre'} vc = [1x3 double double]] 'mi nombre' >> vc(3)={rand(3,3)} vc(3)={rand(3,3)} vc = [1x3 double double]] 'mi nombre' [3x3 double double]] Matrices dispersas (sparse) Las matrices dispersas o sparse son matrices de un gran tamaño con la mayor parte de sus elementos cero. Operar sobre este tipo de matrices con los métodos convencionales lleva a obtener tiempos d de cálculo Por esta desarrollado bt ti ál l prohibitivos. hibiti P t razón ó se han h d ll d técnicas especiales para este tipo de matrices. En ingeniería es muy frecuente encontrar aplicaciones en las que aparecen matrices sparse. MATLAB dispone de numerosas funciones para trabajar con estas matrices. Las matrices dispersas se almacenan de una forma especial: solamente se guardan en memoria los elementos distintos de cero, junto con la posición que ocupan en la matriz. MATLAB usa 3 arrays para matrices reales sparse con nnz elementos distintos de cero: 1. Un array con todos los elementos distintos de cero (nnz elementos) 2. Un array con los índices de fila de los elementos distintos de cero (nnz elementos) 3. Un array con punteros a la posición del primer elemento de cada columna (n elementos) En total se requiere una memoria de (nnz*8+(nnz+n)*4) bytes Ejemplo de una matriz dispersa >> A=[1, A=[1 0 0, 0 0, -1, -1 0; 0 0, 2 2, 0, 0 0, 0 1; 0 0, 0 0, 1 1, 1 1, 0; 0 0, 2 2, 0 0, 1, 1 0; -3, -3 0 0, 0, 0 0, 0 2] A= 1 0 0 -1 0 020 01 001 10 020 10 -3 0 0 0 2 >> S S=sparse(A) (A) S= (1,1) 1 (5,1) (2,2) 2 (4,2) (3,3) 1 (1,4) (3 4) 1 (3,4) (4 4) (4,4) (2,5) 1 (5,5) -3 2 -1 1 2 FUNCIONES PARA CREAR MATRICES DISPERSAS Las siguientes funciones permiten crear matrices dispersas.Se recomienda ver g el Help de MATLAB para tener una información más detallada. speye(m,n) sprand(m,n) sprandn(m,n) sprandsym(n) spdiags(A) sparse(m,n) Matriz identidad dispersa de tamaño m×n Matriz aleatoria dispersa con distribución uniforme Matriz aleatoria dispersa con distribución normal Matriz aleatoria simétrica Matriz dispersa a partir de las diagonales de otra matriz Crea una matriz dispersa de tamaño m×n con todos los elementos cero sparse(A) Crea una matriz dispersa a partir de una matriz llena sparse(i,j,val,m,n) Construye una matriz dispersa a partir de: i vector de í f í índices de fila, j vector de índices de columna, val vector de valores, m número de filas, n número de columnas, y un 6º argumento que permite definir el máximo nnz (por d f t en ell tamaño defecto t ñ de d val) l) por sii se quieren i añadir ñ di después más elementos full(S) Convierte una matriz dispersa en una matriz llena find(S) Encuentra los índices de los elementos distintos de cero y los evuelve como si la matriz fuera un vector (por columnas). Gráficos en MATLAB Matlab M tl b permite it crear gráficos áfi de d varios i tipos, ti que se utilizan tili para: – visualizar el contenido de las variables – crear imágenes/películas/VR/GIS – generar interfaces de usuario Tipos de Gráficos (1D, 2D) Tipos de Gráficos (>=3D) GRÁFICOS BIDIMENSIONALES L gráficos áfi 2 Dd tá ffundamentalmente d t l t orientados i t d a lla Los 2-D de MATLAB están representación gráfica de vectores (y matrices). MATLAB utiliza un tipo especial de ventanas para realizar las operaciones gráficas. Funciones g gráficas 2D elementales MATLAB dispone de cinco funciones básicas para crear gráficos 2-D. Estas funciones se diferencian principalmente por el tipo de escala que utilizan en los ejes de abscisas y de ordenadas. ordenadas Estas cuatro funciones son las siguientes: plot() plotyy() loglog() semilogx() semilogy() crea un gráfico a partir de vectores y/o columnas de matrices matrices, con escalas lineales sobre ambos ejes dibuja dos funciones con dos escalas diferentes para las ordenadas una a la derecha y otra a la izquierda de la figura ordenadas, figura. ídem con escala logarítmica en ambos ejes ídem con escala lineal en el eje de ordenadas y logarítmica en ell eje j d de abscisas b i ídem con escala lineal en el eje de abscisas y logarítmica en el eje de ordenadas FUNCIÓN PLOT Esta es la función clave de todos los gráficos 2-D en MATLAB. g Ya se ha dicho q que el elemento básico de los gráficos bidimensionales es el vector. Se utilizan también cadenas de 1 1, 2 ó 3 caracteres para indicar colores y tipos de línea. La función L f ió plot(), l t() en sus diversas di variantes, i t no hace h otra t cosa que dibujar dib j vectores. Su sintaxis es la siguiente: plot (Y) plot (X1,Y1,...) plot (X1,Y1,LineSpec,...) plot (...,'PropertyName',PropertyValue,...) plot (axes_handle,...) (axes handle,...) h = plot(...) hlines = plot('v6',...) Ejemplos de la FUNCIÓN PLOT Esta es la función clave de todos los gráficos 2-D en MATLAB. [1 3 2 4 5 3] >> x x=[1 x= 132453 >> plot(x) >> x=[1 6 5 2 1]; y=[1 0 4 3 1]; >> plot(x,y) La función plot() permite también dibujar múltiples curvas introduciendo varias parejas de vectores como argumentos. Dibujar la función sin y cos en el intervalo de [0,6] (el valor de =pi ) >> x=0:pi/25:6 x=0:pi/25:6*pi; pi; >> y=sin(x); z=cos(x); >> plot(x,y,x,z) Ejemplos de la FUNCIÓN PLOT Crear una matriz con las funciones seno y coseno >>W=[y;z]; Graficar ambas funciones >>plot( W) >>plot(x,W); >>plot(W,x); El comando plot puede utilizarse también con matrices como argumentos. plot(A) ordenadas frente al índice de los dibuja una línea por cada columna de A en ordenadas, elementos en abscisas plot(x,A) dibuja las columnas (o filas) de A en ordenadas frente al vector x en abscisas. Las dimensiones de A y x deben ser coherentes: si la matriz A es cuadrada se dibujan las columnas, pero si no lo es y la dimensión de las filas coincide con la de x, se dibujan las filas plot(A,x) análogo al anterior, pero dibujando las columnas (o filas) de A en abscisas, frente al valor de x en ordenadas plot(A,B) dibuja las columnas de B en ordenadas frente a las columnas de A en abscisas, dos a dos. ESTILOS DE LÍNEA Y MARCADORES EN LA FUNCIÓN PLOT El conjunto j básico de argumentos g de esta función es una tripleta formada por dos vectores y una cadena de 1, 2 ó 3 caracteres que indica el color y el tipo de línea o de marker Sintaxis: plot(x,y,'-.rs', 'LineWidth',4, 'MarkerEdgeColor','k', 'MarkerFaceColor''g',... 'MarkerSize',10) Ejemplos de gráficos Ejemplo1: Ej l 1 >> x=0:pi/100:4*pi; >> y=sin(x).*cos(x/3); >> plot(x,y) 1 0.8 0.6 1 0.4 0.8 j p Ejemplo2: >> x=0:pi/100:4*pi; >> y=sin(x).*cos(x/3); z=sin(x).*cos(x/2); >> plot(x,y,x,z) plot(x y x z) 0.2 0.6 0 0.4 1 -0.2 0.2 1 0.8 -0.4 0 0.8 0.6 -0.6 -0.2 0.6 Ejemplo3: >> x=0:pi/100:4*pi; >> A=[sin(x);sin(x/2);sin(x/3);sin(x/4)]; plot(x,A) ( , ) >> p Ejemplo4: plot(x,y,’r*’) ( ,y, ) >> p 0.4 -0.8 -0.4 0.4 0.2 -1 -0.6 0.20 0 -0.80 -0.2 -0.2 -1 0 -0.4 -0.4 2 4 6 8 10 12 14 2 4 6 8 10 12 14 22 44 66 8 8 10 10 12 12 14 14 -0 -0.6 -0.6 0 66 -0.8 -0.8 -1 -1 00 >>plot(x,y,'-.rh', 'MarkerEdgeColor','k', 'MarkerFaceColor''g‘) Ejemplos de gráficas de funciones y 25 x x y 25 2 2 2 x r cos( cos(tetha tetha) y rsen (tetha (tetha) y x 3x x 4 x ((2,2) 2 AÑADIR LÍNEAS A UN GRÁFICO YA EXISTENTE Existe la posibilidad de añadir líneas a un gráfico ya existente, sin destruirlo o sin abrir una nueva ventana. Para ello se utilizan los comandos hold on y hold off. El siguiente ejemplo muestra cómo se añaden las gráficas de x2 y x3 a la gráfica de x previamente creada (cada una con un tipo de línea diferente): Ejemplo: >> xx=0:pi/100:4*pi; 0:pi/100:4*pi; >> y=sin(x).*cos(x/3); z=sin(x).*cos(x/2); >> plot(x,y) >> hold on >> plot(x,z) >> hold off COMANDO SUBPLOT Una ventana U t gráfica áfi se puede d dividir di idi en m particiones ti i h i horizontales t l y n verticales, ti l con objeto de representar múltiples gráficos en ella. Cada una de estas subventanas tiene sus propios ejes, aunque otras propiedades son comunes a toda la figura. La sintaxis es: subplot(m,n,i) donde d d m y n son ell número ú d subdivisiones de bdi i i en filas fil y columnas, l e i es la l subdivisión que se convierte en activa Ejemplo: >>x=0:pi/25:pi; >>y=sin(x); z=cos(x); w=exp(-x*.1).*y; v=y.*z; >> subplot(2,2,1), plot(x,y) >> subplot(2,2,2), plot(x,z) >> subplot(2,2,3), (2 2 3) plot(x,w) ( ) >> subplot(2,2,4), plot(x,v) CONTROL DE LOS EJES: FUNCIÓN AXIS() d básico bá i es ell comando d axis. i Por P defecto, d f t MATLAB ajusta j t la l escala l de d El comando cada uno de los ejes de modo que varíe entre el mínimo y el máximo valor de los vectores a representar . Otros posibles usos de este comando son los siguientes: v=axis devuelve un vector v con los valores [[xmin, xmax, ymin, y ymax] y ] axis('ij') utiliza ejes de pantalla, con el origen en la esquina superior izda. y el eje j en dirección vertical descendente axis('xy') axis( xy ) utiliza ejes cartesianos normales, normales con el origen en la esquina inferior izda. y el eje y vertical ascendente axis('auto x') utiliza el escalado automático sólo en dirección x x z axis('auto xz') utiliza el escalado automático sólo en direcciones x, axis(axis) mantiene los ejes en sus actuales valores, de cara a posibles nuevas gráficas añadidas con hold on axis('tight') establece los mismos límites para los ejes que para los datos axis('equal') el escalado es igual en ambos ejes axis('square') ( q ) la ventana será cuadrada CONTROL DE LOS EJES: FUNCIÓN AXIS() Es posible E ibl ttambién bié ttener un control t l preciso i sobre b llas marcas y llos rótulos ót l que aparecen en los ejes, como por ejemplo en la forma siguiente: >>x = -pi:.1:pi; y = sin(x); >>plot(x,y) >>set(gca,'XTick',-pi:pi/2:pi) set(gca, XTick , pi:pi/2:pi) >>set(gca,'XTickLabel',{'-pi','-pi/2','0','pi/2','pi'}) Obsérvese Ob é cómo ó llas propiedades i d d se establecen t bl sobre b llos ejes j actuales, t l a llos que se accede con la función gca (get current axis). Manipulación de gráficos Existen diversas funciones para la manipulación de gráficos: title(‘ ') Adiciona un titulo al gráfico xlabel(‘ ', 'FontSize', 16) Adiciona la etiqueta del eje “x” ylabel(‘ ','FontSize',16) Adiciona la etiqueta del eje “y” grid on g Añade una rejilla j a la g grafica actual grid off Elimina la rejilla text(x,y,’string’) Añade una etiqueta o cualquier texto en una localización especifica xx,y. y gtext(’string’) Añade una etiqueta o cualquier texto, su posición se elige en cualquier punto de la figura, con el ratón. Símbolos matemáticos, letras griegas, y caracteres TEX g Se p pueden incluir símbolos matemáticos y letras g griegas, utilizando la secuencia caracteres del estilo. Esto es: Tabla de caracteres TEX Ejemplo >>title( {\itAe} {-\alpha\itt}sin\beta{\itt} \alpha<<\beta >>title('{\itAe}^{-\alpha\itt}sin\beta{\itt} \alpha<<\beta')) >>xlabel('Time \musec.') >> Control de ventanas gráficas: Función figure Si se llama a la función figure sin argumentos, se crea una nueva ventana gráfica con el número consecutivo que le corresponda El comando figure(n) hace que la ventana n pase a ser la ventana o figura activa. Si dicha ventana no existe, se crea una nueva ventana con el número consecutivo que le corresponda La función close cierra la figura activa, mientras que close(n) cierra la ventana o figura número n. El comando clf elimina el contenido de la figura activa La función gcf devuelve el número de la figura activa en ese momento. El comando figure(gcf) (get current figure) permite hacer visible la ventana de gráficos desde la ventana de comandos. Control de ventanas gráficas: Función figure >> x=[ x=[--4*pi:pi/20:4*pi]; >> plot(x,sin(x),'r',x,cos(x),'g') >> title('Función titl ('F ió seno(x) ( ) -en rojo rojoj - y función f ió coseno(x) ( ) -en verdeverde d -') >> xlabel('ángulo en radianes'), figure(gcf) >> ylabel( ylabel('valor valor de la función trigonométrica trigonométrica')), figure(gcf) >> axis([axis([-12,12,12,12,-1.5,1.5]), figure(gcf) >> axis('equal'), figure(gcf) >> axis('normal'), figure(gcf) >> axis('square'), figure(gcf) >> axis('off'), i (' ff') figure(gcf) fi ( f) >> axis('on'), figure(gcf) >> axis( axis('on') on ), grid grid, figure(gcf) La función figure también admite que se fijen algunas de sus propiedades, como por ejemplo eje p o la a posición pos c ó y e el ta tamaño a o co con que apa aparecerá ece á e en la a pa pantalla. ta a Por ejemplo, el comando: figure('position',[left,botton, width,height]) Otras funciones gráficas 2-D bar() crea diagramas de barras barh() diagramas de barras horizontales bar3() diagramas de barras con aspecto 3-D bar3h() diagramas de barras horizontales con aspecto 3-D 3D pie() gráficos con forma de “tarta” pie3() gráficos con forma de “tarta” y aspecto 3-D area() () similar i il plot(), l t() pero rellenando ll d en ordenadas d d d de 0 a y stairs() función análoga a bar() sin líneas internas errorbar() representa sobre una gráfica –mediante barras– valores de errores compass() dibuja los elementos de un vector complejo como un conjunto de vectores partiendo de un origen común feather() () dibuja j los elementos de un vector complejo j como un conjunto j de vectores partiendo de orígenes uniformemente espaciados sobre el eje de abscisas hist() dibuja histogramas de un vector rose() histograma de ángulos (en radianes) quiver() dibujo de campos vectoriales como conjunto de vectores Ejemplo para quiver: >> [x,y] = meshgrid(-2:.2:2,-1:.15:1); >> z = x .* exp(-x.^2 - y.^2); [px,py] = gradient(z,.2,.2); >> quiver(x,y,px,py) Otros ejemplos: >> x=[rand(1 x=[rand(1,100)*10]; 100)*10]; >> plot(x) >> bar(x) >> stairs( stairs(x)) >> hist(x) ( ) >> hist(x,20) >> alfa=(rand(1,20)-0.5)*2*pi; lf ( d(1 20) 0 5)*2* i >> rose(alfa) ( ) FUNCIÓN FPLOT vectores Si se quiere dibujar una La función plot vista anteriormente dibuja vectores. función, antes de ser pasada a plot debe ser convertida en un vector de valores. La función fplot admite como argumento un nombre de función o un nombre de fichero *.m en el cual esté definida una función de usuario. La función puede ser escalar (un único resultado por cada valor de x) o vectorial La forma general de esta función es la siguiente: vectorial. fplot('funcion', limites, 'cadena', tol) donde: 'funcion' representa el nombre de la función o del fichero *.m entre apóstrofos, limites es un vector de 2 ó 4 elementos, cuyos valores son [xmin,xmax] o [xmin,xmax,ymin,ymax], 'cadena' tiene el mismo significado que en plot y permite controlar el color, los markers y el tipo de línea, tol es la tolerancia de error relativo. Esta función puede utilizarse también en la forma: [x,y]=fplot('funcion', limites, 'cadena', tol) En este caso se devuelven los vectores x e y, y pero no se dibuja nada. nada El gráfico puede obtenerse con un comando posterior por medio de la función plot Ejemplo Se comienza creando un fichero llamado mifunc.m en el directorio C:\Archivos de programa\MATLAB\R2006a\work que contenga las líneas siguientes: El fichero se crea en el editor de MATLAB (editor de m-files) function y = mifunc(x) y(:,1)=200*sin(x)./x; y(: 2)=x y(:,2) x.^2; 2; A continuación se ejecuta el comando >> fplot('mifunc(x)', [-20 20], 'g') Obsérvese que la función mifunc devuelve una matriz con dos columnas, que constituyen las dos gráficas dibujadas. En este caso se ha utilizado p para ellas el color verde. DIBUJO SIMPLIFICADO DE FUNCIONES: () Y EZPOLAR() () FUNCIONES EZPLOT() La función ezplot es una función de dibujo simplificada, útil cuando se quiere obtener de forma muy rápida la gráfica de una función. >> ezplot(f); donde f es el nombre o mejor el handle de una función. También puede ser una función inline. Por defecto la función se dibuja en el intervalo [–2π ≤ x ≤ 2π]. ] Si se desea dibujar j f en un intervalo diferente,, se puede p escribir: >> ezplot(f,[a,b]); La función f puede ser una función implícita de dos variables f(x,y)=0. El intervalo por defecto para cada variable es [–2π ≤ x ≤ 2π]. También se puede d d definir fi i un iintervalo t l común ú o específico ífi para cada d variable. i bl >> ezplot(f); % dibuja f(x,y)=0 en -2*pi<x<2*pi y -2*pi<y<2*pi >> ezplot(f, [a,b]); % dibuja f(x,y)=0 en a<x<b y a<y<b >> ezplot(f, [xmin,xmax,ymin,ymax]); Entrada de puntos con el ratón Se realiza mediante la función ginput, que permite introducir las coordenadas del punto sobre el que está el cursor, al clicar (o al pulsar una tecla). Algunas formas de utilizar esta función son las siguientes: [x,y] = ginput lee un número indefinido de puntos –cada vez que se clica o se pulsa una tecla cualquiera– hasta que se termina pulsando la tecla intro [x,y] = ginput(n) lee las coordenadas de n puntos [x,y,bot] = ginput igual que el anterior, pero devuelve también un vector de enteros bot con el código ASCII de la tecla pulsada o el número del botón del ratón (1, 2, ...) con el que se ha clicado clf, [x,y]=ginput(4); >> figure(gcf) figure(gcf), plot(x plot(x,y, y 'w') w ), pause(5) pause(5), fill(x fill(x,y, y 'r') r) Graficas con vectores Matlab contiene funcione que permiten mostrar datos consistentes en direccion de vectores y vectores de velocidad estas funciones son: compass Muestra los vectores que inician en el origen de un sistema polar feather Muestra los vectores a los largo de una línea horizontal, espaciados de forma uniforme quiver Muestra vectores 2-D descritos por la componentes (u,v) Ejemplo: >>wdir = [45 90 90 45 360 335 360 270 335 270 335 335]; >>knots = [[6 6 8 6 3 9 6 8 9 10 14 12]; >>rdir = wdir * pi/180; >>[x y] = pol2cart(rdir >>[x,y] pol2cart(rdir,knots); knots); >>compass(x,y) Ejemplo: >>t = 0:0.5:10; >>s = 0.05+i; >>Z = exp(-s*t); feather(Z) GRÁFICOS TRIDIMENSIONALES Quizás sea ésta una de las características de MATLAB que más admiración despierta entre los usuarios no técnicos (cualquier alumno de ingeniería sabe que hay ciertas operaciones algebraicas que tienen dificultades muy superiores, aunque "luzcan" menos). Gráficos de línea La primera forma de gráfico 3D es la función plot3, que es el análogo tridimensional de la función plot. Esta función dibuja puntos cuyas coordenadas están contenidas en 3 vectores, vectores bien uniéndolos mediante una línea continua (defecto), bien mediante markers Sintaxis: plot3(x1 y1 z1 s1 x2 y2 z2 s2 x3 y3 z3 s3 ) plot3(x1,y1,z1,s1,x2,y2,z2,s2,x3,y3,z3,s3,...), plot3(X1,Y1,Z1,LineSpec,...) plot3(...,'PropertyName',PropertyValue plot3(...,' PropertyName',PropertyValue,...) ,...) h = plot3(...) EJEMPLO >> fi=[0:pi/20:6*pi]; fi=[0:pi/20:6*pi]; >> plot3(cos plot3(cos(fi),sin(fi), (fi),sin(fi),fi,'r fi,'r'), '), grid on; on; axis square EJEMPLO Crear el siguiente gráfico en un rango de ((-3 a 3) para la variables x e y z 3 (1 x).^2 z=3*(1-x) 2.*exp(-x exp( x.^2-(y+1) 2 (y 1).^2)-10*(x/5-x 2) 10 (x/5 x.^3-y 3 y.^5) 5).* exp(-x.^2-y.^2)-(1/3).*exp(-(x+1).^2-y.^2); >> plot3(x,y,z) >> plot3(x,y,z), plot3(x y z) grid on; axis square [x,y] y = meshgrid(-3:.5:3,-3:.5:3); g ( ) >> z=3*(1-x).^2.*exp(-x.^2-(y+1).^2)-10*(x/5-x.^3y.^5).*exp(-x.^2-y.^2)-(1/3).*exp(-(x+1).^2-y.^2); ^5) * ( ^2 ^2) (1/3) * ( ( +1) ^2 ^2) >> plot3(x,y,z, plot3(x y z 'g') g ), grid on; axis square 10 5 0 -5 5 -10 4 2 4 2 0 0 -2 -2 -4 -4 Función Meshgrid Genera una matriz (arreglño) xy para plot3 (curvas en tres dimensiones) Sintaxis: [X,Y] X,Y] = meshgrid( meshgrid(x,y). x,y). Transforma el dominio especificado por los vectores x e y en una matriz XY, que se puede utilizar para evaluar las funciones de dos variables i bl y gráficos áfi d de malla/superficie ll / fi i tridimensional. idi i l Las filas de la matriz de salida X son copias del vector x; columnas de la matriz Y d salida de lid son copias i d dell vector t y. [X,Y] X,Y] = meshgrid(x) meshgrid(x) [X,Y,Z] X,Y,Z] = meshgrid( meshgrid(x,y,z). x,y,z). Produce un arreglo tridimensional que se utiliza para evaluar funciones de tres variables y crear gráficos volumétricos tridimensionales. [[x,y] y] = meshgrid(-3:3,-3:3) g ( ) GRÁFICOS TRIDIMENSIONALES G áfi Gráficos d malla de ll y de d superficie fi i Matlab define una superficie por las coordenadas z de los puntos que estan por encima de los puntos de una regilla rectangular en el plano xy. xy El primer paso para generar una grafica de malla de una funcion de dos variables z=f(x,y); f( ) es engendrar d matrices ti x e y formadas f d respectivamente ti t por filas fil y columnas repetidas. Matlab proporciona la funcion meshgrid para este objetico. [X,Y]=meshgrid(x,y); ( ) para crear las g graficas de malla y superficie p en 3D son: Las funciones p mesh(X,Y,Z) mesh( X,Y,Z) surf(X surf(X,Y,Z,C surf( X X,Y,Z,C) Y Z C) C) Crea una malla en 3D Crea una superficie facetada (coloreada en su superficie) meshc,, meshz Crea una superficie con contornos meshc surfl surfl( fl((X,Y,Z fl X X,Y,Z) Y Z) Z) C Crea una superficie fi i sólida ólid (rellena ( ll d color) de l ) surface((X,Y,Z,C) surface X,Y,Z,C) Crea una superficie de bajo nivel de objetos gráficos Funciones surf, surfc Sintaxis: surf(Z) surf(Z,C surf( Z,C)) surf(X,Y,Z surf( X,Y,Z)) surf(X,Y,Z,C surf( X,Y,Z,C)) surf(...,'PropertyName',PropertyValue surf(...,' PropertyName',PropertyValue)) surf(axes_handles surf( axes_handles,...) ,...) surfc(...) surfc(...) h = surf(...) hsurface = surf('v6',...) h hsurface f = surfc('v6',...) surfc f ('v6',...) (' 6' ) >>[x,y] = meshgrid(-3:.5:3,-3:.5:3); >> z=3*(1-x).^2.*exp(-x.^2-(y+1).^2)-10*(x/5-x.^3-y.^5).*exp(x ^2 y ^2) (1/3) *exp( (x+1) ^2 y ^2); x.^2-y.^2)-(1/3).*exp(-(x+1).^2-y.^2); >> surf(x,y,z), grid on; axis square 10 >> colormap hsv 10 5 5 0 0 -5 -5 -10 4 -10 4 2 0 -2 -4 -3 -2 -1 0 1 2 3 2 0 -2 -4 -3 -2 -1 0 1 2 3 >> surfc(x,y,z) 10 5 0 -5 -10 4 2 0 -2 -4 -3 -2 -1 0 1 2 3 Funciones mesh mesh,, meshc meshc,, meshz Sintaxis: mesh(X,Y,Z) mesh( X,Y,Z) mesh(Z) mesh (Z) mesh(...,C) mesh h(...,C) ( C) mesh(...,' mesh (...,'PropertyName',PropertyValue PropertyName',PropertyValue,...) ,...) mesh((axes_handles mesh axes_handles,...) ,...) meshc((...) meshc(...) meshc ( ) meshz(...) meshz (...) h = mesh(...) mesh(...) hsurface = mesh mesh('v6' mesh( ('v6' ( v6 ,...)) hsurface = meshc meshc('v6' meshc( (('v6' v6 ,...), ) >>[x,y] = meshgrid(-3:.5:3,-3:.5:3); >> z=3 z=3*(1 (1-x).^2. x) ^2 *exp( exp(-x.^2-(y+1).^2)-10 x ^2 (y+1) ^2) 10*(x/5 (x/5-x.^3-y.^5). x ^3 y ^5) *exp( exp(x.^2-y.^2)-(1/3).*exp(-(x+1).^2-y.^2); >> mesh(x,y,z); h( ) >> meshc(x,y,z); >> meshz(x,y,z) Ejemplos >>close >> l all ll >>u=-8:0.5:8; v=u; >>[U,V]=meshgrid(u,v); >>R=sqrt(U.^2+V.^2)+eps; >>W=sin(R)./R; >>mesh(W) >>figure (2) surf(W) >>surf(W) >>figure (1) meshc(W) >>meshc(W) >>surf(X,Y,Z,'FaceColor','interp', 'EdgeColor','none', 'FaceLighting','phong') >>daspect([5 5 1]) >>axis tight >>view(-50 >>view( 50,30) 30) >>camlight left Ejemplos x y z 25 2 2 x z xe 2 2 y2 GRÁFICOS TRIDIMENSIONALES DIBUJO DE LÍNEAS DE CONTORNO: FUNCIONES CONTOUR Y CONTOUR3 Una forma distinta de representar funciones tridimensionales es por medio de isolíneas o curvas de nivel. Posibles formas de estas funciones son las siguientes: contour(Z, val) contour(u,v,W,20) contour(Z,20,'r--') contourf(Z val) contourf(Z, siendo val un vector de valores para las isolíneas dibujar se utilizan u y v para dar valores a los ejes coordenadas se puede especificar el tipo de línea análoga a contour(), contour() pero rellenando el espacio entre líneas Crear las curvas de nivel de las graficas anteriores >> contour( contour(x,y,z) x,y,z); Función contour3 Sintaxis: contour3(Z) contour3(Z,n (Z,n) , ) contour3( contour3(Z,v contour3( Z,v)) contour3(X,Y,Z contour3( X,Y,Z)) contour3(X,Y,Z,n contour3((X,Y,Z,n)) contour3(X,Y,Z,v contour3( X,Y,Z,v)) contour3(...,LineSpec contour3(..., LineSpec)) contour3(axes_handle contour3( axes_handle,...) ,...) [C,h C,h]] = contour3(...) Ejemplo >> contour3(x,y,z); [x,y] y = meshgrid([-2:.25:2]); g ( ) Z = x.*exp(-x.^2-y.^2); contour3(X,Y,Z,30) grid off view(-15,25) colormap cool Utilización del color en gráficos 3-D En los dibujos realizados hasta ahora, se ha visto que el resultado adoptaba determinados colores, pero todavía no se ha explicado de dónde han salido. Ahora se verá qué sistema utiliza MATLAB para determinar los colores MAPAS DE COLORES Un mapa de colores se define como una matriz de tres columnas, cada una de las cuales contiene un valor entre 0 y 1, que representa la intensidad de uno de los colores fundamentales: R (red o rojo), G (green o verde) y B (blue o azul). La longitud por defecto de los mapas de colores de MATLAB es 64, es decir, cada mapa p de color contiene 64 colores. Algunos mapas de colores están predefinidos en MATLAB. Buscando colormap en Help se obtiene –entre otra información– información– la lista de los siguientes mapas de colores: autumn bone colorcube cool copper flag gray hot hsv jet pink prism spring summer white winter Mapas de colores: varies smoothly from red, through orange, to yellow. component is a grayscale colormap with a higher value for the blue component. contains as many regularly spaced colors in RGB colorspace consists of colors that are shades of cyan and magenta. varies smoothly from black to bright copper. consists of the colors red, white, blue, and black. returns a linear grayscale colormap colormap.. varies smoothly from black, through shades of red, orange, and yellow, to white. varies the hue component of the hue hue--saturation saturation--value color model. model The colors begin with red, pass through yellow, green, cyan, blue, magenta, and return to red. ranges from blue to red red, and passes through the colors cyan cyan, yellow yellow, and orange. It is a variation of the hsv colormap colormap.. contains pastel shades of pink. repeats the six colors red, orange, yellow, green, blue, and violet. consists of colors that are shades of magenta and yellow. consists of colors that are shades of g green and yyellow. is an all white monochrome colormap colormap.. consists of colors that are shades of blue and green. El colormap por defecto es jet jet.. Para visualizar estos mapas de colores, cambiando al mismo tiempo su longitud, se pueden utilizar los siguientes comandos en la Command Window: Window: >> colormap colormap( p(hot hot(128)) ((128)) )) >> pcolor([1:129;1:129]') pcolor([1:129;1:129]') donde la función pcolor permite visualizar por medio de colores la magnitud de los elementos de una matriz (en realidad representa colores de “celdas”, para lo que necesita que la matriz tenga una fila y columna más de las necesarias; ésa es la razón de que en el ejemplo anterior a la función pcolor se le pasen 129 filas y 2 columnas). DIBUJO DE SUPERFICIES FACETEADAS La función surf tiene diversas posibilidades referentes a la forma en que son representadas las facetas o polígonos coloreados. Las tres posibilidades son las siguientes:: siguientes shading flat determina sombreado con color constante para cada polígono. Este sombreado se llama plano o flat flat.. shading interp establece que el sombreado se calculará por interpolación de colores entre los vértices de cada faceta. Se llama también sombreado b d de d G Gouraud d shading faceted consiste en sombreado constante con líneas negras superpuestas.. Esta es la opción por defecto superpuestas >>Shading flat >>Shading >>shading >> shading interp >>shading >> shading faceted OTRAS FUNCIONES GRÁFICAS 3D Las siguientes funciones se derivan directamente de las anteriores, pero añaden algún pequeño detalle y/o funcionalidad: surfc combinación de surf surf,, y contour en z=0 trisurf similar a surf surf,, dibuja una superficie 33-D a partir de los valores de una función de ttriángulos. f ió en una malla ll d iá l meshz mesh con plano de referencia en el valor mínimo y una especie de “cortina” en los bordes del dominio de la función trimesh similar a mesh mesh,, dibuja una superficie 33-D a partir de los valores de una función en una malla de triángulos. surfl para controlar la iluminación determinando la posición e intensidad de un foco de luz. light crea un foco de luz en los ejes actuales capaz de actuar sobre superficies 3 3--D. Se le deben p pasar como argumentos el color, el p g estilo (luz local o en el infinito) y la posición. Son muy importantes las propiedades de los objetos iluminados patch y surface surface;; consultarlas por medio del Help cuando se vayan a utilizar. colorbar añade el mapa de colores activo a la figura, redimensionando los ejes para hacerle un lugar. Se puede colocar horizontal o verticalmente. sphere cylinder Uso de la función Light >>h = surf( surf(peaks peaks); ); >>set(h,'FaceLighting','phong','FaceColor','interp (h,'FaceLighting','phong','FaceColor','interp',... , g g,p g, , p',... , >>set( 'AmbientStrength',0.5) >>light('Position',[1 0 0],'Style','infinite 0],'Style','infinite'); '); Otras alternativas lighting flat lighting gouraud lighting phong lighting none Colormaps p Incrustar colormaps en los gráficos Con la función colorbar colorbar,, se muestra la barra de colores actual. >>colorbar Ejemplo: [x,y,z,v x x,y,z,v] y z v] v] = flow; xmin = min(x(:)); ymin = min(y(:)); zmin = min(z(:)); xmax = max(x(:)); ymax = max(y(:)); zmax = max(z(:)); hslice s ce = su surf((linspace(xmin,xmax,100), surf(linspace space(((xmin,xmax,100), space , a , 00), linspace(ymin,ymax,100), linspace (ymin,ymax,100), zeros(100)); hold on slice(x,y,z,v,xmax (x,y,z,v,xmax,[ ,y, , , ,[ ],[ ]); hx = slice( set(hx,'FaceColor','interp','EdgeColo set( hx,'FaceColor','interp','EdgeColo r','none') r','none ') hy = slice( slice(x,y,z,v x,y,z,v,[], ,[],ymax ymax,[]); ,[]); set(hy,'FaceColor','interp','EdgeColor set( hy,'FaceColor','interp','EdgeColor ','none') ','none ') hz = slice( slice(x,y,z,v x,y,z,v,[],[], ,[],[],zmin zmin); ); set(hz,'FaceColor','interp','EdgeColo set( hz,'FaceColor','interp','EdgeColo r','none') r','none ') rotate( rotate(hslice (hslice,[ ,[--1,0,0],,[ 1,0,0], , , ],-45)) xd = get(hslice,'XData get(hslice,'XData'); '); yd = get(hslice,'YData get(hslice,'YData'); '); get((hslice,'ZData'); get(hslice,'ZData , '); ); zd = g delete(hslice delete( hslice)) daspect([1,1,1]) daspect([1,1,1]) axis tight box on view(--38.5,16) view( camzoom(1.4) camzoom (1.4) camproj perspective h = slice slice((x,y,z,v,xd,yd,zd x,y,z,v,xd,yd,zd); ); set(h,'FaceColor','interp set( h,'FaceColor','interp', ', ''EdgeColor','none EdgeColor','none', ', 'DiffuseStrength',.8) lightangle( lightangle g g (-45,45) , ) colormap (jet(24)) set(gcf,'Renderer','zbuffer set( gcf,'Renderer','zbuffer') ') Diferentes cajas de herramientas (toolboxes) Gráficos plottools disttool dfittool