Declaración de Vectores en MATLAB
Declaración de Vectores en MATLAB
Guion de la Práctica 1:
Resolución de problemas de Elasticidad con MatLab
1. Introducción
MATLAB (del inglés MATrix LABoratory) es un software computacional muy utilizado en
universidades y centros de investigación. Entre sus funcionas básicas destacan: la manipulación
de matrices, la representación de datos y funciones, implementación de algoritmos o la creación
de interfaces de usuario. Esta práctica se centrará en introducir al alumno en el análisis matricial
y representación de datos mediante la resolución de un problema de Elasticidad.
1
El apóstrofe se escribe pulsando la tecla a la derecha del 0 en el teclado, no confundir con otros acentos del
teclado.
1
esto produce la siguiente matriz:
1 2 3
4 5 6
7 8 9
Trasponemos la matriz:
A’
salida:
1 2 3
Trasponiendo el vector:
v’
donde:
v es una matriz 3x3 que almacenan los autovalores en la diagonal principal, siendo el resto
de componentes igual a 0.
w es una matriz 3x3 que almacenan los autovectores en columnas. La columna donde se
almacenan las componentes de un autovector es la misma columna donde se encuentra el
autovalor correspondiente en la matriz v.
Es importante remarcar que la función eig no ordena los autovalores y autovectores de mayor a
menor (según el autovalor), como por ejemplo se realiza en el cálculo de las tensiones principales.
2
Ejemplo
Calcular los autovalores y autovectores del siguiente tensor de tensiones:
500 173,2 0
σ = 173,2 300 0
0 0 −200
El siguiente comando de MatLab genera la matriz A:
A = [ 5 0 0 1 7 3 . 2 0 ; 1 7 3 . 2 3 0 0 0 ; 0 0 -200]
Salida de MatLab:
eigvec =
0 0,5 −0,8660
0 −0,8660 −0,5000
1 0 0
eigval =
−200,0000 0 0
0 200,0044 0
0 0 599,9956
Este tensor corresponde al del problema realizado en clase. Comprobar que, efectivamente:
3
10
0
1 1.5 2 2.5 3 3.5 4
Figura 1
se enumeran en el primer vector y las coordenadas y en el segundo. Por otro lado, ’--r’ indica
que la lı́nea sea dibujada a trazos y en color rojo (r de ”red”, lo mismo ocurre con otros colores:
b para el azul, g para el verde, y para el amarillo, ...)
Cuando dibujamos, MatLab representa lo que le indiquemos sin respetar las escalas de los ejes x,
y, z y ajustando la imagen a los lı́mites de lo dibujado. Por ejemplo, en la imagen obtenida con
el comando anterior, no vemos el origen. Si queremos tener mayor control sobre estos aspectos,
podemos utilizar algunos comandos que resultan muy útiles:
xlim: define los lı́mites de dibujo para el eje x. Los lı́mites se definen mediante un vector
de dos componentes: [xizda , xdcha ].
xlabel: define una cadena de caracteres que se dibujarán en el eje x, de esta manera se
indicará en el gráfico qué magnitud se representa en este eje.
Si quisiéramos dibujar dos lı́neas en el mismo dibujo, deberı́amos invocar dos veces el comando
plot, pero al hacerlo verı́amos que sólo una de ellas, la última, está representada. El siguiente
código produce la Figura 2.:
p l o t ([1 ,4] ,[10 ,0.5] , ’ - -r ’)
p l o t ([4 ,2] ,[7 ,1] , ’ -g ’)
axis equal
grid on
x l i m ([0 ,5])
y l i m ([0 ,11])
x l a b e l ( ’x ’)
y l a b e l ( ’y ’)
4
11 11
10 10
9 9
8 8
7 7
6 6
y
y
5 5
4 4
3 3
2 2
1 1
0 0
0 2 4 0 2 4
x x
Figura 2
Esto ocurre porque cada llamada al comando plot, por defecto, resetea cualquier configuración
que se haya utilizado antes en la figura, de manera que nada de lo definido anteriormente se
conserva y borra cualquier cosa que haya representada. Para evitar esto podemos utilizar el
comando hold on, que indica a MatLab que se espere y guarde la configuración que se haya
definido hasta el momento para próximas llamadas a plot.
De este modo, si al código indicado anteriormente le añadimos el comando hold on justo después
de la primera llamda a plot:
p l o t ([1 ,4] ,[10 ,0.5] , ’ - -r ’)
hold on
p l o t ([4 ,2] ,[7 ,1] , ’ -g ’)
axis equal
grid on
x l i m ([0 ,5])
y l i m ([0 ,11])
x l a b e l ( ’x ’)
y l a b e l ( ’y ’)
5
11
10
y
5
0
0 2 4
x
Figura 3
La declaración de una función se realiza siempre enumerando los datos de salida entre corchetes
separados por comas e igualándolos al nombre de la función seguido de los datos de entrada
separados por comas y entre paréntesis:
[output1 , output2 , ..., outputn ] = nombre funcion(input1 ,input2 ,...inputm )
Ejemplo
MatLab tiene una función que calcula la traza de una matriz, pero en este ejemplo se va a
programar una función extremadamente sencilla que efectúa esta misma operación.
La función tiene las siguientes caracterı́sticas:
Código:
function [ traza ] = calcular_traza( A )
%C A L C U L A R T R A Z A C a l c u l a l a t r a z a d e u n a m a t r i z 3 x 3
t r a z a = A (1 ,1) + A (2 ,2) + A (3 ,3);
end
6
La primera lı́nea del código sirve para declarar la función, definiendo los datos de entrada (A),
los de salida (traza) y el nombre de la función (calcular traza).
La segunda lı́nea es un comentario, MatLab lo ignora durante la ejecución de la función, y sirve
para describir qué hace la función. Cuando en la lı́nea de comandos se teclea help y el nombre
de la función a continuación, en la terminal se imprime la información escrita en esta segunda
lı́nea de comentarios.
La tercera lı́nea ejecuta la operación que, en este caso, es necesaria para calcular el resultado
requerido. Esto es el cuerpo de la función y puede estar constituida por un sola lı́nea, en su caso
más simple, hasta un número ilimitado de lı́neas, en funciones más complejas.
La cuarta lı́nea define el final de la función mediante la palabra end.
Cuando se ejecuta un comando en MatLab que produce algún tipo de salida, automáticamente
ésta se imprime por defecto en el terminal. Esto puede resultar útil cuando se está trabajando
directamente en el terminal, pero muchas veces resulta molesto. Para evitar este comportamiento,
basta con incluir un punto y coma (;) al final de cada lı́nea.
El comando clear borra todas las variables almacenadas en MatLab hasta ese momento y el
comando clc limpia el terminal sin borrar las variables almacenadas. El uso de estos coman-
dos puede ser muy conveniente cuando al ejecutar un script queremos evitar que éste utilice
accidentalmente valores que puedan estar almacenados en ese momento.
MatLab cuenta con una muy buena ayuda, de manera que cualquier función que esté incluida
en el programa dispone de una descripción de la misma, ası́ como de su sintaxis. Para acceder a
esta descripción, basta con teclear help nombre función en la lı́nea de comandos.
Si queremos que las funciones creadas por nosotros dispongan también de esta ayuda, la segunda
lı́nea del archivo que contenga la función y las siguientes han de estar comentadas e incluir la
descripción que deseemos.
7
7. Condicionales y operadores lógicos
También podemos “anidar” estos condicionales estableciendo condiciones más complejas. Por
ejemplo, si queremos saber si un número está entre el rango comprendido entre 5 y 10:
function [ salida ] = entre_cinco_y_diez( n )
%E N T R E _ C I N C O _ Y _ D I E Z C o m p r u e b a s i n s e e n c u e n t r a e n e l i n t e r v a l o [5 ,10].
i f n >= 5
i f n <= 1 0
s a l i d a = ’e l v a l o r i n t r o d u c i d o e s t a e n e l i n t e r v a l o [5 ,10] ’;
else
s a l i d a = ’e l v a l o r i n t r o d u c i d o N O e s t a e n e l i n t e r v a l o [5 ,10] ’;
end
else
s a l i d a = ’e l v a l o r i n t r o d u c i d o N O e s t a e n e l i n t e r v a l o [5 ,10] ’;
end
Por ejemplo, para crear una función equivalente a la función entre cinco y diez descrita en el
último ejemplo, podemos utilizar el operador && de la siguiente manera:
function [ salida ] = entre_cinco_y_diez_b( n )
%E N T R E _ C I N C O _ Y _ D I E Z _ B C o m p r u e b a s i n s e e n c u e n t r a e n e l i n t e r v a l o [5 ,10].
i f n >= 5 & & n <= 1 0
s a l i d a = " e l v a l o r i n t r o d u c i d o e s t a e n e l i n t e r v a l o [5 ,10]";
8
else
s a l i d a = " e l v a l o r i n t r o d u c i d o N O e s t a e n e l i n t e r v a l o [5 ,10]";
end
Imaginemos ahora que queremos crear una función que nos indique si un número pertenece a
alguno de los intervalos [1,3] y [7,9], de manera que devuelva un mensaje afirmativo si pertenece
a alguno de ellos y un mensaje negativo si no es ası́. En estos casos el operador | resulta muy
útil combinado con el operador &&:
function [ salida ] = en_uno_de_dos_intervalos( n )
%E N _ U N O _ D E _ D O S _ I N T E R V A L O S C o m p r u e b a s i n s e e n c u e n t r a e n e l i n t e r v a l o [1 ,3]
%o e n e l [7 ,9]
i f ( n >= 1 & & n <= 3 ) | ( n >= 7 & & n <= 9 )
s a l i d a = " e l v a l o r i n t r o d u c i d o e s t a e n l o s i n t e r v a l o s : [1 ,3] , [7 ,9]";
else
s a l i d a = " e l v a l o r i n t r o d u c i d o N O e s t a e n l o s i n t e r v a l o s : [1 ,3] , [7 ,9]";
end
x y
0 0
1.2566 0.9511
2.5133 0.5878
3.7699 -0.5878
5.0265 -0.9511
6.2831 0
9
1
0.8
0.6
0.4
0.2
−0.2
−0.4
−0.6
−0.8
−1
0 1 2 3 4 5 6 7
Como vemos, el resultado es muy pobre y para obtenerlo hemos tenido que teclear un comando
largo.
La forma de trabajar en estos casos es diferente. MatLab permite crear vectores con componentes
equiespaciadas de manera muy sencilla, la sintaxis es la siguiente:
vector = [a:i:b]
donde:
a es el valor inicial.
b es el valor final.
Por ejemplo, si queremos crear el intervalo [0, 2π] obteniendo valores separados una distancia de
0.1, escribirı́amos:
vector = [0:0.1:2*pi]
Además, MatLab permite operar con los valores de un vector de la siguiente manera:
y = sin(x)
Este comando almacenará en y un vector de tantas componentes como el vector x donde cada
componente yi es igual al seno de cada componente xi .
De este modo, para representar la función seno podemos ejecutar sl siguiente código:
x = [0:0.1:2*pi]
y = sin(x)
plot(x,y,’-b’)
Este código produce el siguiente resultado:
10
1
0.8
0.6
0.4
0.2
−0.2
−0.4
−0.6
−0.8
−1
0 1 2 3 4 5 6 7
0.8
0.6
0.4
0.2
−0.2
−0.4
−0.6
−0.8
−1
0 1 2 3 4 5 6 7
11
a = [1 2 3 4];
b = [5 6 7 8];
a+b
que produce el siguiente vector:
6 8 10 12
Obsérvese que el vector b se ha traspuesto para poder ejecutar el cálculo, ya que habiendo
definido ambos como vectores en fila, debemos poner el segundo en columna para poder ejecutar
la operación.
Si quisiéramos multiplicar los elementos de los vectores a y b elemento a elemento, deberı́amos
ejecutar el siguiente comando:
a.*b
12
1200
1000
800
600
400
200
0
0 2 4 6 8 10
90 15
120 60
10
150 30
5
180 0
210 330
240 300
270
13
12. Funciones que llaman a otras funciones
Ya hemos visto anteriormente cómo crear funciones en MatLab y cuáles son sus principales
caracterı́sticas: datos de entrada, datos de salida, sintaxis... La creación de funciones incrementa
enormemente las posibilidades de MatLab, pues ya no estamos restringidos a utilizar las funciones
que MatLab trae por defecto, lo cual en sı́ ya es muy interesante, sino que además podemos crear
funciones a la medida de nuestras necesidades.
No obstante, imaginemos que tenemos que programar una función que efectúe operaciones muy
complejas; en estos casos puede ser recomendable crear varias funciones más simples que se encar-
guen de pequeñas partes de la función y crear una función “directora”que llame a esas funciones
menores dando lugar a la función que buscábamos. De esta manera, la tarea de programación se
simplifica, pues el código final se divide en pequeñas partes de código más fácilmente manejables.
Veámoslo con un ejemplo creando las siguientes dos funciones:
volumen prisma recto: que obtendrá el volumen de un prisma recto de base cuadrada o
circular haciendo uso de la función calc area.
La función calc area recibe dos valores: RL, que es el lado o radio del cuadrado o cı́rculo, y
type que si vale 0 indica que la figura es un cuadrado y si vale 1 indica que es un cı́rculo.
El código es el siguiente:
f u n c t i o n [ A ] = c a l c _ a r e a ( RL , t y p e )
\ %C A L C _ A R E A C a l c u l a e l a r e a d e u n a s u p e r f i c i e c u a d r a d a o circular ,
\ %d e p e n d i e n d o d e l t i p o especificado , q u e p u e d e s e r :
\% 0: cuadrado de lado RL
\% 1: circulo de radio RL
if type == 0
A = RL^2;
elseif type == 1
A = pi*RL^2;
else
e r r o r ( ’E l t i p o d e s u p e r f i c i e i n t r o d u c i d o n o e s v a l i d o . ’)
end
end
La función volumen prisma recto recibe tres datos: RL, h y type. RL y type definen la geometrı́a
de la base del prisma y tienen el mismo significado que en la función calc area y h es la altura.
El código es el siguiente:
f u n c t i o n [ V ] = v o l u m e n \ _ p r i s m a \ _ r e c t o ( RL , h , t y p e )
\ %V O L U M E N _ P R I S M A _ R E C T O C a l c u l a e l v o l u m e n d e u n p r i s m a r e c t o d e a l t u r a h .
\ %A d m i t e d o s t i p o s d e p r i s m a s : d e b a s e c u a d r a d a o d e b a s e circular , p a r a
\ %c a d a u n o d e e l l o s :
\% Base cuadrada: RL es el lado del cuadrado y type = 0
\% Base circular: RL es el radio del circulo y type = 1
A = c a l c _ a r e a ( RL , t y p e ) ;
V = A*h;
end
14