Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Imprime: Centro Ocupacional El Papel C/Horacio Lengo, 5 29006-M alaga Tlfn.: 952 33 37 38
Indice general
Pr ologo 1. Primeras nociones b asicas 1.1. Unos primeros comandos u tiles . . . . . 1.2. Operaciones elementales . . . . . . . . . 1.3. Operadores de relaci on . . . . . . . . . . 1.4. Operadores l ogicos y valores booleanos . 1.5. Bucles: los comandos for y while . . . . 1.6. Ejecuci on condicionada: el comando if . 1.7. Impresi on en pantalla . . . . . . . . . . . 1.8. Formatos de salida . . . . . . . . . . . . 1.9. Valores de algunas constantes . . . . . . 1.10. Funciones con Matlab . . . . . . . . . . 1.10.1. Funciones internas . . . . . . . . 1.10.2. Funciones denidas por el usuario 1.11. Operaciones con polinomios . . . . . . . 2. Operaciones con vectores y matrices 2.1. Construcci on de vectores y matrices . 2.2. Manipulaci on de matrices y arrays . . 2.3. Operaciones con vectores . . . . . . . 2.3.1. Otros operadores vectoriales . 2.4. Operaciones con matrices . . . . . . . 2.5. Algunos comandos u tiles . . . . . . . 2.6. Resoluci on de sistemas lineales . . . . 3. Representaciones gr acas 3.1. Gr acas de funciones discretas . . 3.2. Gr acas de funciones anal ticas . 3.3. Algunas opciones gr acas . . . . 3.4. Gr acos 3D . . . . . . . . . . . . 3.4.1. Curvas en tres dimensiones 3.4.2. Supercies 3D . . . . . . . 1 3 3 5 5 6 6 6 7 8 8 9 9 9 11 13 13 14 17 18 19 20 21 23 23 23 24 27 27 28
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
IV
INDICE GENERAL 31 31 31 34 34 36 36 39 39 40 42 47 47 48
4. C alculo simb olico 4.1. Variables simb olicas . . . . . . . . . . . . . . . 4.2. Funciones simb olicas . . . . . . . . . . . . . . 4.3. Evaluaci on de funciones simb olicas . . . . . . 4.4. Resoluci on de ecuaciones simb olicas . . . . . . 4.5. Representaci on gr aca de funciones simb olicas 4.6. Funciones simb olicas . . . . . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
5. Ajuste de curvas e interpolaci on 5.1. Ajuste de curvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2. Interpolaci on 1D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3. Interpolaci on 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6. Programaci on en Matlab 6.1. Prealocaci on de memoria en matrices y vectores . . . . . . . . . . . . . Bibliograf a
Pr ologo.
Este manual tiene como u nico objetivo el de servir de ayuda a toda aquella persona que desee llevar a cabo su primera aproximaci on a Matlab, pretendiendo, ante todo, ser una gu a sencilla y concisa a este programa de c alculo. Se denen las funciones y comandos b asicos Matlab, y se le proporciona al lector las herramientas b asicas para la realizaci on de programas sencillos y la representaci on gr aca de las soluciones obtenidas. Este texto surge de la necesidad de proporcionarles a los alumnos universitarios de primer curso de carreras t ecnicas o cient cas que se enfrentan a una primera asignatura de m etodos num ericos en las que las pr acticas en ordenador se realizan con Matlab, de un manual de referencia sencillo, breve y de car acter muy b asico. Una vez que se tiene ya un conocimiento de m nimos sobre este sofware pueden consultarse otros manuales m as completos u otros textos de introducci on a Matlab como los que se dan en la bibliograf a que se acompa na. Nota: se trata de un texto en fase de elaboraci on.
Pr ologo
1.1.
Damos en primer lugar algunos comandos que nos pueden resultar de gran utilidad en nuestro manejo de Matlab ya que nos permitir an obtener informaci on en l nea acerca de la sintaxis de un determinado comando o encontrar comandos de los cuales desconocemos su nombre, salvar/recuperar datos, etc. Estos comandos nos ser an muy u tiles desde nuestro primer uso de Matlab, sea cual sea el pr oposito para el cual vamos a utilizar este programa, es por ello que aparecen en primer lugar.
help
Si conocemos el comando que debemos utilizar y queremos tener m as informaci on acerca de el o su sintaxis haremos uso del comando help, por ejemplo, >> help det Este comando tambi en nos puede dar informaci on sobre un tema m as general, por ejemplo, >> help elfun para obtener un listado de las funciones matem aticas elementales. Por u ltimo, basta hacer simplemente help para obtener un listado de todos los temas generales sobre los que Matlab nos proporciona ayuda en l nea.
lookfor
Cuando no sabemos cual es el nombre del comando que queremos utilizar podemos hacer una b usqueda mediante el comando lookfor dando una palabra clave que relacionada con la operaci on que queremos que el comando Matlab que estamos buscando
ejecute. La b usqueda se lleva a cabo entre todas las primeras l neas de los temas de ayuda, no siendo por tanto necesario que la palabra clave sea un comando Matlab, por ejemplo, >> lookfor eigenvalue
diary
Si queremos poder revisar los resultados de una ejecuci on o guardar los comandos de una sesi on de trabajo podemos hacer uso del comando diary. Para guadar los datos en el chero sesion1 haremos, >> diary sesion1 cuando queramos concluir la salvaguarda de datos escribiremos diary off, pudiendo continuar nuestra sesi on Matlab o guardar las posteriores salidas en pantalla en un nuevo chero.
who y otros
Para saber, en cualquier momento de nuestra sesi on de trabajo, cuales son las variables que hemos denidos hasta ese instante teclearemos who. Si se quiere obtener una informaci on m as detallada sobre estas variables (nombre, dimensiones, espacio ocupado en memoria y tipo -real, compleja, simb olica, cadena de caracteres, . . . -) haremos whos. Para borrar todas o alguna de las variables denidas se utilizar a el comando clear. Otra cuesti on importante es que Matlab distingue entre may usculas y min usculas, por tanto los nombres aux, Aux o AUX corresponden a tres variables distintas, as se tendr a: >> aux = 24 aux = 24 >> new = Aux - 3 ??? Undefined function or variable Aux. >> new = aux - 3 new = 21 Tambi en podemos utilizar comandos unix m as usuales desde la ventana Matlab, como por ejemplo, ls, cd, pwd entre otros. Por u ltimo es u til saber que podemos movernos hacia atr as y hacia adelante sobre todos los comandos e intrucciones ya introduciadas mediante la teclas de echa hacia arriba y echa hacia abajo del teclado y mover el cursor a izquierda y derecha sobre los caracteres de la instrucci on en la l nea de comandos con las correspondientes teclas de echa a izquierda y echa a derecha .
save y load
Si queremos guardar los resultados obtenidos tras una ejecuci on de una o m as variables utilizaremos el comando save, el cual crear a un chero binario (no de texto), salvo que a nadamos la opci on -ascii. >> save fichdatos x y z guarda en el chero fichdatos.mat el valor de las variables x, y, z. La opcion -append nos permite a nadir nuevas variables a un chero ya existente. Para recuperar los valores de las variables guardadas en un chero .mat utilizaremos el comando load, >> load fichdatos >> load fichdatos z este u ltimo l nea de comando recupera solamente la variable z del chero de datos fichdatos.
1.2.
+ /
Operaciones elementales
suma, resta, multiplicaci on, divisi on, eleva a la potencia dada.
Las operaciones elementales en Matlab vienen dada por los s mbolos usuales:
1.3.
Operadores de relaci on
En el lenguaje de programaci on Matlab los operadores de relaci on vienen dados por siguientes s mbolos: == <= >= = < > igualdad, menor o igual que, mayor o igual que, distinto que, menor que, mayor que.
La caracter stica diferencial de Matlab respecto a otros lenguajes de programaci on reside en el hecho de que estos operadores de relaci on pueden aplicarse tambi en a matrices y vectores, realiz andose la comparaci on elemento a elemento y obteni endose como resultado una matriz de ceros y unos.
1.4.
Los operadores l ogicos en Matlab vienen dados por, & operador y operador no | operador o
1.5.
Para realizar la ejecuci on de un determinado grupo de ordenes un n umero jo y predeterminado de veces se utiliza el comando for. for i = 1:nmax ... end for k = 2*n:-1:n ... end
Cuando las operaciones dentro del bucle deben realizarse mientras se verique una determinada condici on que depende de valores que se obtienen dentro del propio bucle, entonces debemos hacer uso del comando while: while nstep <= ... end nmax while (err > eps1) | (rel > eps2) ... end
1.6.
Cuando queremos realizar una serie de comandos s olo cuando se verica una cierta condici on se utiliza el comando if y de forma m as general la estructura if-else-end. if nstep <= ... end nmax
if disc == 0 disp(Una raiz real doble) elseif disc > 0 disp(Dos raices reales distintas) else disp(Dos raices complejas conjugadas) end
1.7.
Impresi on en pantalla
La forma m as sencilla de imprimir un mensaje en pantalla es mediante el comando disp que acabamos de utilizar en la secci on anterior. Este comando tambi en permite sacar por pantalla el valor de la variable indicada, por ejemplo, >> disp(a0) 1 >> disp([a0,b0,alpha]) 1.0000 2.0000
1.6543
Por su parte el comando fprintf nos va a permitir llevar a cabo la impresi on de forma conjunta de texto y valores de variables, lo cual ser a de gran utilidad para presentar la informaci on que nos proporciona un programa: >> fprintf(Una raiz de f en [%d,%d] es: %d\n\n ,a0,b0,alpha) Una raiz de f en [1,2] es: 1.654300e+00 En este caso el formato de impresi on viene dado por %d. Los diferentes formatos vienen determinados por una de las letras d, i, o, u, x, X, f, e, E, g, G, c, s, as , por ejemplo, %6.2f produce un formato con 5 cifras m as la coma decimal, con dos cifras decimales. En todo caso los formatos en Matlab no tienen la rigidez que, por ejemplo, en Fortran, ya que en el supuesto de que el valor a imprimir no se ajuste al formato dado se imprimir a igualmente, aunque quiz as no en la forma deseada. Los caracteres \n, \r, \t, \b, \f producen un cambio de rengl on, un retorno de carro, una tabulaci on, un retroceso (backspace) y un salto de p agina, respectivamente. Para ver m as claramente las diferencias entre cada una de estas opciones sustituirlas en el ejemplo anterior y observar el resultado. De forma m as general el comando fprintf escribe datos formateados en un chero. As , por ejemplo, si queremos crear un chero de texto que contenga una tabla de la funci on exponencial entre 0 y 1 haremos: >> >> >> >> x = 0:.1:1; y = [x; exp(x)]; fid = fopen(exp.txt,w); fprintf(fid,%6.2f %12.8f\n,y); fclose(fid)
Este chero contendr a: 0.00 1.00000000 0.10 1.10517092 ..... 1.00 2.71828183 Recu erdese que para obtener mayor informaci on sobre cualquiera de estos comandos basta hacer help comando.
1.8.
Formatos de salida
Todos los c alculos en Matlab se hacen en doble precisi on. El comando format se usa para cambiar entre los distintos formatos de salida. Sintaxis format format format format format format format format format format format Value Ejemplo 1.3333 1.3333 1.33333333333333 1.3333e+00 1.333333333333333e+00 1.3333 1.33333333333333 35555555555555 + 1.33 4/3
Igual que format short short Punto jo escalado con 5 d gitos long Punto jo escalado con 15 d gitos short e Coma otante con 5 d gitos long e Coma otante con 16 d gitos short g Mejor entre los dos short long g Mejor entre los dos long hex Formato hexagesimal + Signo bank Formato punto jo con 2 decimales rat Aproximaci on mediante una fracci on Cuadro 1.1: Comando format
Espaciado format compact suprime las l neas extra, format loose vuelve a insertar l neas extra.
1.9.
>> pi ans = 3.1416 >> format long >> pi ans = 3.14159265358979 >> realmax ans = 1.7977e+308
1.10.
1.10.1.
Matlab posee un gran n umero de funciones implementadas a las que basta llamar mediante el nombre asignado a dicha funci on junto con el par ametro o par ametros necesarios. Damos a continuaci on una lista de alguna de estas funciones. Para obtener un listado completo de las funciones elementales disponibles hacer help elfun en la l nea de comandos. sin(x) cos(x) tan(x) asin(x) log(x) log10(x) exp(x) sqrt(x) abs(x) sinh(x) cosh(x) round(x) fix(x) floor(x) ceil(x) seno de x, coseno de x, tangente de x, arcoseno de x, logaritmo en base e de x, logaritmo en base 10 de x, exponencial de x, ra z cuadrada de x, valor absoluto de x, coseno hiperb olico de x, seno hiperb olico de x, redondea x a un entero, corta x a un entero, toma el entero m as cercano a x por defecto, toma el entero m as cercano a x por exceso.
1.10.2.
Matlab permite la denici on de funciones por parte del usuario de forma sencilla, por ejemplo, si queremos denir la funci on f (x) = x3 x + 5 habr a que editar un chero Matlab con sujo .m (a estos cheros les llamaremos m-cheros) como el que se muestra a continuaci on, function y=f1(x) y=x^3-x+5; Esta funci on puede ser llamarda por otro programa o funci on Matlab, o ser utilizada directamente desde la l nea de comando. Para evaluar esta funci on en un punto podemos hacer >> y0=f1(5.4); o bien >> y0=feval(f1,5.4); Para obtener el cero de f1 m as cercano a 5,4 haremos
Tambi en pod amos haber introducido esta funci on como una funci on en l nea mediante el comando >> f1 = inline(x^3-x+5); En el caso de introducir la funci on como una funci on en l nea no tendremos que poner comillas en la llamada de la funci on feval ni fzero, es decir, en tal caso escribiremos, por ejemplo, >> raiz=fzero(f1,[-3,0]). Observemos que la funci on f1 se ha denido de forma que s olo es aplicable a escalares, pero no a vectores o matrices (lo cual constituye una de las grandes potencialidades de Matlab). Para comprobar la armaci on anterior hagamos, >> x = 0:0.1:1; >> f1(x) (o bien >> y0=feval(f1,x)) ??? Error using ==> inline/subsref Error in inline expression ==> x^3-x+5 ??? Error using ==> ^ Matrix must be square. Para poder evaluar f1 en vectores o matrices habr a que utilizar en su denici on las operaciones con arrays (dot-operations) que trataremos en el cap tulo siguiente, pero de las cuales adelantaremos aqu su uso. As , si hacemos, >> f1 = inline(x.^3-x+5); >> y0=feval(f1,x) obtendremos los 11 valores que toma la funci on f1 en los puntos dados por las coordenadas del vector x. Si queremos denir mediante Matlab una funci on dada a trozos, como por ejemplo la funci on denida por x0 x+1 f (x) = 1 (1/8) x2(3 x) 0 x 2 1/2 x2 debemos hacerlo mediante la siguiente sintaxis en un m-chero, function y = f(x) ym = 1.0 - 0.125*x.^2.*(3.0-x); y1 = (x+1).*(x <= 0); y2 = ( (x <= 2) - (x < 0) ).*ym; y3 = 0.5*(x > 2); y = y1 + y2 + y3;
11
Por u ltimo una funci on puede tener uno o varios par ametros de entrada y/o salida. Mostraremos como ejemplo una funci on que calcula la media y la desviaci on est andar (que ser an los valores de salida) de un conjunto de datos que se introducen mediante el vector x, por ejemplo, x = [ 1 3 5 6 3.4 5.6 3 2 2 ], que ser a la variable de entrada. function [media,dstand] = stad(x) n = length(x); media = sum(x) / n; dstand = sqrt(sum((x - media).^2)/n); Debe quedarnos claro que, en este ejemplo, es imprescindible la utilizacion de la operaci on-array .^2.
1.11.
Para denir un polinomio en Matlab lo que haremos ser a dar un vector con sus 4 3 coecientes, as p(x) = x 2x + 3x + 4 se introduce como: >> p=[1 0 -2 3 4] p = 1 0 -2 3 4
Para calcular las ra ces de este polinomio haremos >> r = roots(p) r = 1.2428 + 1.0715i 1.2428 - 1.0715i -1.4856 -1.0000 Conocidas las ra ces podemos reconstruir el polinomio mediante el comando poly, >> q = poly(r) q = 1.0000 0.0000 -2.0000 3.0000 4.0000
La multiplicaci on de polinomios se lleva a cabo mediante el comando conv >> p = [1 -2 3 4]; q = [1 2 1 4] >> s = conv(p,q) s = 1 0 0 12 3 16
16
12
Matlab no realiza la suma/resta de polinomios de manera espec ca para polinomios, ya que esta operaci on se realiza como una simple suma/resta de vectores. Por tanto, la u nica condici on que debe vericarse es que los vectores (y consecuentemente los polinomios) tengan igual dimensi on (grado). Esto supone un inconveniente a la hora de realizar la suma de polinomios arbitrarios as , por ejemplo, si hacemos >> ps = p + s ??? Error using ==> + Matrix dimensions must agree. As pues, para poder sumar estos dos polinomios, habr a que escribir: >> ps = [0 0 0 p] + s ps = 1 0 0 13
19
20
Por tanto, para realizar esta la suma de polinomios cualesquiera de forma completamente autom atica habr a que escribir un programa Matlab que lleve a cabo esta tarea. Sin embargo, todav a no estamos preparados para escribir este programa. Dada su especial simplicidad la derivaci on de polinomios se realiza mediante un comando particular, polyder >> dps = polyder(ps) dps = 6 0 0
39
19
Por u ltimo veamos como evaluar un polinomio, >> polyval(ps,3) ans = 1166
2.1.
Los valores de los coecientes de una matriz se introducen por las de una de las dos maneras siguientes: 1. >> A=[1 2 3;4 5 6; 7 8 9] 2. >> A=[1 2 3 4 5 6 7 8 9] Podemos generar algunas matrices particulares de forma sencilla, por ejemplo, si una determinada matriz debe inicializarse a ceros o a unos haremos >> B = zeros(3,5); >> C = zeros(4); >> D = ones(size(B)); En caso de aparecer un solo par ametro la matriz ser a cuadrada. En el tercer ejemplo se genera una matriz de unos del tama no de la matriz B ya denida. Para crear vectores se puede actuar de forma an aloga o tambi en podemos generar vectores dando valores para sus coordenadas equiespaciados ( util, por ejemplo, a la hora de representar las abscisas para una funci on discreta) de cualquiera de las dos formas siguientes: >> x=0:0.1:10; >> x=linspace(0,10,101);
14
Nota: para un espaciado logar tmico v ease logspace. Para recuperar las dimensiones de una matriz o vector utilizamos el comando size, para el caso de vectores podemos tambi en utilizar el comando length. >> size(A) ans = 3 3 >> size(x) ans = 101 1 >> size(x) ans = 1 101 >> length(x) ans = 101
Para visualizar el valor un determinado elemento de una matriz o vector teclearemos, por ejemplo, >> A(2,3) ans = 6 >> x(27) ans = 2.6000
para recuperar el elemento que ocupa la posici on (2,3) de la matriz A y la coordenada 27 del vector x, respectivamente. Tambi en se pueden recuperar varios valores al mismo tiempo mediante expresiones del tipo, >> x(4:8) ans = 0.3000 >> x(4:2:8) ans = 0.3000 >> A(2:3,2) ans = 5 8
0.4000
0.5000
0.6000
0.7000
0.5000
5 8
6 9
que nos proporcionan las coordenadas de la cuarta a la octava del vector x, las coordenadas cuarta, sexta y octava del vector x, y los elementos en las posiciones (2,2) y (2,3) de la matriz A, respectivamente.
2.2.
Las posibilidades que Matlab nos proporciona en la manipulaci on arrays de n umeros es inmensa. Intentaremos dar aqu una idea sobre algunas de estas posibilidades mediante diversos ejemplos. En primer lugar denamos dos vectores a y b,
15
4 7
5 9
Podemos crear una matriz que tiene a estos vectores por las: >> M = [a;b] M = 1 2 1 3
3 5
4 7
5 9
Pero tambi en son posibles otras manipulaciones m as sutiles, as >> d = [0 b(1) a(2:2:4) b(4) 0] d = 0 1 2 4 7 >> N = [a(2:2:4);b(2:2:4)] N = 2 4 3 7
donde, por ejemplo, a(2:2:4) representa los elementos del vector a desde la segunda a la cuarta tomadas con un paso 2, es decir, se toman s olo la segunda y cuarta componente. Tambi en podemos modicar el valor de un solo coeciente de una matriz, >> A(3,3)=33 A = 1 2 4 5 7 8
3 6 33
En el caso de que queramos a nadir un coeciente en una posici on que supera las dimensiones de la matriz, entonces la matriz se rellena de ceros para las posiciones sin determinar, >> A(2,5)=24 A = 1 2 4 5 7 8
3 6 33
0 0 0
0 24 0
16
Volvamos a reconstruir nuestra matriz A de referencia, >> A=[1 2 3; 4 5 6; 7 8 9]; Si, por ejemplo, queremos invertir el orden de las las de la matriz haremos >> B=A(3:-1:1,:) B = 7 8 9 4 5 6 1 2 3 donde los dos puntos indican que se toman todas las columnas, es decir, ser a equivalente, en este caso, a escribir 1:3. Si quisieramos construir una matriz que fuese el resultado de tomar todas las las de A y s olo las dos primeras columnas y a nadirle la primera y tercera columnas de B har amos >> C=[A(:,1:2) B(:,[1 3])] C = 1 2 7 9 4 5 4 6 7 8 1 3 Para extraer de esta u ltima matriz una matriz 2 2 con los coecientes de la segunda y tercera las y las columnas primera y tercera har amos >> B=C(2:3,[1 3]) B = 4 4 7 1 Tambi en podemos utilizar un array ya existente para extraer submatrices de una matriz dada, por ejemplo, >> C=[1 3] C = 1 3 >> B=A(C,C) B = 1 3 7 9 >> C=[3 1] C = 3 1 >> B=A(C,C) B = 9 7 3 1
Para construir un vector a partir de la matriz A que sea el resultado de ir tomando sus columnas de forma consecutiva har amos (donde tomamos la traspuesta para tener un vector la en lugar de un vector columna).
17
Para eliminar la segunda columna de A, escribir amos >> A(:,2)=[] A = 1 3 4 6 7 9 si ahora queremos eliminar la segunda la a la matriz resultante, >> A(2,:)=[] A = 1 3 7 9 y, por u ltimo, para sustituir la segunda la de la matriz anterior con los coecientes del vector C escribir amos >> A(2,:)=C A = 1 3 3 1
2.3.
Adem as de las operaciones usuales que involucran vectores Matlab presenta algunas operaciones con vectores espec cas que pueden ser de gran utilidad. Consideremos para los ejemplos que daremos a continuaci on dos vectores u y v y un escalar a, >> a = 2; >> u = [ 1 2 3 ]; >> v = [ 2 4 1 ];
18
Observemos cual es el resultado de la operaci on (producto) para los vectores u y v dados: >> u*v ??? Error using ==> * Inner matrix dimensions must agree. En el caso de que u sea un vector la y v un vector columna, entonces el operador denota el producto escalar entre vectores, as , haciendo uso del operador transposici on, tendr amos: >> u*v ans = 13 y haciendo >> u*v ans = 2 4 6
4 8 12
1 2 3
2.3.1.
Matlab implementa muchos otros operadores vectoriales entre ellos destacamos algunos: Operador sum(u) prod(v) dot(u,v) cross(u,v) max(u) Descripci on suma todas las componentes de u multiplica todas las componentes de u producto escalar producto vectorial componente de valor m aximo Resultado 6 8 13 [-10 5 0] 3
19
2.4.
+ * / \ ^ .
Adem as de estos operadores matriciales usuales, tendremos las operaciones elemento a elemento denidas por el operador antecedido por un punto. .* ./ .\ .^ multiplicaci on elemento a elemento, divisi on usual elemento a elemento, divisi on inversa elemento a elemento, potenciaci on elemento a elemento.
4 5 6
7 8 9
Obs ervese la diferencia entre la multiplicaci on de matrices como operaci on matricial usual: >> C = A*B C = 5 14 14 77 23 122
23 122 194
20 >> D=A.*B D = 1 8 8 25 0 48
0 48 81
An alogamente obs ervese la diferencia entre la potenciaci on como operaci on matricial, 2 A = A A: A2=A^2 A2 = 9 66 102
12 81 126
12 84 129
4 25 64
0 36 81
2.5.
Recordemos hacer help comando para tener m as detalles sobre cada uno de estos comandos as como sobre sus sintaxis. >> D = inv(A) D = -0.3333 -2.0000 0.6667 1.0000 -0.3333 0.6667
21
2.6.
Matlab nos permite resolver de forma sencilla y eciente, sin preocuparnos del m etodo que utiliza, sistemas lineales de la forma A x = b. Para ello, en primer, lugar habr a que introducir la matriz A de coecientes y el vector b conteniendo el segundo miembro de alguna de las formas que se han visto en este cap tulo. Por ejemplo, si tomamos la matriz A ya denida y cuyo determinante hemos visto que es distinto de cero, y como segundo miembro tomamos >> b = [3; 4; 6] b = 3 4 6 A continuaci on podemos resolver el sistema lineal de varias maneras. Una ser a utilizando la matriz inversa, aunque este m etodo no es en general recomendable, ya que el c alculo de la inversa de una matriz s olo debe realizarse si se necesita expl citamente. >> x = inv(A)*b x = -1.0000 2.0000 -0.3333 La forma m as adecuada y eciente de resolver un sistema lineal es mediante la utilizaci on del operador divisi on(\) o del operador divisi on inversa(/). Ambos operadores producen id enticos resultados salvo que el primero nos proporciona un vector columna y el segundo un vector la. >> x = A\b x = -1.0000 2.0000 -0.3333 >> x = b/A x = -1.0000
2.0000
-0.3333
22
3.1.
En primer lugar Matlab permite representar f acilmente las gr acas de datos num ericos almacenados en vectores o en matrices mediante el comando plot. Estos datos pueden ser el resultado de la evaluaci on de una funci on anal tica o datos que se leen de un chero. La sintaxis b asica del comando plot es simple: >> x = [0 1 2 3 4 5]; >> y = [3 5 -2 1 0 4]; >> plot(x,y) Si no se indica nada plot une los puntos de la gr aca mediante una l nea continua negra. Para cambiar el tipo de l nea o el color escribiremos, por ejemplo, >> plot(x,y,xg) para obtener los datos de la gr aca marcados con una equis y en color verde. Para ver las posibilidades disponibles ver la tabla 3.1.
3.2.
Resulta evidente que para representar gr acamente una funci on denida anal ticamente habr a que discretizarla en primer lugar y luego representar la funci on en los puntos considerados mediante el comando plot o, de forma m as autom atica, sin necesidad de discretizaci on previa por parte del usuario, mediante el comando fplot. As , si queremos representar gr acamente la funci on cos x en el intervalo [0, ] haremos, por ejemplo,
24 S mbolo y m c r g b w k Color amarillo magenta cian rojo verde azul blanco negro S mbolo . o x + * : -. Tipo de l nea puntos c rculos equis (x) mases (+) asteriscos (*) l nea continua l nea de puntos punto-gui on l nea de guiones
Representaciones gr acas S mbolo s d ^ v < > p h Tipo de l nea cuadrados diamantes tri angulos tri angulos tri angulos tri angulos pentagrama hexagrama
Cuadro 3.1: Estilos y colores para las representaciones gr acas. Comando plot. >> x = 0:0.1:2*pi; >> y = cos(x); >> plot(x,y) O tambi en >> x = linspace(0,2*pi,101); >> plot(x,cos(x)) Para realizar la gr aca mediante el comando fplot escribir amos >> fplot(cos(x),[0 2*pi]) sin necesidad de especicar los puntos de la discretizaci on del eje de abscisas.
3.3.
Repasemos ahora de forma r apida algunas de las principales opciones gr acas que nos proporciona Matlab. En primer lugar veamos que comandos nos permiten incluir texto en los ejes de la gr aca. Para ello debemos utilizar los comandos xlabel e ylabel. Si lo que queremos es escribir un texto en la parte superior de la gura utilizamos el comando title. >> xlabel(coordenada x) >> ylabel(coordenada y) >> title(Grafica de la funcion f(x)=cos(x)) Podemos a nadir una cuadr cula a la gr aca de forma autom atica mediante el comando grid on y eliminarla tecleando grid off. El comando grid sin m as activa/desactiva esta opci on gr aca. Para controlar la apariencia y escalado de los ejes de forma m as personalizada contamos con el comando axis. As axis([xmin xmax ymin ymax]) ja los l mites
25
de representaci on para la gr aca a la que hace referencia. Otras opciones para este comando son: axis axis axis axis axis tight equal image square normal ajusta los ejes a los valores de los datos toma iguales factores de escala en ambos ejes igual que axis equal pero ajustando los ejes a los datos hace que los ejes formen un cuadrado deshace los efectos de axis square y axis equal y elimina toda restricci on en el escalado elimina el texto de los ejes, la cuadr cula y devuelve el escalado autom atico restablece el texto de los ejes, marcas y cuadr cula vuelve a los par ametros de escalado por defecto mantiene el escalado jo al activar el comando hold y realizar posteriores gr acas
Si queremos a nadir texto en una posici on de la gura cualquiera dada utilizaremos la orden text(x,y,texto), donde (x,y) representa las coordenadas del punto medio del texto en su extremo izquierdo (como unidades se toman las de los ejes de la gr aca). El comando gtext sirve para la colocaci on de texto en la gr aca en la posici on que indiquemos mediante el rat on. Adem as podemos poner una leyenda a todas o algunas de las curvas representadas en una gr aca mediante el comando legend como veremos en el ejemplo de la gura 3.1. Para ampliar una parte de la gr aca tecleamos zoom en la ventana de comandos y luego cliquearemos con el rat on en la zona de la gr aca que queremos ampliar tantas veces como sucesivos zooms queramos realizar. Un doble click restablece la gr aca a sus dimensiones iniciales. Al realizar un nuevo comando plot la gr aca anteriormente representada desaparece autom aticamente. Si queremos que dicha gr aca permanezca y superponer la nueva curva que vamos a representar, una de las posibilidades es utilizar el comando hold, o hold on y hold off para desactivar esta opci on. El comando print nos permite guardar la gr aca como un m-chero o en formato postscript para su posterior impresi on. En el siguiente ejemplo se recogen algunos de los comandos introducidos hasta el momento, la gura 3.1 nos muestra el resultado que se obtiene. >> >> >> >> >> >> >> >> x = 0:0.1:2*pi; plot(x,cos(x),--,x,sin(x),-o) axis([0 2*pi -1 1]) legend(coseno,seno) text(0.8,0.2,cos(x)) text(3,0.2,sen(x)) title(Graficas de las funciones seno y coseno) xlabel(eje de abscisas)
Representaciones gr acas
0.6
0.4
eje de ordenadas
0.2
cos(x)
sen(x)
0.2
0.4
0.6
0.8
3 eje de abscisas
Figura 3.1: Algunas opciones del comando plot. Si queremos representar una nueva gr aca en una nueva ventana sin perder la que ya tenemos utilizaremos el comando figure. Para borrar la u ltima gura haremos clf. Tambi en en una misma gura pueden aparecer varias gr acas con sus correspondientes ejes. Esto se consigue con el comando subplot. Veamos la utilizaci on de este comando junto a otros ya estudiados mediante el siguiente ejemplo, cuyo resultado aparece en la gura 3.2.
>> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> x=0:0.1:2*pi; % Discretizacion del eje de abcisas figure % Generar una nueva figura subplot(2,3,1) % Primera grafica plot(x,sin(x),*b) % Funcion seno con asteriscos y en negro axis ([0 2*pi -1 1]) % Defino los ejes hold on % Sigo dibujando en la misma grafica plot(x,sin(2*x),.) % La funcion seno(2x) punteada title(Funcion seno) % Ponemos titulo a la grafica text(5.4,0.85,(a)) % Incluimos texto en la posicion indicada hold off subplot(2,3,2) % Segunda grafica plot(x,cos(x),-o,x,cos(2*x),.) % Funciones cos(x) y cos(2x) axis tight % Los ejes deben ajustarse a los datos title(Funcion coseno) % Titulo para la segunda grafica text(4.8,0.85,(b)) % Insertamos texto en la posicion indicada subplot(2,3,3) % Tercera grafica semilogy(x,exp(x),-^) % Escala logaritmica en el eje de ordenadas grid on % Activamos la cuadricula axis tight % Los ejes deben ajustarse a los datos title(Funcion exponencial) % Titulo para la tercera grafica text(4.8,325,(c)) % Aado texto en la posicion indicada
3.4 Gr acos 3D
>> >> >> >> >> >> subplot(2,3,4:6) plot(x,x.^2.*sin(x),-+) grid on legend(x exp(x)) title(Otra funcion) text(0.1,2,(d))
Funcion seno 1 (a) 0.5 0.5 1 (b) 10
2
27
% % % % % % Cuarta grafica!!! Funcion x sen(x) linea continua y + Activamos la cuadricula Ponemos texto tipo leyenda Titulo cuarta grafica Insertamos texto en la posicion indicada
Funcion coseno Funcion exponencial (c)
0 10
1
0.5
0.5
0
10
3.4.
3.4.1.
Gr acos 3D
Curvas en tres dimensiones
El equivalente del comando plot para gr acas en tres dimensiones es el comando plot3 cuya sintaxis es tambi en an aloga a la de aquel pero donde habr a que dar ahora tripletas de datos. Ve amoslo mediante el siguiente ejemplo, cuyo resultado gr aco aparece en la gura 3.3. >> >> >> >> >> x = linspace(0,10*pi); plot3(x,sin(x),cos(x),x-) title(Helice,FontSize,24) xlabel(x,FontSize,18), ylabel(sen(x),FontSize,18) zlabel(cos(x),FontSize,18)
En esta gr aca hemos aumentado el tama no de letra utilizada para el t tulo y las etiquetas de los ejes para que fueran legibles al insertar el chero postscript que nos proporciona Matlab A en el documento L TEXque genera este texto. Por u ltimo observar que todos los comandos vistos para gr acas 2D se aplican de forma an aloga para las gr acas en tres dimensiones (axis, text, legend, etc.).
28
Hlice
Representaciones gr acas
0.5
cos(x)
0.5
1 1 0.5 30 0 0.5 15 10 1 5 0 25 20 35
sen(x)
3.4.2.
Supercies 3D
Para poder representar gr acamente una supercie tridimensional mediante Matlab es necesario denir en primer lugar una malla rectangular1 en el plano x y y debemos conocer el valor de la coordenada z en los nodos (intersecciones) de esa malla. Esto har a necesario utilizar t ecnicas de interpolaci on cuando los datos de la supercie que queremos representar vengan dados de cualquier otra forma que no sea la descrita. Veamos como representar amos la supercie denida por una funci on de dos variables z = f (x, y ). En primer lugar habr a que denir la malla donde se evaluar a la funci on. Esto se hace mediante el comando meshgrid de la siguiente forma: >> x = -10:0.5:10; >> y = x; >> [xm,ym] = meshgrid(x,y); sen x2 +y 2 Consideremos, por ejemplo, la funci on f (x, y ) = 2 2 , que debemos evaluar en los nodos
x +y
de la malla. >> r = sqrt(xm.^2+ym.^2)+eps; % sumamos eps para evitar dividir entre 0 >> zm = sin(r)./r; Por u ltimo, para generar la supercie 3D, haremos >> mesh(xm,ym,zm) El resultado de estos comandos puede verse en la gura 3.4. Ligeras variantes del comando mesh son meshc que representa adem as de la supercie las isol neas de la funci on f (x, y ) y meshz que dibuja una pared lateral de referencia. Otros comandos an alogos son surf, surfc y surfl, los cuales producen una supercie 3D coloreada o tambi en el comando waterfall. Se recomienda jugar con estos comandos tomando el ejemplo suministrado o cualquier otro para ver las diferencias entre cada uno de ellos.
1
3.4 Gr acos 3D
29
Figura 3.4: Gr aca de una supercie denida por z = f (x, y ) (comando mesh). Datos dados por una nube de puntos
Para realizar la representaci on gr aca de una supercie que pasa una nube de puntos 3D arbitraria es necesario, en primer lugar interpolar los datos sobre una malla, para luego representar la supercie de forma est andard. Ve amos los pasos a seguir mediante un ejemplo.
% Coordenadas aleatorias de los puntos en la nube puntos 3D. xd=random(unid,20,100,1) % coordenadas x, yd=random(unid,20,100,1) % y, zd=random(norm,10,2,100,1) % z dadas de forma aleatoria % Representar la nube de puntos. plot(xd,yd,o) % Construimos una malla que contenga a los puntos de coordenadas (xd,yd). [xi,yi] = meshgrid(0:.5:20,0:.5:20); % Interpolamos los valores de zd en la malla (xi,yi). zi = griddata(xd,yd,zd,xi,yi,cubic); % Representamos graficamente. mesh(xi,yi,zi) El resultado de este conjunto de comandos puede verse en la gura 3.5.
Algunos comandos m as
Como indic abamos al principio las posibilidades gr acas de Matlab son amplias y, por tanto, existen tambi en un gran n umero de comandos. A continuaci on nos limitamos a enumerar algunos de los que consideramos pueden sernos de alguna utilidad (aunque podremos vivir sin ellos). No hay que olvidar que, si en cualquier momento, estamos interesados en conocer la sintaxis exacta de cualquiera de estos comandos u otros, as que acci on realizan, bastar a hacer help comando en una ventana Matlab.
30
Representaciones gr acas
15
10
5 20 15 10 10 5 0 0 5 15 20
Figura 3.5: Representaci on de la supercie que pasa por una nube de puntos 3D.
contour3 shading view rotate hidden fill3 representa isol neas sombreado en colores (opciones flat, interp, faceted) especica el punto de observaci on para una gr aca 3-D rota respecto a un origen y direcci on dados oculta la malla rellena pol gonos 3D
4.1.
Para denir variables simb olicas la sintaxis m as sencilla entre las varias posibles es, >> syms x a b c en el caso de que queramos denir x, a, b y c como variables simb olicas. Ahora podemos denir la siguiente matriz simb olica >> A = [a 1 b; c 1 c; 0 x 0] y calcular su determinante en funci on de las variables simb olicas >> d= det(A) d = -a*c*x+c*b*x
4.2.
Si ahora quisi eramos denir una funci on con variables simb olicas bastar a con hacer, por ejemplo, >> f = a*x^2 + b*x + c + x*cos(x)
Diferenciaci on
Para diferenciar (en este caso respecto de x1 ) esta expresi on simb olica basta hacer >> diff(f) ans = 2*a*x+b+cos(x)-x*sin(x)
El comando diff de Matlab calcula la derivada respecto de la variable simb olica que hallamos denido m as pr oxima a la x en el alfabeto.
1
32
Para obtener la derivada respecto a otra variable, por ejemplo a, haremos >> diff(f,a) ans = x^2 Tambi en se pueden obtener derivadas de orden superior haciendo >> diff(f,2) ans = 2*a-2*sin(x)-x*cos(x) Tambi en podemos diferenciar cada una de las componentes de una matriz simb olica mediante el comando diff, >> A = [cos(a*x) sin(a*x); -sin(a*x) cos(a*x)]; >> diff (A) ans = [ -sin(a*x)*a, cos(a*x)*a] [ -cos(a*x)*a, -sin(a*x)*a] Por u ltimo comentar que Matlab permite, mediante el comando jacobian(f,v), calcular la matrix Jacobiana del escalar o vector f con respecto al vector v (hacer help jacobian para ver alg un ejemplo). Ejercicio: obtener el Jacobiano de la transformacion de coordenadas Eucl deas a coordenadas esf ericas usando el comando jacobian de Matlab.
Integraci on
Para integrar una funci on simb olica haremos >> int(f) ans = 1/3*a*x^3+1/2*b*x^2+c*x+cos(x)+x*sin(x) este comando nos proporciona una primitiva a la cual habr a que a nadirle una constante arbitraria. Para el c alculo de integrales denidas la sintaxis del comando ser a, >> int(f,0,2) ans = 8/3*a+2*b+2*c+cos(2)+2*sin(2)-1 Si hubieramos querido integrar respecto de la variable a deber amos haber escrito, >> int(f,a) ans = 1/2*a^2*x^2+b*x*a+c*a+x*cos(x)*a Para ver m as ejemplos hacer help sym/int.m.
33
L mites
La herramienta de c alculo simb olico de Matlab nos permite calcular el l mite de funciones de forma sencilla, por ejemplo, >> syms h >> limit((sin(x+h) - sin(x))/h,h,0) ans = cos(x) >> syms n >> limit((1 + x/n)^n,n,inf) ans = exp(x) En el caso de estar interesados en calcular l mites laterales se usar an las opciones left y right, as se tiene, >> limit(1/x,x,0) ans = NaN >> limit(1/x,x,0,left) ans = -inf >> limit(1/x,x,0,right) ans = inf
Series de Taylor
El comando taylor(f,n,a) nos permite obtener el desarrollo de Taylor de grado n de la funci on f en el punto x0 = a. As , por ejemplo, >> h = exp(x); >> T = taylor(h,6) T = 1+x+1/2*x^2+1/6*x^3+1/24*x^4+1/120*x^5 >> pretty(T) Si queremos comparar gr acamente la funci on f y la correspondiente suma de Taylor haremos, >> xd = -2:0.05:2; yd = double(subs(h,x,xd)); >> ezplot(T,[-2,2]); hold on; >> plot(xd, yd, r-.) Nota: los comandos subs, double y ezplot se estudiar an en los apartados 4.3 y 4.5.
34
4.3.
Veremos ahora c omo podemos especicar los valores de los par ametros en una expresi on simb olica o c omo evaluar una funci on simb olica en un punto dado. Para ello utilizaremos el comando de sustituci on subs. Por ejemplo, si queremos evaluar la funci on f anteriormente denida en x = 6, manteniendo a a, b, c como par ametros, haremos >> subs(f,x,6) ans = 36*a+6*b+c+6*cos(6) El resultado sigue siendo una expresi on simb olica. Si ahora queremos especicar los valores de los par ametros a, b y c, haremos, por ejemplo, >> g = subs(f, [a b c], [3 2 -1]) g = 3*x^2+2*x-1+x*cos(x) Se tiene ahora una expresi on simb olica que depende s olo de la variable x. Si ahora queremos evaluar esta funci on en un punto dado, por ejemplo x = 3,5, tendremos hacer una nueva sustituci on mediante el comando subs, >> w = subs(g, x, 3.5) w = 171/4+7/2*cos(7/2) De nuevo w sigue siendo una cantidad simb olica, si queremos convertir w en un n umero en coma otante en doble precisi on haremos, >> w = double (w) w = 39.4724 Para obtener m as informaci on y varios ejemplos hacer help sym/subs.m.
4.4.
35
Tambi en podemos resolver sistemas de ecuaciones como se muestra mediante el siguiente ejemplo, >> [u,v] = solve(a*u^2 + v^2 = 0,u - v = 1) u = [ 1/2/(a+1)*(-2*a+2*(-a)^(1/2))+1] [ 1/2/(a+1)*(-2*a-2*(-a)^(1/2))+1] v = [ 1/2/(a+1)*(-2*a+2*(-a)^(1/2))] [ 1/2/(a+1)*(-2*a-2*(-a)^(1/2))] >> vs = subs(v,a,2) vs = [ -2/3+1/3*(-2)^(1/2)] [ -2/3-1/3*(-2)^(1/2)] >> vv= double (vs) vv = -0.6667 + 0.4714i -0.6667 - 0.4714i
36
4.5.
Para la representaci on gr aca de funciones denidas simb olicamente con una u nica variable simb olica se utiliza el comando ezplot. As , para representar gr acamente una funci on simb olica en un intervalo [a, b] haremos ezplot(f,[a,b]), por ejemplo, >> ezplot(g, [0,10]) o tambi en, >> ezplot tan(sin(x))-sin(tan(x)) >> ezplot (tan(sin(x))-sin(tan(x)))
4.6.
SYMBFACT Symbolic factorization analysis. DEMOS Demo list for the Symbolic Math Toolbox DSOLVE Symbolic solution of ordinary dierential equations. POLY2SYM Polynomial coecient vector to symbolic polynomial. SOLVE Symbolic solution of algebraic equations. SYMS Short-cut for constructing symbolic objects. ZETA Symbolic Riemann zeta function. SUBS Symbolic substitution. SYMDEMOS Set up Symbolic Math Toolbox command-line demos. SYMEQNDEMO Demonstrate symbolic equation solving. SYMINTRO Introduction to the Symbolic Math Toolbox. SYMLINDEMO Demonstrate Symbolic Linear Algebra. ACOS Symbolic inverse cosine. ACOSH Symbolic inverse hyperbolic cosine. ACOT Symbolic inverse cotangent. ACOTH Symbolic inverse hyperbolic cotangent. ACSC Symbolic inverse cosecant. ACSCH Symbolic inverse hyperbolic cosecant. ASEC Symbolic inverse secant. ASECH Symbolic inverse hyperbolic secant. ASIN Symbolic inverse sine. ASINH Symbolic inverse hyperbolic sine. ATAN Symbolic inverse tangent. ATANH Symbolic inverse hyperbolic tangent. BESSELI Symbolic Bessel function, I(nu,z). BESSELJ Symbolic Bessel function, J(nu,z). BESSELK Symbolic Bessel function, K(nu,z). BESSELY Symbolic Bessel function, Y(nu,z). COS Symbolic cosine function. COSH Symbolic hyperbolic cosine. COT Symbolic cotangent. COTH Symbolic hyperbolic cotangent.
37
38
TRIU Symbolic upper triangle. UMINUS Symbolic negation. CCODE C code represention of a symbolic expression. COLON Symbolic colon operator. CONJ Symbolic conjugate. ERF Symbolic error function. EXPM Symbolic matrix exponential. FORTRAN Fortran represention of a symbolic expression. GAMMA Symbolic gamma function. IMAG Symbolic imaginary part. RANK Symbolic matrix rank. REAL Symbolic real part. ZETA Symbolic Riemann zeta function. DIFF Alternative entry to the symbolic dierentiation function. INT Alternative entry to the symbolic integration function.
5.1.
Ajuste de curvas
Mediante las t ecnicas de ajuste de curvas lo que buscamos es aproximar una cierta nube de puntos (datos) mediante una curva regular que se ajuste lo mejor posible a esos datos sin tener que pasar necesariamente por ellos. En Matlab el problema del ajuste de curvas mediante m nimos cuadrados lo implementa el comando polyfit. Veamos como utilizar este comando. >> x = [0 .1 .2 .3 .4 .5 .6 .7 .8 .9 1.]; >> y = [0.34 2.39 4.33 6.87 7.56 8.88 9.01 10.77 9.33 9.05 12.1]; >> plot(x,y,o-) >> p = polyfit(x,y,2) p = -11.9103 21.8821 0.5576 Si queremos ahora representar el polinomio de segundo grado que hemos obtenido como mejor aproximaci on m nimo cuadrado de estos datos haremos uso del comando polyval: >> xd = linspace(0,1,100); % Generar discretizacion del eje x >> yp = polyval(p,xd); % Evaluar el polinomio en esos puntos >> plot(x,y,o-,xd,yp,:) % Representar graficamente La gura 5.1 nos presenta los datos y la gr aca del polinomio de segundo grado que los ajusta en el sentido de los m nimos cuadrados. Si ahora queremos comparar esta aproximaci on con el ajuste polin omico de grado 10 (es decir con la interpolaci on de Lagrange de los datos) har amos: >> >> >> >> pp = ypp= hold axis polyfit(x,y,10) polyval(pp,xd); on; plot(xd,ypp,-r) tight % % % % Polinomio de grado 10 (de Lagrange) Evaluar el polinomio de Lagrange Representamos en la misma grafica Ejes ajustados a los datos
40
14 20 12 18 16 14 8 12 10 6 8 4 6 4 2 2 0
10
0.2
0.4
0.6
0.8
0.2
0.4
0.6
0.8
5.2.
Interpolaci on 1D
La diferencia entre interpolaci on y ajuste polin omico reside en que en la interpolaci on nuestros datos son esencialmente correctos y lo que se pretende es construir una funci on cuya gr aca pase por esos puntos y que nos permita describir el comportamiento de la variable representada en los puntos intermedios. El ejemplo m as sencillo de interpolaci on (lineal a trozos) es la forma en que Matlab realiza sus gr acas. As para valores intermedios entre dos datos la interpolaci on lineal a trozos supone un valor dado por la recta que une los dos puntos contiguos dados por los datos. Obviamente cuanto mayor sea el n umero de puntos considerados y menor la distancia entre ellos, mejor ser a la aproximaci on a la funci on subyacente. Veamos esto con un ejemplo. >> >> >> >> xf = linspace(0,2*pi,100); % Discretizacion fina. xg = linspace(0,2*pi,8); % Discretizacion grosera. plot(xf,sin(xf),xg,sin(xg),-o) % Representacion grafica axis([0,2*pi,-1.1,1.1])
5.2 Interpolaci on 1D
41
El comando espec co que implementa Matlab para realizar la interpolaci on 1d es el comando interp1. Continuemos con el ejemplo de la funci on seno, y consideremos la siguiente tabla de valores del sen(x).
x sen(x)
Para aproximar el valor del sen(72) a partir de estos datos podemos seguir varias estrategias de interpolaci on. Veamos algunas de ellas. % Introducir los datos. x = 60:5:80; sx = [0.866025 0.906308 0.939693 0.965926 0.984808]; % o tambien sx = sin(x); % % 1) Interpolacion lineal a trozos. s72 = interp1(x,sx,72) s72 = 0.9502 % o tambien s72 = interp1(x,sx,72,linear) % % 2) Interpolacion cubica a trozos. s72 = interp1(x,sx,72,cubic) s72 = 0.9511 % % 3) Interpolacion mediante splines. s72 = interp1(x,sx,72,spline) s72 = 0.9511 % 4) Interpolacion mediante el vecino mas cercano. s72 = interp1(x,sx,72,nearest) s72 = 0.9397 Por u ltimo, si quisi eramos llevar a cabo una interpolaci on de Lagrange de grado 4 construyendo el polinomio de grado n = 4 que pasa por los n + 1 datos suministrados, har amos uso del comando polyfit. As pues, bastar a hacer, >> format long % Formato largo para que no parezca que varios % coeficientes del polinomio son cero >> ps = polyfit(x,sx,4) >> ps = Columns 1 through 4 0.00000000366667 -0.00000132866667 0.00002808833333 0.01653771666672 Column 5 0.01211599999911
42
>> s72 = polyval(ps,72) s72 = 0.95105681600000
Tambi en se pueden realizar interpolaciones de Lagrange de menor grado (no merece la pena hacer interpolaciones lineal o c ubica pues esto, como ya lo hemos visto, lo hace Matlab de forma autom atica y es de esperar que tambi en de forma optima, mediante el comando interp1). Probemos por ello a construir el polinomio de interpolaci on de grado 2 que interpola la funci on seno en x0 = 65, x1 = 70, x2 = 75. >> xx = x(2:4); >> sxx = sx(2:4); >> pss = polyfit(xx,sxx,2) pss = -0.00014304000000 0.02598740000000 >> s72 = polyval(pss,72) s72 = 0.95104444000000
-0.17852900000002
Si queremos conocer el valor que Matlab calcula para el sen(72) con 15 cifras signicativas basta teclear, >> format long >> sin(72*pi/180) >> ans = >> 0.95105651629515
5.3.
Interpolaci on 2D
Veremos a continuaci on los comandos b asicos que nos van a permitir resolver problemas de interpolaci on en el plano. Los valores a interpolar podr an venir dados bien por una nube de puntos distribuidos de forma regular o arbitraria, o bien dados por una funci on z = f (x, y ) discretizada. En el caso de que los datos est en dados en todos los nodos de un mallado rectangular, entoces el problema de la interpolaci on bidimensional se resuelve f acilmente con Matlab. Ve amoslo con un ejemplo. Supongamos que tenemos los valores de una cierta variable dados en los nodos equidistribuidos de una malla del rect angulo [0, 5] [0, 4], por ejemplo, >> x = 0:5; y = 0:4; donde dichos valores vienen dados en la matriz z, >> z = [ 9 10 9.5 8 10 11 8 11 10.5 11.5 9 9 7 9 11 10 10 8 9 10 10.5 11 10.5 9 10 9 8.5 9 8 8];
5.3 Interpolaci on 2D
Para dibujar estos valores bastar a hacer >> mesh(x,y,z)
43
cuyo resultado puede verse en la gura 5.3. Ahora para obtener el valor interpolado en un
Figura 5.3: Comando mesh para representar datos dados sobre una malla rectangular.
punto de este rect angulo, por ejemplo en el punto (3,5, 2,8) har amos, >> zi = interp2(x,y,z,3.5,2.8) zi = 10.6000 La interpolaci on utilizada por defecto es la lineal pero tambi en podemos utilizar interpolaci on cubica, cubic, o la interpolaci on que toma como valor en el punto dado el del nodo m as pr oximo, nearest, por ejemplo, >> zi = interp2(x,y,z,3.5,2.8,cubic) zi = 10.8975 En el caso de que queramos interpolar los valores dados en una malla m as na haremos lo siguiente: >> >> >> >> >> >> >> >> >> xi = linspace(0,5,30); % Refinamos la malla en la direcci\on de x. yi = linspace(0,4,25); % Refinamos la malla en la direcci\on de y. [xxi,yyi] = meshgrid(xi,yi); % Generamos una malla rectangular. zzi = interp2(x,y,z,xxi,yyi,cubic); % Interpolamos. mesh(xxi,yyi,zzi) % Representamos graficamente los datos interpolados. hold on [xx,yy] = meshgrid(x,y); % Malla de los datos originales. plot3(xx,yy,z,or) % Representamos los datos originales. hold off
44
12 11 10 9 8 7 6 4 3 2 1 1 0 0 2 4 3 5
5.3 Interpolaci on 2D
>> >> >> >>
45
plot(xd,yd,.) % Puntos donde tenemos dadas profundidades. [xi,yi] = meshgrid(-40:2:160,0:2:120); % Crear malla rectangular. zi = griddata(xd,yd,zd,xi,yi,cubic); % Interpolar datos en la malla. meshc(xi,yi,-zi) % Representar graficamente.
500 0 500 1000 1500 2000 120 100 140 160 100 120
80
60
40
20
0 40 20
20
40
60
80
Figura 5.5: Comando mesh para representar datos dados sobre una malla rectangular.
46
6.1.
x = random(norm,10,2,1,100); for i = 1:length(x) if x(i) > 0 sx(i) = sqrt(x(i)); else sx(i) = 0; end end x = random(norm,10,2,1,100); sx = zeros(size(x)) for i = 1:lenght(x) if x(i) > 0 sx(i) = sqrt(x(i)); end end
48
Bibliograf a
Bibliograf a
[1] P. Quintela. Introducci on a Matlab y sus Aplicaciones. Servicio de Publicaciones de la Universidad de Santiago, 1997. [2] Inc. The MathWorks. Matlab. Edici on de Estudiante. Versi on 4. Prentice Hall, 1996. [3] Inc. The MathWorks. The Student Edition of Matlab. Version 5 Users Guide. Prentice Hall, 1997.