Una primera sesión de trabajo con MATLAB

Anuncio
Una primera sesión de trabajo con MATLAB
Grupo FMI
Departamento de Matemática Aplicada, Universidad de Zaragoza
http://www.unizar.es/fmi
Versión actualizada en agosto de 2006
Índice
1. Aritmética elemental y asignaciones
3
2. Vectores y matrices
5
3. Listas implı́citas
7
4. Funciones
8
5. Vectorización de operaciones aritméticas
9
6. Algunos gráficos elementales
11
7. Detalles útiles
13
Esta guı́a ha sido desarrollada dentro del marco del Proyecto de Innovación Docente Guı́as de
aprendizaje de Matlab para alumnos y profesores por los siguientes miembros de grupo Formación
Matemática en Ingenierı́a: Francisco Javier Sayas (coordinador), Mercedes Arribas, Natalia Boal,
José Manuel Correas, Francisco José Gaspar, Dolores Lerı́s, Andrés Riaguas y Marı́a Luisa SeinEchaluce.
MATLAB (MATrix LABoratory) es un paquete interactivo para cálculo cientı́fico (aritmético
y simbólico), basado en matrices. MATLAB es fácil de emplear y, en principio, no requiere del
conocimiento de un lenguaje de programación. MATLAB concentra en un sólo programa un
buen número de posibilidades de cálculo cientı́fico y es, hoy por hoy, uno de los entornos de
trabajo más empleados en muy distintos campos de la Ingenierı́a. MATLAB sirve para:
realizar cálculos aritméticos (como una calculadora);
realizar cálculo simbólico (con la posibilidad de hacer operaciones como derivar funciones,
calcular primitivas, etc) y exacto;
programar en un lenguaje no compilado;
realizar gráficos en dos y tres dimensiones;
acceder a paquetes con aplicaciones tan diversas como el tratamiento de señales, la simulación de circuitos, métodos numéricos avanzados, simulación de sistemas dinámicos, redes
neuronales etc.
Hay dos modos de trabajo con MATLAB:
trabajo interactivo (Workspace), donde el usuario realiza una consulta (escribe una operación) y el programa la ejecuta;
trabajo programado (M-files), donde el usuario genera uno o varios ficheros con conjuntos
de instrucciones MATLAB, que se pueden ejecutar repetidas veces (con distintos datos)
desde el modo interactivo. De esta forma, el usuario puede incrementar las funciones disponibles en MATLAB, añadiendo las suyas propias.
La versión de MATLAB utilizada en esta pequeña guı́a de iniciación es la 6.0.
Advertencia. Como lenguaje de programación, MATLAB emplea las estructuras tradicionales de un
lenguaje de nivel medio (bucles, condicionales, etc), pero sus posibilidades de manipulación de arrays o
las estructuras de datos avanzadas lo hacen un lenguaje de muy alto nivel.
Esta guı́a permite realizar una visita general por algunas órdenes sencillas de MATLAB mientras
trabajamos de forma interactiva en el entorno Workspace, la sesión de trabajo que aparece por
defecto cuando se abre la aplicación. Para avanzar en el conocimiento de MATLAB, recomendamos continuar con el Curso de MATLAB que hemos desarrollado los miembros del Grupo
FMI.
Por defecto, la carpeta de trabajo es la carpeta work aunque ésta se puede cambiar (véase la
figura 1). A lo largo de esta guı́a de iniciación, cuando se muestran instrucciones en MATLAB,
esto es, lı́neas precedidas del sı́mbolo “ %”, por simplicidad de edición se han omitido todas las
tildes y caracteres no estándar (por ejemplo, la letra ñ).
2
Figura 1: Pantalla que se obtiene al iniciar una sesión de trabajo de MATLAB
1.
Aritmética elemental y asignaciones
El sı́mbolo >> es el prompt de MATLAB e indica que está listo para aceptar órdenes. Para
ejecutar una orden basta pulsar la tecla ENTER. El nombre que se asigna por defecto a la salida
es ans (abreviatura de answer).
>> 2+2
ans =
4
>> 3-4
ans =
-1
>> 2*2
ans =
4
>> 2/3
ans =
0.6667
>> (-2)^10
ans =
1024
3
>> a=3
a =
3
>> 5*a
ans =
15
>> b=a/7
b =
0.4286
>> b=3*a;
>> -b
ans =
-9
Unos breves comentarios sobre estas lı́neas:
Las asignaciones en MATLAB se realizan como en cualquier lenguaje de programación,
pero no requieren ningún tipo de declaración de variables (en una primera aproximación).
Más adelante veremos que, por defecto, todas las variables son matrices y que los escalares
se toman como un caso particular de matrices 1 × 1.
Las operaciones se realizan siempre en aritmética de coma flotante de doble precisión. Un
poco más adelante veremos cómo visualizar más cifras de un resultado. Lo que enseña
MATLAB por defecto es (mucha) menos precisión de la que ha calculado.
El efecto de escribir un punto y coma (;) al final de una instrucción es evitar que se
muestre por pantalla su resultado, aunque sı́ se ejecuta.
Si se utiliza el sı́mbolo %, a partir de allı́ se considera que la lı́nea está comentada.
Para poder realizar operaciones con números complejos, MATLAB tiene reservada la letra i
para la unidad imaginaria. Esto es una preasignación de la variable i, que no está bloqueada de
ningún modo.
Advertencia. En muchos contextos es más común llamar j a la unidad imaginaria. Por defecto
MATLAB también tiene reservada esa letra para la unidad imaginaria. Si se realiza una asignación sobre
cualquiera de las variables se pierde su valor. Para recuperarlo se puede borrar su valor (instrucción clear
i) o reasignarlo (instrucción i=sqrt(-1)).
>> i
ans =
0
+
>> i^2
ans =
-1
>> (2+3i)/(4-i)
1.0000i
% para multiplicar por i no hace falta *
4
ans =
0.2941 + 0.8235i
>> (1+i)^2
ans =
0
+
2.0000i
MATLAB distingue entre mayúsculas y minúsculas, razón por la cual la variable a y la variable A
son distintas. El nombre de las variables sigue las reglas habituales de un lenguaje de programación: debe comenzar por una letra, aunque puede contener números; no debe contener espacios
en blanco ni algún tipo de sı́mbolo reservado (coma, punto y coma, dos puntos, guión,...).
Advertencia. Aunque MATLAB sı́ distingue entre mayúsculas y minúsculas, y por tanto es seguro
emplear combinaciones de ambas en nombres de variables, las implementaciones en Windows no hacen
estas distinciones para los nombres de los ficheros y, por consiguiente, de las funciones definidas sobre
ficheros. Volveremos sobre este detalle en su momento.
2.
Vectores y matrices
Por defecto, todas las variables en MATLAB se tratan como arrays con dos ı́ndices, esto es,
como matrices. No obstante, es más simple comenzar aprendiendo a manipular vectores, es
decir, arrays numerados con un único ı́ndice.
Advertencia. MATLAB distingue entre vectores fila y columna. Esto resulta poco natural si se
entienden los vectores como algo distinto de las matrices (como ocurre en la mayorı́a de los lenguajes de
programación), pero es conveniente acostumbrarse pronto a este detalle, puesto que es parte integrante
de la filosofı́a matricial de MATLAB.
>> a=[3,1,-5] % tambien se puede escribir [3 1 -5]
a =
3
1
-5
>> a(3)
% tercer elemento del vector a
ans =
-5
>> 3*a
% escalar * vector
ans =
9
3
-15
>> b=[-4 10 -6]
b =
-4
10
-6
>> a+b
% vector + vector
ans =
-1
11
-11
>> 2+a
% escalar + vector (!)
5
ans =
5
3
-3
>> b/2
% vector / escalar
ans =
-2
5
-3
>> d=[-1; 2]
% vector columna
d =
-1
2
>> c=b’
% b’ = transpose(b)
c =
-4
10
-6
>> c=[-4;10;-6] % forma directa de escribir un vector columna
c =
-4
10
-6
La operación de adición de un escalar a cada elemento de un vector (o de una matriz) es
matemáticamente chocante, pero se incluyó en versiones recientes de MATLAB por ser de gran
utilidad en numerosas situaciones.
La matrices se definen entre corchetes escribiéndolas por filas y se utiliza el punto y coma para
separar una fila de otra. También se pueden separar los elementos de las filas con comas. Cada
elemento de una matriz se reconoce por dos ı́ndices.
>> A=[3 1 5; 2 1 2] % o con comas para separar los elementos de una fila
A =
3
1
5
2
1
2
>> A’ % trasponemos la matriz, igual que ejecutar transpose(A)
ans =
3
2
1
1
5
2
>> A(1,3)
% elemento en la posicion (1,3)
ans =
5
>> B=[2,-1,4;5,2,3] % ahora separando los elementos de una fila por comas
B =
2
-1
4
5
2
3
>> A+B
% suma de matrices
ans =
6
5
7
>> C=[2 3
C =
2
-1
6
>> A+C
??? Error
>> A+C’
ans =
5
5
>> D = [1
D =
1
5
1
>> 3*D
ans =
3
15
3
>> A*D
ans =
0
9
3
5
; -1 3; 6 -2]
3
3
-2
% cuidado con las dimensiones
using ==> + Matrix dimensions must agree.
% dimensiones correctas para sumar
0
11
4
0
-1; 5 -4;
1 6]
-1
-4
6
-3
-12
18
% funciona el producto de matrices
13
23
9
6
>> A*B
% de nuevo las dimensiones...
??? Error using ==> * Inner matrix dimensions must agree.
3.
Listas implı́citas
las listas implı́citas son listas de números en las que se especifica el primer y último elementos y
el incremento entre cada elemento de la lista. Su empleo es muy común en MATLAB, tanto para
desarrollo de las capacidades gráficas como en cualquier nivel de programación. El resultado es
siempre un vector fila.
>> a=1:10
% si no se especifica nada, por defecto el incremento es 1
a =
1
2
3
4
5
6
7
8
9
10
>> b=1:2:10
b =
7
1
3
5
>> c=10:-1:1
c =
10
9
8
>> d=0:0.1:1
d =
Columns 1 through 6
0
0.1000
Columns 7 through 11
0.6000
0.7000
7
9
7
6
5
4
3
0.2000
0.3000
0.4000
0.8000
0.9000
1.0000
2
1
0.5000
Otra forma de generar listas de número equidistantes es utilizando la función linspace en la
cual hay que especificar como argumentos el primer elemento, el último elemento y el número
total de elementos en la lista.
>> linspace(0,20,11)
ans =
0
2
4
4.
6
8
10
12
14
16
18
20
Funciones
Las funciones básicas (trigonométricas, exponencial, logaritmo) están incorporadas a MATLAB.
Puesto que el entorno MATLAB ha sido diseñado en un marco de fuerte componente matemática
y numérica, el logaritmo log es el neperiano, no el decimal.
>> sqrt(2) % raiz cuadrada
ans =
1.4142
>> sqrt(-1)
% recuperacion de la unidad imaginaria i
ans =
0 + 1.0000i
>> sin(3*pi/2)
% pi esta predefinido
ans =
-1
>> cos(16)
ans =
-0.9577
>> log(3) % logaritmo neperiano
ans =
8
1.0986
>> log(0)
Warning: Log of zero. ans =
-Inf
>> log(exp(4))
ans =
4
>> abs(-5) % valor absoluto
ans =
5
En el caso de vectores o matrices, estas funciones actúan sobre cada uno de los elementos. En el
argot de MATLAB se dice que estas funciones ya están vectorizadas. La sección siguiente trata
de este tema.
>> a=[1,2,3];
>> sqrt(a)
ans =
1.0000
1.4142
1.7321
>> sin(3*a)
ans =
0.1411
-0.2794
0.4121
>> log(5*a)
ans =
1.6094
2.3026
2.7081
>> A=[3 1 5; 2 1 2; 1 2 0];
>> sqrt(A) % raiz cuadrada elemento a elemento
ans =
1.7321
1.0000
2.2361
1.4142
1.0000
1.4142
1.0000
1.4142
0
>> abs([1,-2,3,-5])
ans=
1 2 3 5
Advertencia. En el caso de matrices cuadradas exp(A) y sin(A) no son las funciones analı́ticas
exponencial y seno ya que están funciones de MATLAB actúan elemento a elemento. Por la misma razón
sqrt(A)*sqrt(A) no es A.
5.
Vectorización de operaciones aritméticas
El producto es, por defecto, la operación de producto de matrices. De la misma manera, las
potencias de una matriz son los productos repetidos de una matriz por sı́ misma. El sı́mbolo
9
de división tiene un significado más complejo, relacionado con el producto por la inversa del
denominador.
Para realizar productos y divisiones elemento a elemento (operaciones vectorizadas), hay que
emplear los sı́mbolos
.*
./
mientras que
.^2
(o expresiones parecidas con otros exponentes) sirve para elevar cada componente de una matriz
o vector al exponente indicado.
>> a=[1 6 -8];
>> b=[-2 3 -4];
>> a.*b
% multiplicacion elemento a elemento
ans =
-2
18
32
>> a./b
% division elemento a elemento
ans =
-0.5000
2.0000
2.0000
>> a^2
??? Error using ==> ^ Matrix must be square.
>> a.^2
% potencia elemento a elemento
ans =
1
36
64
>> A=[1 6;-8 1];
>> B=[-2 3;-4 2];
>> A*B % producto matricial
ans =
-26
15
12
-22
>> A.*B % producto elemento a elemento
ans =
-2
18
32
2
>> A./B % dividimos elemento a elemento
ans =
-0.5000
2.0000
2.0000
0.5000
>> A.^2
ans =
1
36
64
1
>> A^2
% al ser una matriz cuadrada es equivalente a A*A
ans =
10
-47
12
-16
-47
>> C=[4 1; 1 9]
C =
4
1
1
9
>> C.^(1/2) % igual que ejecutar sqrt(C)
ans =
2
1
1
3
>> C^(1/2)
ans =
1.9899
0.2007
0.2007
2.9933
6.
Algunos gráficos elementales
Una de las caracterı́sticas más interesantes de MATLAB es la calidad, sencillez y portabilidad de
sus capacidades gráficas. Vamos simplemente a crear unas gráficas sencillas para ir apreciando
qué puede hacer MATLAB. Comenzamos con una gráfica lineal (bidimensional), que mostramos
en la Figura 2.
>> x=0:.01:2*pi;
>> y=sin(x).^2;
>> plot(y)
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0
100
200
300
400
500
600
700
Figura 2: Representación gráfica de y = senx2 utilizando la orden plot(y)
Observa la diferencia entre las figuras 2 y 3 y cuál es la diferencia entre las órdenes en MATLAB
utilizadas.
11
>> plot(x,y)
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0
1
2
3
4
5
6
7
Figura 3: Representación gráfica de y = senx2 utilizando la orden plot(x,y)
El menú gráfico que incluye la ventana de gráficos del MATLAB permite con gran sencillez
añadir texto, lı́neas y flechas a una gráfica, e incluso realizar un zoom
La siguiente gráfica es tridimensional (Figura 4).
>>
>>
>>
>>
>>
x=-3:0.2:3;
y=x;
[xx,yy]=meshgrid(x,y);
z=xx.^2+3*yy.^2;
plot3(xx,yy,z)
40
35
30
25
20
15
10
5
0
3
2
3
1
2
0
1
0
−1
−1
−2
−2
−3
−3
Figura 4: Representación gráfica de z(x, y) = x2 + 3y 2 utilizando la orden plot3
12
Veamos la misma gráfica con la orden surf (Figura 5). Para cambiar el punto de vista se puede
emplear el icono correspondiente a rotación del menú gráfico.
>>
>>
>>
>>
>>
x=-3:0.2:3;
y=x;
[xx,yy]=meshgrid(x,y);
z=xx.^2+3*yy.^2;
surf(x,y,z)
40
35
30
25
20
15
10
5
0
3
2
3
1
2
0
1
0
−1
−1
−2
−2
−3
−3
Figura 5: Representación gráfica de z(x, y) = x2 + 3y 2 utilizando la orden surf
La cuestión gráfica en MATLAB llega a altos grados de sofisticación, ası́ que le dedicaremos un
capı́tulo entero del curso que amplı́a esta guı́a.
7.
Detalles útiles
La orden clc limpia la pantalla de comandos.
La orden clear elimina todas las variables no permanentes. Es posible borrar únicamente
algunas de las variables del espacio de trabajo con la orden
clear
nombre_variable
Y si tienes dudas sobre alguna función de MATLAB, tenemos la orden
help nombre_funcion
para consultar cualquier función del programa. Además hay un menú de ayuda más detallado en la parte superior derecha de la barra de menús.
Se interrumpe una ejecución con Ctrl + C.
Las teclas ↑ y ↓ permiten recuperar órdenes ejecutadas anteriormente. Tecleando primero
un grupo de caracteres y empleando las flechas se puede recuperar un histórico de órdenes
ejecutadas anteriormente que comienzan por esos caracteres.
13
Si se quiere guardar todo lo hecho, la orden
diary nombre_fichero.txt
permite grabar en un fichero texto la sesión de trabajo. Con diary off y diary on desactivamos y activamos la grabación en el fichero.
who indica qué variables se están utilizando.
whos da una información más amplia sobre el tamaño y tipo de variable.
MATLAB tiene algunas variables especiales:
pi es el número π.
eps es el ε máquina, es decir, el número positivo más pequeño tal que 1 + ε 6= 1 en la
unidad de coma flotante del ordenador.
>> eps
ans =
2.2204e-016
inf Infinito
NaN (not–a–number) es una magnitud no numérica y se obtiene, por ejemplo, como resultado de indeterminaciones matemáticas del tipo (0/0) ó (∞ − ∞).
realmin y realmax los números reales positivos, más pequeño y más grande respectivamente, que se pueden utilizar.
MATLAB no tiene aritmética entera incorporada. Las operaciones con enteros son realizadas
exactamente mientras ocurran dentro de la precisión máquina (hasta unas dieciséis cifras). Aún
ası́, MATLAB reconoce en cierto modo que se trata de números enteros y devuelve los resultados
como si estuviera realizando aritmética entera.
En general MATLAB trabaja en aritmética de coma flotante de doble precisión. El usuario elige
el usuario el formato de salida. Algunos formatos:
format short es el formato por defecto; punto fijo y cuatro dı́gitos decimales
format short e notación cientı́fica con cuatro dı́gitos decimales
format long punto fijo y catorce dı́gitos decimales
format long e notación cientı́fica con quince dı́gitos decimales
format rat aproximaciones al número racional más cercano .
14
>> 2/3
ans =
0.6667 % formato por defecto
>> format long
>> 2/3
ans =
0.66666666666667
>> format long e
>> 2/3
ans =
6.666666666666666e-001
>> format short
>> 2/3
ans =
0.6667
>> format short e
>> 2/3
ans =
6.6667e-001
>> format rat
>> 2/3
ans =
2/3
>> format short
>> 3^(-32)
ans =
5.3966e-016
>> format long
>> 3^(-32)
ans =
5.396595277354290e-016
>> format rat
>> 3^(-32)
ans =
1/1853020188851841
15
Descargar