Práctica 3: Funciones

Anuncio
Fonaments d’Informàtica
1r curs d’Enginyeria Industrial
Práctica 3: Funciones
Objetivos de la práctica
En esta práctica estudiaremos cómo podemos aumentar la funcionalidad del
lenguaje MATLAB para nuestras aplicaciones definiendo funciones.
Antes de comenzar
En primer lugar debéis crear vuestra carpeta de trabajo con el explorador de
Windows.
A continuación, iniciar MALTAB y cambiar el directorio a la carpeta de
trabajo que habéis creado:
• pwd
indica cuál es el directorio actual
• dir
contenidos del directorio actual
• cd camino
cambiar de directorio.
M-files en MATLAB
Los M-files pueden ser scripts, que simplemente ejecutan una serie de
órdenes o instrucciones de MATLAB; o pueden ser funciones, que además
aceptan argumentos y producen resultados.
Se crea un M-file utilizando un editor de textos. La versión 5.3 de MATLAB
tiene su propio editor (medit). Utilizamos el editor para escribir el M-file,
a continuación lo grabamos y lo llamamos directamente desde la línea de
comandos de MATLAB como si fuera cualquier otra orden de las que ya
conocemos.
Scripts vs. Funciones
Funciones
Scripts
• No aceptan argumentos de • Aceptan argumentos de entrada y
entrada ni producen resultados de
producen resultados
salida
• Trabajan sobre las variables en el • Por defecto, las variables internas
workspace
son locales a la función
• Útiles para automatizar una serie • Útiles para extender el lenguaje
de pasos que se repiten muchas
MATLAB para tus aplicaciones
veces
Los scripts trabajan sobre variables en el Workspace de la línea de
comandos o crean nuevas variables que son añadidas a dicho Workspace,
de modo que todas esas variables pueden ser luego manipuladas desde la
línea de comandos.
Funciones
Veremos un ejemplo de función y sobre ella describiremos sus elementos
básicos.
%Definición de la función
function pf = pvt (p)
%Línea H1
% PVT Precio venta publico
% PVT (p) devuelve el precio con IVA, %Texto ayuda
% de un producto, dado su precio (p) sin IVA.
iva = 0.16;
pf = p * (1+ iva);
%Cuerpo de la función
• Definición de la función: Esta línea define el nombre de la función
(pvt) y el número y orden de parámetros de entrada (en el ejemplo, un
parámetro: p) y el número y orden de parámetros de salida o resultados
(en el ejemplo, un parámetro: pf).
function pf = pvt (p)
parámetro de entrada
nombre de la función
parámetro de salida
palabra reservada
Si la función tiene más de un parámetro de entrada, estos se separan por
comas y si tiene más de un parámetro de salida se escribe la lista
separada por comas y entre corchetes ([ ]). Este sería un ejemplo
general:
function [x, y] = mifuncion (a, b, c)
• Línea H1: Se trata de una primera línea comentada (empieza con %) tras
la línea de definición de la función. MATLAB muestra esta primera
ayuda cuando usamos el comando lookfor o pedimos ayuda sobre un
directorio
• Texto de ayuda: MATLAB muestra este texto junto con la línea H1
cuando solicitamos ayuda sobre una determinada función (help pvt).
Se muestra el texto comentado hasta la primera línea en blanco o la
primera línea ejecutable. El resto de comentarios tras este bloque se
ignoran.
• Cuerpo de la función: esta parte contiene las sentencias que realizan
los cálculos y asignan valores a los parámetros de salida.
La función opera sobre variables en su propio espacio de trabajo, separado
del espacio de trabajo de la línea de comandos.
Nombre de la función
Los nombres de las funciones deben empezar por una letra. Por lo demás,
pueden ser cualquier combinación de letras, números o signos.
El nombre del fichero (M-file) que contiene la función es el mismo nombre
de la función seguido de la extensión .m.
pvt.m
Cuando llamamos a una función, MATLAB busca en el espacio de trabajo y
después en los directorios indicados en el pathwork (comando path).
Si queremos conocer los M-files que tenemos en nuestro directorio de
trabajo, escribiremos la orden what en la línea de comandos.
Si queremos ver el contenido del M-file pvt.m, entonces teclearemos en la
línea de comandos:
>> type pvt
Llamada a una función
Podemos llamar a una función desde la línea de comandos, como si fuera
cualquier otra orden o función ya definida en MATLAB. También podemos
llamar a una función dentro de otra función como veremos en posteriores
prácticas.
>> precio = 1000;
>> preciofinal = pvt(precio)
>>
preciofinal =
1160
Observar que los parámetros de entrada y salida no tienen por qué tener el
mismo nombre que en la definición de la función.
>> preciofinal = pvt(1400)
>>
preciofinal =
1624
Es importante escribir todos los parámetros de entrada entre paréntesis y
todos los parámetros de salida entre corchete, siempre en el orden
correspondiente:
>> [v, w] = mifuncion (a, b, c)
Las variables de una función son locales, de modo que, aunque en el seno
de la función se modifiquen los argumentos de entrada, el valor de dichas
variables en el Workspace queda inalterado.
Ejercicios
1) Se tienen los partidos ganados (ge) por un equipo de fútbol, los partidos
perdidos (pp) y los partidos empatados (pe). Escribir:
a) Una función que calcule los partidos jugados por el equipo.
b) Una función que calcule los puntos obtenidos en total.
c) Una función que calcule los puntos por partido.
2) Escribir una función que calcule las combinaciones de n sobre m:
comb(n,m)= n! / (m! * (n-m)!)
3) Escribir una función que calcule el perímetro de un círculo dado su
radio.
4) Escribir una función que calcule el área de un círculo dado su radio.
5) Modifica la función anterior para que dado el círculo, calcule tanto el
área como la longitud de la circunferencia.
6) Escribir una función que calcule las dos raíces de una ecuación de
segundo grado: ax2+bx+c=0.
7) Escribir una función que convierta un número binario en hexadecimal.
8) Escribir una función (base2base) que convierta una cadena que
representa un número en cualquier base a cualquier otra base que se
indique.
9) Escribir una función que calcule la deformación de una viga de longitud
L sujeta en los extremos, cuando se le aplica una fuerza F en el punto
central. Dicha deformación depende además de la elasticidad (E) y del
momento de inercia (I) y se calcula como:
deformación = (-F*L3) / (48*E*I*)
Calcular cuál será la deformación (en pulgadas) para una viga de las
siguientes características: L= 15 ft., F=50.000 lb., E=30*106 lb/in2,
I=797 in4.
Queremos ahora observar cómo varía la deformación de la viga en
función de la fuerza que se le aplique. Para ello, definiremos f como
un vector que toma valores entre 20000 y 60000, aplicaremos la
función que hemos escrito para los valores de f y dibujaremos la
gráfica con la fuerza en las abscisas y la deformación en las ordenadas:
>> f =20000:1000:60000;
>> d= deformacion (L, f, E, I);
>> plot (f, d);
10) La siguiente función calcula la parábola y=x2 entre n y -n a intervalos
de 0.1:
function y = x (n)
% x Calcula la función y=x2
% x(n) La función se representa entre los
valores -n y n
x=-n:0.1:n;
y=x.^2;
plot(x,y);
grid;
Escribir dicha función y comprobar su funcionamiento. Modificar la
p
función para que podamos calcular la función y=x , donde p sea
cualquier valor positivo.
11) Sabiendo que cada carácter se representa con 8 bits, escribir una
función tal que dada una cadena de unos y ceros que representa una
palabra en binario (la longitud de la cadena debe ser múltiplo de 8),
devuelva la palabra (con caracteres) que representa. Utilizar la función
length para conocer la longitud de la cadena y la función reshape
para separar la cadena de unos y ceros en grupos de 8 bits.
12) MATLAB no tiene definidas operaciones para valores enteros. Por
ejemplo, definir a y b de la siguiente forma y comprobar que no
podemos hacer a+b:
>>a=int8(40);
>>b=int8(110);
Escribir una función que reciba dos valores enteros y devuelva su
suma entera.
13) Diseñar una función en MATLAB que calcule la superficie y
volumen de un cilindro dados su radio (r) y altura (h) (V=πr2h,
S=2πr2+2πrh).
14) La presión atmosférica (p) varía en función de la altura (h) según la
siguiente expresión: p=1035*e-0.12h, donde la altura se mide en
kilómetros y la presión en milibares.
a) Escribir una función que calcule la presión para una altura dada.
b) Utilizando la función anterior, dibujar la gráfica que representa la
variación de la presión cuando la altura va de 0 a 30km. (tomados de
1 en 1.)
15) Sabiendo que la resistencia total de 3 resistencias conectadas en serie
es:
rT= r1 + r2 + r3
Y que si dichas resistencias se conectan en paralelo, entonces su
resistencia total es:
1/rT = 1/r1 + 1/r2 + 1/r3
Escribir una función tal que dadas 3 resistencias calcule su resistencia
total conectadas en paralelo y en serie.
Fonaments d’Informàtica
1r curs d’Enginyeria Industrial
Práctica 3 (cont.): Funciones
Objetivos de la práctica
En esta práctica se continuarán ampliando los conocimientos sobre el
diseño de funciones en MATLAB.
Subfunciones
Los ficheros de funciones en MATLAB pueden contener más de una
función. La primera función en el fichero es la función principal, aquella
que es invocada con el nombre del fichero (M-file). El resto de funciones
en ese mismo fichero son subfunciones y son únicamente visibles para la
función principal u otras subfunciones en ese mismo fichero.
Cada subfunción comienza con su propia línea de definición. Las diferentes
subfunciones están una detrás de otra en el fichero y pueden aparecer en
cualquier orden, siempre y cuando la función principal esté la primera.
Ejemplo:
function [long, area] = circulo (radio) %función principal
% CIRCULO Calcula el perimetro y el area de un circulo dado
su radio
long = perimetro(radio);
area = areacirc (radio);
function p = perimetro (rad)
%calcula el perímetro de un círculo
p = 2 * pi *rad;
% subfunción
function a= aracirc(rad)
%calcula el área de un círculo
a = pi *rad^2;
% subfunción
Nota: Observar que la función circulo sí es visible para cualquier otra
función. Esto es, podemos llamar a la función circulo desde cualquier
otra función que definamos o desde la línea de comandos de MATLAB. Sin
embargo, las funciones perimetro y areacirc sólo son visibles para
la función circulo. Es muy importante, por tanto, decidir cuándo vamos
a definir una función como subfunción de otra, puesto que su uso queda
restringido sólo al ámbito de la función principal.
Ejercicio:
Implementar la función circulo tal y como aparece en el recuadro
anterior. Calcular el área y perímetro de un círculo de radio 2.5, llamando a
la función desde la línea de comandos. Desde la línea de comandos llamar
a la función perimetro para que calcule el perímetro del círculo.
Observar que ocurre. Desde la línea de comandos, escribir la orden what.
Observar qué funciones (ficheros .m) aparecen.
Definir ahora las funciones circulo2, perimetro2 y
areacirc2 pero cada una de ellas como función independiente. Repetir
los pasos indicados en el párrafo anterior y observar las diferencias.
Ejercicios
1. Sea una circunferencia centrada en el origen de coordenadas. Dado un
punto de la circunferencia P (x, y), escribir una función que calcule el
radio y el ángulo en grados sexagesimales de dicho punto sobre la
circunferencia. Para ello, definir una subfunción que calcule el radio,
otra que calcule el ángulo en radianes y una tercera que convierta de
radianes a grados sexagesimales.
(x,y)
tg α = y/x
α
2. Se lanza una pelota con una velocidad inicial v0=15m/s. La velocidad
(v) y la posición (d) de la pelota después de t segundos vienen
expresadas como:
v = v0 + at
d = v0t + (at2)/2
Donde a es la acelaración de la gravedad (-9.80665 m/s2). La distancia
se mide en metros y la velocidad en metros por segundo.
Escribir una función en MATLAB (utilizando subfunciones) que calcule
la velocidad que lleva la pelota y la distancia recorrida tras t segundos.
Comprobar el comportamiento de la pelota dibujando las gráficas de
velocidad y distancia para valores de t entre 0 y 3 segundos (a
intervalos de 0.1 segundos).
3. Diseñar una función que recibe la hora actual (horas, minutos y
segundos) y devuelve los segundos transcurridos desde la medianoche.
La función utilizará subfunciones para pasar de horas y minutos,
respectivamente, a segundos.
4. Repetir el ejercicio anterior pero utilizando 3 funciones independientes
(sin subfunciones).
Descargar