El propsito de estas notas es hacer una rpida introduccin al matlab. Son
slo unas pequeas muestras para dar idea de como funciona este programa. Para un estudio ms serio deben consultarse otras referencias. En particular las que damos al final de esta pgina. El nombre de Matlab viene de Matrix Laboratory y como el nombre indica matlab es especialmente fuerte en el tratamiento de matrices. Estos fueron sus orgenes, a los que se han ido incorporando sucesivamente ms capacidades, sobretodo grficas. Matlab es una potente calculadora, por ejemplo calcula la suma de dos nmeros
>> 2+2 ans = 4 Aunque el ejemplo es sencillo ya vemos como actua matlab, se escriben las instrucciones en la lnea de comandos >> y despus de pulsar la tecla Intro aparece el resultado ms abajo como variable ans. El resultado no aparece visible en la pantalla si ponemos punto y coma ; al final de las instrucciones, como en
>> A=rand(6); B=inv(A); B*A; Si quitamos los puntos y comas de esta ltima expresin veremos el resultado. Para escribirla de nuevo podemos usar la flecha hacia arriba del teclado, que nos recupera los comandos escritos anteriormente en la sesin.
>> A=rand(6), B=inv(A), B*A A = 0.1338 0.4514 0.6831 0.0164 0.7176 0.1536 0.2071 0.0439 0.0928 0.1901 0.6927 0.6756 0.6072 0.0272 0.0353 0.5869 0.0841 0.6992 0.6299 0.3127 0.6124 0.0576 0.4544 0.7275 0.3705 0.0129 0.6085 0.3676 0.4418 0.4784 0.5751 0.3840 0.0158 0.6315 0.3533 0.5548 B = -18.9422 -0.1768 -27.4583 8.2189 14.1721 17.0665 10.6427 -0.8112 14.3231 -3.3853 -9.0470 -7.7695 5.3157 -0.9261 7.4863 -1.8170 -2.6566 -5.1051 4.6141 -0.4972 6.8101 -3.2198 -2.1772 -3.1550 -9.7318 1.3315 -15.5596 3.3890 7.9718 9.3641 13.0642 0.4891 20.4944 -4.6187 -10.9522 -12.7382 ans = 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0 0.0000 0 -0.0000 -0.0000 1.0000 0.0000 -0.0000 -0.0000 -0.0000 -0.0000 0.0000 1.0000 -0.0000 0.0000 0.0000 0.0000 -0.0000 0.0000 1.0000 0.0000 0.0000 -0.0000 0.0000 0 0.0000 1.0000 Obsrvese la rapidez con que se han calculado estas matrices A=rand(6) encuentra una matriz 6x6 de nmeros aleatorios (cada uno entre 0 y 1), inv(A) calcula su inversa y luego comprobamos que B*A es la matriz identidad. Los nmeros negativos que aparecen son debido al redondeo (en este caso seran nmeros muy pequeos, pero negativos). Veamos como maneja matab los nmeros:
>> pi ans = 3.1416 >> format long >> pi ans = 3.14159265358979 Aunque nos da el valor de pi con distinto nmero de decimales en realidad matlab trabaja internamente con doble presicin, pero nos muestra distintos formatos. Para ver los distintos formatos basta con usar el help:
>> help format (aparece el cuadro de la derecha -->) Ejemplo: 10*pi 10*exp(1) format short 31.4159 format long 31.4159265358 9793 format short e 3.1416e+001 format long e 3.141592653589793e +001 format short g 31.416 format long g 31.4159265358979 27.1828 27.18281828459045 2.7183e+001 2.718281828459045e+ 001 27.183 27.1828182845905 403b2ecd2dd96d44 27.18 2528/93 FORMAT SHORT Scaled fixed point format with 5 digits. FORMAT LONG Scaled fixed point format with 15 digits. FORMAT SHORT E Floating point format with 5 digits. FORMAT LONG E Floating point format with 15 digits. FORMAT SHORT G Best of format hex 403f6a7a29553 85e format bank 31.42 format rat 3550/113 fixed or floating point format with 5 digits. FORMAT LONG G Best of fixed or floating point format with 15 digits. FORMAT HEX Hexadecimal format. FORMAT + The symbols +, - and blank are printed for positive, negative and zero elements. Imag inary parts are ignored. FORMAT BANK Fixed format for dollars and cents. FORMAT RAT Approximation by ratio of small integers. All computations in MATLAB are done in double precision. Cada nmero se guarda en memoria como un vector de 8 bytes, lo que da una mantisa de unos 15 16 dgitos decimales. Al ser 8 bytes = 64 bits de memoria, cada bit es como si fuera una cajita donde se almacenan los ceros o unos corrspondientes al nmero en binario. De estas cajitas o bits, una de ellas corresponde al signo (+ -), 11 bits al exponente y el resto, esto es 52 bits a la mantisa. Un nmero x ser por tanto x= signo x mantisa x 10 E
Los 2 11 =2048 posibles exponentes E se distribuyen entre -1023 s E s 1024, siendo el nmero ms grande posible del orden de (2-eps)*2 1023 ~ 1,7977x 10 308 y el nmero ms pequeo del orden de 2 -1022 ~ 2,25x10 -308 . La mantisa de 52 bits nos da un epsilon mquina del orden de eps=2 -52 ~ 2,22x10 -16 . Recordenmos que el epsilon mquina eps se define como el nmero ms grande eps tal que la mquina no distingue entre 1 y 1+eps. El nmero real ms grande, ms pequeo y epsilon mquina respectivamente, se obtienen con
>>realmin >>realmax >>eps
Con matlab podemos ir escribiendo los comandos uno tras otro, pero cuando tenemos que hacer un pequeo programa o escribir muchos comandos suele resultar ms til escribir un fichero con las instrucciones y luego hacer que matlab los ejecute. Estos son los ficheros .m que no son ms que ficheros de texto a los que luego ponemos la extensin .m . Matlab lleva incorporado un editor que podemos usar para este propsito. Buscamos en File -> New -> M-file y escribimos en el editor que aparece
format long primero=2.1; segundo=2.1 for n=1:40 tercero=4*primero-3*segundo primero=segundo; segundo=tercero; end que luego guardamos en matlab con el nombre diferencias.m , ya que lo que hace este programita es calcular los sucesivos trminos de la sucesin a n+2 =4 a n 3 a n+1 empezando con a 1 =2.1 y a 2 =2.1 En este caso, como no hemos puesto punto y coma despus de la lnea de tercero, los resultados se irn escribiendo en la pantalla, unos debajo de otros a medida que se van calculando.
2.10000000000000 2.10000000000000 2.10000000000000 2.09999999999999 2.10000000000002 2.09999999999991 2.10000000000036 2.09999999999854 2.10000000000582 2.09999999997672 2.10000000009313 2.09999999962747 2.10000000149012 2.09999999403954 2.10000002384186 2.09999990463257 El resultado es sorprendente !! Esperaramos ver que a n =2.1, para todo n. Por qu aparece este extrao comportamiento? En realidad la ecuacin en diferencias a n+2 =4 a n 3 a n+1 tiene por solucin donde
siendo C 1 y C 2 dos constantes cualesquiera. Las condiciones iniciales a 1 =a 2 =2.1 2.10000038146973 2.09999847412109 2.10000610351563 2.09997558593750 2.10009765625000 2.09960937500000 2.10156250000000 2.09375000000000 2.12500000000000 2 2.50000000000000 0.50000000000000 8.50000000000000 -23.50000000000000 1.045000000000000e+0 02 - 4.075000000000000e+0 02 1.640500000000000e+0 03 - 6.551500000000000e+0 03 2.621650000000000e+0 04 - 1.048555000000000e+0 05 4.194325000000000e+0 05 - 1.677719500000000e+0 06 6.710888500000000e+0 06 - 2.684354350000000e+0 07 1.073741845000000e+0 08 determinan la solucin con constantes C 1 =1, C 2 =0. Pero debido a que 2.1 en base dos tiene una fraccin peridica que se repite indefinidamente, ya que
al calcular tercero=tercero=4*primero-3*segundo, resulta que si eps es un nmero muy pequeo comparable al epsilon mquina a 3 =tercero=2.1+eps al iterar ahora de nuevo con a 2 =2.1, a 3 =2.1+eps, como nuevas condiciones iniciales, resulta que la constante C 2 ya no es 0. Lo que hace que la solucin errnea aumente exponencialmente y enmascare completamente la solucin prevista. Es un claro ejemplo de inestabilidad numrica. !No te fes de los ordenadores!
Comentarios al programa:
- 1) Si aadimos la instruccin fprintf(' %16.7f\n ',segundo); aparecer una pantalla ms ordenada con los resultados en columna. - 2)
format long primero=2.1; segundo=2.1; fi=fopen('resultados.txt','w'); for n=1:40 Este programa abre un fichero de texto llamado resultados.txt donde se escribirn tercero=4*primero-3*segundo; primero=segundo; segundo=tercero; fprintf(fi,'%16.7f\n',segundo); end fclose(fi) los clculos en columna. Buscar en >> help fprintf para ms informacin sobre este y otros comandos parecidos. - 3) a(1)=2.1; a(2)=2.1; for n=1:18 a(n+2)=4*a(n+1)- 3*a(n); end Este otro programa tiene una estructura ms apropiada para Matlab ya que va incrementando las componentes de un vector a. Que luego se puede usar , por ejemplo, para representar grficamente como >>plot(a) Ver >>whos para observar las variables que estn en memoria y como van cambiando. En matlab hay unos aadidos llamados Toolboxes que incorporan ms funciones y posibilidades. Una de ellas, que se incorpora en todas las versiones de Matlab para estudiantes, se llama Symbolic Toolbox. Con ella podemos trabajar con el nmero de dgitos de mantisa que deseemos, esta funcin es vpa. Buscar en help vpa. El ejemplo siguiente nos da los 800 primeros dgitos de pi:
>> vpa(pi,800) ans = 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862 80348253 4211706798214808651328230664709384460955058223172535940812848111745028410270193852110 55596446 2294895493038196442881097566593344612847564823378678316527120190914564856692346034861 04543266 4821339360726024914127372458700660631558817488152092096282925409171536436789259036001 13305305 4882046652138414695194151160943305727036575959195309218611738193261179310511854807446 23799627 4956735188575272489122793818301194912983367336244065664308602139494639522473719070217 98609437 0277053921717629317675238467481846766940513200056812714526356082778577134275778960917 36371787 2146844090122495343014654958537105079227968925892354201995611212902196086403441815981 36297747 713099605187072113499999983729780499510597317328160963186 Como otro ejemplo, calculemos con mantisa 3 la suma de los primeros 20 trminos de la serie armnica, esto es
clear all suma=1 for n=2:20 suma=vpa(vpa(suma,3)+vpa(1/n,3),3) end El resultado que obtenemos es suma =3.60. De no haber calculado con esta mantisa obtendramos >> suma =3.59773965714368 suma=0; tic for m=1:20 for n=1:1000*m suma=suma+1 /n; end t(m)=toc; end plot(t)
El programita de aqu arriba utiliza una grfica para representar el tiempo que ha tardado Matlab en sumar distintas sumas parciales de esta serie armnica. Cul es la suma de la serie armnica infinita? Todos sabemos que diverge, esto es, que si vamos sumando ms y ms trminos las sumas parciales se hacen tan grandes como queramos. Hay una manera divertida de pensar en la suma de los trminos de una serie. Se puede pensar que tenemos una pulguita que va dando saltitos, cada vez, en este caso, primero de un metro, luego de medio, luego de una tercera parte, y as sucesivamente. Esto es que en el salto n avanzara una distancia 1/n. Que esta serie diverge significa que si el nmero de saltos es suficientemente grande nuestra amiga llegara de la Autnoma a Madrid, a la Luna, ... llegara tan lejos como queramos. !!Pero si la calculamos con el ordenador esta suma sera finita !! Has pensado en cul sera la suma?
Tal como hemos dicho Matlab est muy adaptado al clculo con vectores y matrices, por ejemplo en las siguientes instrucciones >> x=[0 : 0.1 : 1] significa que x es un vector cuyas componentes empiezan en 0, se van incrementando de 0.1 en 0.1 y terminan en 1. Luego >>y=sin(x) es un vector cuyas componentes son los senos de las anteriores, >>disp([x' y' z']) muestra los traspuestos de estos vectores. El resultado se puede ver como sigue:
>> x=[0:0.1:1]; y=sin(x); z=cos(x); >> '------------------------------------------------------- ' >> ' x seno(x) cos(x) ', disp([x' y' z']) ans = x seno(x) cos(x) ---------------------------------------------------------- 0 0 1.00000000000000 0.10000000000000 0.09983341664683 0.99500416527803 0.20000000000000 0.19866933079506 0.98006657784124 0.30000000000000 0.29552020666134 0.95533648912561 0.40000000000000 0.38941834230865 0.92106099400289 0.50000000000000 0.47942553860420 0.87758256189037 0.60000000000000 0.56464247339504 0.82533561490968 0.70000000000000 0.64421768723769 0.76484218728449 0.80000000000000 0.71735609089952 0.69670670934717 0.90000000000000 0.78332690962748 0.62160996827066 1.00000000000000 0.84147098480790 0.54030230586814 En Matlab podemos escribir un conjunto de instrucciones que forman un fichero.m, pero tambin podemos utilizar una function. Hay una diferencia entre ambos ya que en un fichero.m los datos y las variables son como si las hubirmos escrito desde la consola. En una funcin las variables son internas, no cambian ni afectan las externas. Por cierto que conviene muchas veces limpiar las variables externas con la instruccin >>clear all si no queremos tener clculos confusos. Para limpiar la pantalla usaremos >>clc Un ejemplo de funcin sera el programita siguiente, que calcula los 20 primeros trminos de la serie exponencial
function [s]=serie(x) term=1; suma=1; for n=1:20 term=term*x/n; suma=suma+term; end s=suma La funcin se llama desde la consola como >>serie(x), Por ejemplo:
>>serie(1) suma=2.71828182845905 Resultado que ya da todas las cifras decimales correctas del numero e hasta la precisin de Matlat, como se puede comprobar fcilmente. Con esta funcin podemos comprobar por ejemplo que al sumar una suma alternada afecta en mucho el error de redondeo, ya que
>> exp(-8)-serie(-8) ans = -0.13229825662640 Mientras que
>> 1/serie(8)-exp(-8) ans =3.152568231321777e-008
Grficos con Matlab Pueden verse en los siguientes ejemplos: Un comando til en matlab es ginput. Ver >>help gineput (tambin gtext). Abajo el pequeo programita dibuja y=x(x-1)sin x, luego sobre la figura, permite tomar 6 puntos con el ratn, que al final muestra en la consola.
>> f='x*(x-1)*sin(x)'; ezplot(f);[x,y]=ginput(6); [x,y] >> help plot Various line types, plot symbols and colors may be obtained with PLOT(X,Y,S) where S is a character string made from one element from any or all the following 3 colunms: y yellow . point - solid m magenta o circle : dotted c cyan x x-mark -. dashdot r red + plus -- dashed g green * star b blue s square w white d diamond k black v triangle (down) ^ triangle (up) < triangle (left) > triangle (right) p pentagram h hexagram Otros ejemplos:
Ventana de comandos de matlab
close all u=-8:0.5:8; v=u; [U,V]=meshgrid(u,v ); R=sqrt(U.*U+V.*V)+ eps; W=sin(R)./R; mesh(W)
>>[x y z]=peaks; >>contour(x,y,z,'k') >>pcolor(x,y,z) >>shading interp >>Z=peaks; >> figure (2); [C,h]=contour(Z,10); >> clabel(C,h) produce las siguientes figuras:
>> help elfun Trigonometric. sin - Sine. sinh - Hyperbolic sine. asin - Inverse sine. asinh - Inverse hyperbolic sine. cos - Cosine. cosh - Hyperbolic cosine. acos - Inverse cosine. acosh - Inverse hyperbolic cosine. tan - Tangent. tanh - Hyperbolic tangent. atan - Inverse tangent. atan2 - Four quadrant inverse tangent. atanh - Inverse hyperbolic tangent. sec - Secant. sech - Hyperbolic secant. asec - Inverse secant. asech - Inverse hyperbolic secant. csc - Cosecant. Exponential. exp - Exponential. log - Natural logarithm. log10 - Common (base 10) logarithm. log2 - Base 2 logarithm and dissect floating point number. pow2 - Base 2 power and scale floating point number. sqrt - Square root. nextpow2 - Next higher power of 2. Complex. abs - Absolute value. angle - Phase angle. complex - Construct complex data from real and imaginary parts. conj - Complex conjugate. imag - Complex imaginary part. real - Complex real part. unwrap - Unwrap phase angle. isreal - True for real array. cplxpair - Sort numbers into complex conjugate pairs. csch - Hyperbolic cosecant. acsc - Inverse cosecant. acsch - Inverse hyperbolic cosecant. cot - Cotangent. coth - Hyperbolic cotangent. acot - Inverse cotangent. acoth - Inverse hyperbolic cotangent. Rounding and remainder. fix - Round towards zero. floor - Round towards minus infinity. ceil - Round towards plus infinity. round - Round towards nearest integer. mod - Modulus (signed remainder after division). rem - Remainder after division. sign - Signum.
Ver tambin >>help specfun (Bessel , gamma, Airy). >>help mfun >>mfunlist (Zeta de Riemann, Polinomios ortogonales)
cardioide: >>ezpolar('1+cos(t)' ) Otros comandos tiles de matlab:
>> date >> calendar >> clear x, clear all limpia la variable x, limpia todas las variables >> close , close all cierra la figura actual, cierra todas las figuras >> axis([minx maxx miny maxy]) encuadra figura en este marco >> break sale de dentro de un if o de un while >> clc limpia la pantalla Control C ( Control Z) acaba con la ejecucin de un clculo de matlab (en caso necesario). Un juego: Vamos a mandar mensajes secretos Julio Csar se comunicaba con sus gobernadoresy generales con mensajes codificados. Haca corresponder a cada letra del abecedario la tercera siguiente. El mensaje pareca una sopa de letras ininteligible. Para decodificar no haba ms que proceder al revs. Aqu tenemos en cuenta que las letras y smbolos del teclado tienen asignados nmeros enteros del 0 al 127, cdigo ASCII. El comando char asigna este nmero a las letras mientras que rem (p,q) es el resto de dividir p entre q (clase de restos). El resultado es el siguiente:
texto='Me encanta este curso' texto = Me encanta este curso secreto=char(rem(texto+3,128)) secreto = Ph#hqfdqwd#hvwh#fxuvr decodifica=char(rem(secreto-3,128)) decodifica = Me encanta este curso Un programita de regalo: tetris.m