Professional Documents
Culture Documents
Detalles de Matlab
Formatos de Salida
Respecto a los formatos numéricos con que MATLAB muestra los resultados (recuérdese que
siempre calcula y almacena con doble precisión, es decir con unas 16 cifras decimales
equivalentes), las posibilidades existentes se muestran en la lista desplegable de la Figura 21 y
son las siguientes:
MATLAB mantiene una forma especial para los números muy grandes (más grandes que los que
es capaz de representar), que son considerados como infinito. Por ejemplo, obsérvese cómo
responde el programa al ejecutar el siguiente comando:
>> 1.0/0.0
Warning: Divide by zero
ans =
Inf
Así pues, para MATLAB el infinito se representa como inf ó Inf. MATLAB tiene también
una representación especial para los resultados que no están definidos como números. Por
ejemplo, ejecútense los siguientes comandos y obsérvense las respuestas obtenidas:
>> 0/0
Warning: Divide by zero
ans =
NaN
>> inf/inf
ans =
NaN
En ambos casos la respuesta es NaN, que es la abreviatura de Not a Number. Este tipo de
respuesta, así como la de Inf, son enormemente importantes en MATLAB, pues permiten
controlar la fiabilidad de los resultados de los cálculos matriciales. Los NaN se propagan al
realizar con ellos cualquier operación aritmética, en el sentido de que, por ejemplo, cualquier
número sumado a un NaN da otro NaN. MATLAB tiene esto en cuenta. Algo parecido sucede
con los Inf.
MATLAB dispone de tres funciones útiles relacionadas con las operaciones de coma flotante.
Estas funciones, que no tienen argumentos, son las siguientes:
eps devuelve la diferencia entre 1.0 y el número de coma flotante inmediatamente
superior. Da una idea de la precisión o número de cifras almacenadas. En un
PC, eps vale 2.2204e-016.
realmin devuelve el número más pequeño con que se puede trabajar (2.2251e-308)
realmax devuelve el número más grande con que se puede trabajar (1.7977e+308)
En muchos cálculos matriciales los datos y/o los resultados no son reales sino complejos, con
parte real y parte imaginaria. MATLAB trabaja sin ninguna dificultad con números complejos.
Para ver como se representan por defecto los números complejos, ejecútense los siguientes
comandos:
>> a=sqrt(-4)
a =
0 + 2.0000i
>> 3 + 4j
ans =
3.0000 + 4.0000i
>> i=2
i =
2
>> 2+3i
ans =
2.0000 + 3.0000i
>> 2+3*i
ans =
8
>> 2+3*j
ans =
2.0000 + 3.0000i
Cuando i y j son variables utilizadas para otras finalidades, como unidad imaginaria puede
utilizarse también la función sqrt(-1), o una variable a la que se haya asignado el resultado de
esta función.
MATLAB puede definir variables que contengan cadenas de caracteres. En MATLAB las
cadenas de texto van entre apóstrofos o comillas simples (Nótese que en lenguaje C van entre
comillas dobles: "cadena"). Por ejemplo, en MATLAB:
s = 'cadena de caracteres'
Las cadenas de texto tienen su más clara utilidad en temas que se verán más adelante y por
eso se difiere hasta entonces una explicación más detallada.
<p class=MsoNormal style='mso-layout-grid-align:none;text-autospac
Introducción al Matlab
El propósito de estas notas es hacer una rápida introducción al matlab. Son sólo unas pequeñas
muestras para dar idea de como funciona este programa. Para un estudio más serio deben
consultarse otras referencias. En particular las que damos al final de esta página.
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 orígenes, a los que se han ido incorporando
sucesivamente
más capacidades, sobretodo gráficas.
Matlab es una potente calculadora, por ejemplo calcula la suma de dos números
>> 2+2
ans =
4
Aunque el ejemplo es sencillo ya vemos como actua matlab, se escriben las instrucciones en
la línea de comandos >> y después de pulsar la tecla Intro aparece el resultado más 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 expresión veremos el resultado. Para
escribirla de nuevo podemos usar la flecha hacia arriba del teclado, que nos recupera
los comandos escritos anteriormente en la sesión.
Obsérvese la rapidez con que se han calculado estas matrices A=rand(6) encuentra una matriz
6x6 de
números aleatorios (cada uno entre 0 y 1), inv(A) calcula su inversa y luego comprobamos que
B*A
es la matriz identidad. Los números negativos que aparecen son debido al redondeo (en este caso
serían números muy pequeños, pero negativos).
>> pi
ans =
3.1416
>> format long
>> pi
ans =
3.14159265358979
Aunque nos da el valor de pi con distinto número de decimales en realidad matlab trabaja
internamente
con doble presición, pero nos muestra distintos formatos. Para ver los distintos formatos basta
con usar el help:
Cada número se guarda en memoria como un vector de 8 bytes, lo que da una mantisa de unos
15 ó 16
dígitos 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 número 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 número x será por
tanto
Los 211=2048 posibles exponentes E se distribuyen entre -1023 E 1024, siendo el número
más
grande posible del orden de (2-eps)*21023 x 10308 y el número más pequeño del orden de
2-1022 x10-308 . La mantisa de 52 bits nos da un epsilon máquina del orden de eps=2-
52
x10-16.
Recordenmos que el epsilon máquina eps se define como el número más grande eps tal que la
máquina no
distingue entre 1 y 1+eps.
El número real más grande, más pequeño y epsilon máquina respectivamente, se obtienen con
>>realmin
>>realmax
>>eps
Con matlab podemos ir escribiendo los comandos uno tras otro, pero cuando tenemos que
hacer un pequeño
programa o escribir muchos comandos suele resultar más útil escribir un fichero con las
instrucciones
y luego hacer que matlab los ejecute. Estos son los ficheros .m que no son más que ficheros de
texto
a los que luego ponemos la extensión .m . Matlab lleva incorporado un editor que podemos usar
para
este propósito. 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 términos de la sucesión an+2=4 an3 an+1 empezando con a1=2.1 y a2=2.1
En este caso, como no hemos puesto punto y coma después de la línea de tercero, los resultados
se irán escribiendo en la pantalla, unos debajo de otros a medida que se van calculando.
Comentarios al programa:
aparecerá una pantalla más ordenada con los resultados en columna.
2)
format long Este programa abre un fichero de texto
primero=2.1;
segundo=2.1; llamado resultados.txt donde se escribirán
fi=fopen('resultados.txt','w'); los cálculos en columna.
for n=1:40
tercero=4*primero-3*segundo; Buscar en
primero=segundo;
segundo=tercero;
>> help fprintf
fprintf(fi,'%16.7f\n',segundo);
end para más información sobre este y otros
fclose(fi) comandos parecidos.
3)
Como otro ejemplo, calculemos con mantisa 3 la suma de los primeros 20 términos
de la serie armónica, 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 obtendríamos
>> 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 gráfica para representar el tiempo que ha tardado
Matlab en sumar distintas sumas
parciales de esta serie armónica. ¿Cuál es la suma de la serie armónica infinita? Todos sabemos
que diverge, esto es, que si vamos sumando más y más términos las sumas parciales se hacen tan
grandes como queramos. Hay una manera divertida de pensar en la
suma de los términos 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 avanzaría una distancia 1/n.
Que esta serie diverge significa que si el número de saltos es suficientemente grande nuestra
amiga llegaría de la Autónoma
a Madrid, a la Luna, ... llegaría tan lejos como queramos. !!Pero si la calculamos con el
ordenador esta suma sería finita !!
Tal como hemos dicho Matlab está muy adaptado al cálculo con vectores y matrices, por
ejemplo en las
siguientes instrucciones
En Matlab podemos escribir un conjunto de instrucciones que forman un fichero.m, pero
también podemos
utilizar una function. Hay una diferencia entre ambos ya que en un fichero.m los datos y las
variables son como
si las hubiérmos escrito desde la consola. En una función las variables son internas, no cambian
ni afectan las
externas. Por cierto que conviene muchas veces limpiar las variables externas con la instrucción
>>clear all
si no queremos tener cálculos confusos. Para limpiar la pantalla usaremos
>>clc
Un ejemplo de función sería el programita siguiente, que calcula los 20 primeros términos 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
>>serie(x),
Por ejemplo:
>>serie(1)
suma=2.71828182845905
Resultado que ya da todas las cifras decimales correctas del numero e hasta la precisión de
Matlat, como se puede
comprobar fácilmente. Con esta función 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
>> 1/serie(8)-exp(-8)
ans =3.152568231321777e-008
Un comando útil en matlab es ginput. Ver >>help gineput (también gtext). Abajo el pequeño
programita dibuja y=x(x-1)sin x, luego sobre la figura, permite tomar 6 puntos con el ratón, que
al final muestra en la consola.
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=[-3:0.4:3];
y=x;
close
subplot(2,2,1)
figure(gcf), fi=[-
6*pi:pi/20:6*pi];
plot3(fi.*cos(fi),fi.*sin(fi),
fi,'r')
[X,Y]=meshgrid(x,y);
Z=superficie(X,Y);
subplot(2,2,2)
mesh(Z)
subplot(2,2,3)
surf(Z)
subplot(2,2,4)
contour3(Z,16)
>>[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)
Ver también
cardioide:
>>ezpolar('1+co
s(t)')
>> 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 ejecución de
un cálculo de matlab (en caso necesario).
Un juego: Vamos a mandar mensajes secretos
Julio César se comunicaba con sus gobernadoresy generales con mensajes codificados. Hacía
corresponder a cada
letra del abecedario la tercera siguiente. El mensaje parecía una sopa de letras ininteligible. Para
decodificar no había
más que proceder al revés. Aquí tenemos en cuenta que las letras y símbolos del teclado tienen
asignados números
enteros del 0 al 127, código ASCII. El comando char asigna este número a las letras mientras
que rem (p,q) es el
resto de dividir p entre q (clase de restos). El resultado es el siguiente:
Refencias: http://www.glue.umd.edu/~nsw/ench250/primer.htm
http://mate.uprh.edu/~pnm/notas4061/cap2/repre.html