Vous êtes sur la page 1sur 10

Pr actica 4

Funciones
4.1 Introducci on

Esta pr actica servir a para ilustrar el concepto de funci on mediante el empleo de funciones simples en el entorno del programa MATLAB.

4.1.1

Objetivos

Se pretende que el alumno: Aprenda el uso b asico de las funciones. Experimente con programas que hacen uso de funciones. Realice sus propias funciones que le sirvan para resolver partes de un problema mayor.

4.1.2

Requisitos

Se requiere que el alumno acuda a la sesi on pr actica con una copia de estas notas y con alg un documento identicaci on: DNI, permiso de conducci on, tarjeta de la universidad, pasaporte, etc. Se requiere tener asimilados los conceptos de los diagramas de ujo con funciones, correspondientes a las clases de teor a y problemas.

4.1.3

Desarrollo de la pr actica

El alumno deber a realizar todos los puntos que se indican a continuaci on en el orden en que aparecen. 1. Leer estas notas antes de la sesi on pr actica, despejando cualquier duda mediante consulta a sus apuntes de clase. 2. Escribir en el entorno MATLAB todos los ejemplos que aparecen en estas notas, contemplando luego los resultados. Este proceso ha de realizarse de forma cr tica. Antes de pasar al problema siguiente aseg urese que el programa que haya creado funciona perfectamente y resuelve el problema planteado. 3. Explorar ejemplos similares a los propuestos, cambiando alguna que otra cosa. En esas pruebas debe ser capaz de predecir el resultado de los cambios introducidos. De este modo aprender a el uso de la herramienta MATLAB. 4. Resolver los ejercicios de autoevaluaci on, comprobando la soluci on mediante pruebas en el entorno de MATLAB. 39

40

PRACTICA 4. FUNCIONES

4.2

Funciones

Una funci on es un conjunto de ordenes que lleva a cabo una tarea precisa. Las funciones son empleadas como si fuesen ordenes simples aunque en realidad una funci on puede estar compuesta de muchas sentencias. El uso m as com un de una funci on es el de calcular resultados utilizando los datos que se le suministran expl citamente. Un ejemplo de funci on es el seno (sin). Observe que cumple las condiciones que se han comentado: Es un conjunto de ordenes (aunque no podamos verlas). Realiza una tarea concreta consistente en calcular el seno del n umero indicado. Calcula resultados a partir de datos suministrados (considere a modo de ejemplo la expresi on y=sin(1.5);). Adem as de las funciones existentes en MATLAB hay mecanismos para que el usuario escriba funciones nuevas. Para ello s olo tiene que preparar en un archivo de texto las ordenes de MATLAB que realizan un determinado c alculo y posteriormente a nadir una cabecera que permita a esas ordenes trabajar como debe hacerlo una funci on. Se va a ilustrar el procedimiento con un ejemplo. Suponga que se necesita una funci on que calcule el factorial de un n umero dado n. Se comienza dise nando un diagrama de ujo tal y como el que se muestra a continuaci on. En el se supone que n es un n umero entero que ya se ha le do y que no es negativo.

inicio producto factor 1 2

Objeto dato ya le do resultado = n! contador de 2 a n y factor para multiplicar variable auxiliar, producto parcial valor inicial para el producto valor inicial para el factor

Nombre n factorial factor

Tipo entero entero entero

Valor variable variable variable


producto

no factor s productofactor n?

producto 1 2

entero entero entero

variable constante

factor

factor + 1

factorial

producto fin

constante

A partir de dicho diagrama se pasa a la codicaci on en MATLAB, tarea que resulta simple pues basta con escribir en un archivo las o rdenes: producto=1; % se inicia el producto a uno for factor=2:n, % para cada factor entre 2 y n producto = producto*factor; % nuevo valor del producto parcial end factorial = producto; % el resultado es el producto obtenido

Inform atica,

1o

Ing. Civil

Dpto. Ingenier a de Sistemas y Autom atica. ETSI. US.

41

y con esto se tiene resuelto parte del problema. Antes de pasar a convertir ese conjunto de rdenes en una funci o on se van a hacer unas pruebas que sirvan para comprender la diferencia entre una funci on y un archivo M normal y corriente. En primer lugar, guarde el c odigo proporcionado en un archivo de nombre facto.m en su carpeta de trabajo. Despu es, seleccione esa carpeta como la carpeta de trabajo de MATLAB. Ahora se va a ejecutar el programa, pero antes hay que proporcionar un valor a n, por ejemplo, si se quiere calcular el factorial de 5 se escribir a: >>n=5; >>facto; Y el resultado se habr a copiado en la variable factorial, como podr a comprobar escribiendo: >>disp(factorial); Este ejemplo deja bien claro que para utilizar este trozo de c odigo es necesario recordar que siempre se ha de usar la variable n para el dato. Dicho de otro modo, este trozo de c odigo no sirve si se pretende calcular el factorial de x o de q. Pruebe por ejemplo lo siguiente: >>clear all; >>x=5; >>facto; Como se puede ver esta forma de proceder es inc omoda. Las funciones intentan precisamente evitar este y otros inconvenientes. Hechas estas comprobaciones se va a generar la funci on. En primer lugar se dibuja el diagrama de ujo de la misma, para lo cual se modican los bloques de inicio y nal. El resultado se muestra a continuaci on:

inicio del clculo de factorial como mi_fact(n) producto factor 1 2

factor s producto factor

n?

no

productofactor factor + 1

factorial

producto

fin del clculo de factorial como mi_fact(n)

Objeto argumento resultado = n! contador de 2 a n y factor para multiplicar variable auxiliar, producto parcial valor inicial para el producto valor inicial para el factor

Nombre n factorial factor

Tipo entero entero entero

Valor variable variable variable

producto 1 2

entero entero entero

variable constante constante

Para codicar la funci on en MATLAB se necesita a nadir una cabecera para que el trozo de c odigo se convierta en una funci on, de este modo se llega a:

42

PRACTICA 4. FUNCIONES

function [factorial] = mi_fact(n) producto=1; % se inicia el producto a uno for factor=2:n, % para cada factor entre 2 y n producto = producto*factor; % nuevo valor del producto parcial end factorial = producto; % el resultado es el producto obtenido Se ha de guardar este texto en un archivo M cuyo nombre ha de ser mi fact.m. Este nombre se ha escogido para recalcar que es una funci on del usuario (m a) y que calcula el factorial. Para probar mediante ejemplos que este archivo M es una funci on escriba en la ventana de ordenes de MATLAB lo siguiente: >> y=mi_fact(5); >> disp(y); 120 observe que se obtiene el resultado correcto pues 5! = 120. Cada vez que se utiliza una funci on se dice que se hace una llamada a la misma, o que se la invoca. N otese que esta invocaci on, uso o llamada produce un efecto interesante: el valor que se le proporciona (el valor 5 en el ejemplo) es copiado en la variable n de la funci on, de modo que las ordenes que se hab an escrito y que calculan el factorial de n est an en realidad calculando el factorial del dato escrito entre par entesis. A este fen omeno se le suele llamar pase de argumento. Por otra parte, el resultado que se calcula y almacena en la variable factorial aparece tras la llamada en el entorno de MATLAB. Si esto no se entiende del todo considere este otro ejemplo: >> y=0 y = 0 >> y=mi_fact(4) y = 24 Ahora debe ser obvio que el valor de factorial ha sido asignado a la variable y. A este fen omeno se le da el nombre de devoluci on de resultados. Con esta explicaci on ya tiene sentido una frase habitual entre programadores como le pas e a la funci on el valor 4 y me devolvi o en y el factorial de 4. La nueva funci on mi fact puede usarse dentro de MATLAB en expresiones de todo tipo. Por ejemplo: >> mi_fact(4)+2 ans = 26 >> z=(mi_fact(4)+2)/2 z = 13 >> v(1)=-1; v(2)=mi_fact(3+2); >> disp(v(2)); 120

Inform atica,

1o

Ing. Civil

Dpto. Ingenier a de Sistemas y Autom atica. ETSI. US.

43

Antes de continuar haga pruebas con la funci on mi fact y con el programa facto y compruebe la diferente forma de funcionamiento.

4.2.1

Variables locales

Continuando con el ejemplo anterior es instructivo utilizar la orden who para ver qu e variables se est an utilizando. Previamente conviene eliminar todas las variables existentes con la orden clear all, despu es calcule y = mi fact(4), nalmente se va a averiguar qu e variables existen mediante:

>> who Your variables are: y

el resultado obtenido quiz a debiera sorprender, porque, d onde est a la variable producto?, y factorial?, y multiplicador?, y n?. La u nica variable que parece existir (seg un indica el resultado de who) es y. La respuesta es que estas variables no son visibles desde el entorno de MATLAB pues est an ocultas dentro de la funci on mi fact. Esta caracter stica es muy u til pues de este modo cada funci on puede usar variables con el nombre que quiera sin que haya que preocuparse porque esta variable ya exista previamente en otra funci on. Este hecho se produce con las funciones, pero no con cualquier archivo M. Pruebe ahora la siguiente secuencia de ordenes y compruebe la diferencia.

>> >> >> >>

clear all n=4; facto; who

4.2.2

Argumentos

Los datos que se proporcionan a la funci on se llaman argumentos por analog a con las funciones matem aticas. Una funci on en MATLAB puede tener cualquier n umero de argumentos. Adem as los argumentos pueden ser variables escalares, vectores, matrices, etc. A modo de ejemplo considere la funci on potenciap que admite dos argumentos x e y , siendo x IR e y Z y que y calcula x haciendo la suposici on de que y es un entero no negativo. El diagrama de ujo se muestra a continuaci on

44

PRACTICA 4. FUNCIONES

inicio del clculo de xeay como potenciap(x,y) producto contador 0 1

no contador<y?

s producto productox

contador

contador+1

xeay

producto

fin del clculo de xeay como potenciap(x,y)

Objeto argumento, base argumento, exponente resultado, xy contador de multiplicaciones realizadas (de 0 a n-1) variable auxiliar, producto parcial valor inicial para el producto y valor para incrementos del contador valor inicial para el contador

Nombre x y xeay contador

Tipo real entero real entero

Valor variable variable variable variable

producto 1

real entero

variable constante

entero

constante

La codicaci on en MATLAB se realiza del siguiente modo: function [xeay] = potenciap(x, y) % funci on para calcular x a la y producto=1; % valor inicial para la variable producto parcial contador=0; % valor inicial para el contador de multiplicaciones while(contador<y) % mientras contador sea menor que y producto = producto * x; % se multiplica el producto actual por x contador = contador + 1; % se incrementa el contador end xeay = producto; % el resultado es el ultimo producto El c odigo anterior se guardar a en un archivo de nombre potenciap.m. Para ver si la codicaci on ha sido correcta se pueden realizar algunas llamadas a la funci on y ver si devuelve los resultados esperados. Por ejemplo: >> z = potenciap(2,4); >> disp(z); 16 >> m=potenciap(-2,5) >> disp(m); -32 >> q=potenciap(2,0) >> disp(q); 1 Observe que en este ejemplo la llamada a la funci on se hace colocando dos argumentos entre par entesis. El primer argumento es el valor que toma x y el segundo es el valor que toma y . Se puede ver que en todos los casos el resultado obtenido es xy como se pretend a.

Inform atica,

1o

Ing. Civil

Dpto. Ingenier a de Sistemas y Autom atica. ETSI. US.

45

4.2.3

Ejercicio: media de vectores

Para terminar con este apartado se va a mostrar una funci on que trabaja con vectores. Se pretende que la funci on reciba como datos un vector y el n umero de componentes que contiene y devuelva como resultado la media aritm etica de sus componentes. La llamada a la funci on ser a media(v, n), siendo v el vector y n el n umero de componentes. A modo de ejemplo, si se tiene el vector w = (8, 4, 4, 8) y se quiere calcular su media m, entonces se podr a usar la funci on mediante la expresi on: >> m = media(w, 4); con lo que la variable m tomar a el valor 6. El diagrama de ujo para este problema es similar a los del tema 7, conviene que dedique un rato a obtener dicho diagrama. La codicaci on en MATLAB se presenta a continuaci on. function [mediavector] = media(v, n) suma=0; % se inicia a cero la suma parcial for k=1:n, % para cada componente desde 1 hasta n suma = suma + v(k); % se a~ nade a la sumaparcial end mediavector = suma/n; % resultado Escriba las sentencias anteriores en un archivo de nombre media.m. El buen funcionamiento de la funci on puede ponerse a prueba mediante algunas llamadas a la misma. Por ejemplo: >> v = [ 1 2 3 4]; >> y=media(v, 4); >> disp(y); 2.5000 Realice pruebas con esta funci on y compruebe que la funci on puede tomar como argumento vectores de dimensiones diversas.

4.3

Autoevaluaci on

Se incluyen a continuaci on unos ejercicios que plantean crear y probar funciones. En cada caso la tarea pasa por realizar un diagrama de ujo y luego intentar codicar una funci on de MATLAB y probar su buen funcionamiento. Si su soluci on no funciona debe buscar los errores por s mismo. Si a pesar de todo no consigue resolver el problema pruebe a introducir la soluci on que aqu se indica.

4.3.1

Ejercicio 1. Polinomio

Enunciado. Una funci on de nombre Poli ha de admitir como argumento un n umero real z . 3 2 La funci on calcular a el valor del polinomio P(x) = x x x + 2 en el punto x = z y devolver a el resultado r = P(z ). En otras palabras, la funci on ha de calcular y devolver la cantidad P(z ). Escriba el c odigo de MATLAB de la funci on Poli. Discusi on. Se pide el c ogido de una funci on con un nombre concreto y que admite un cierto argumento y devuelve un cierto resultado. El c alculo a realizar es elemental y la dicultad estriba en colocar bien la cabecera para funciones.

46

PRACTICA 4. FUNCIONES

Soluci on. El diagrama de ujo que resuelve el problema es similar a los que se muestran en el tema 7. A partir del diagrama se codica f acilmente la funci on poniendo atenci on a la cabecera. function [r] = Poli(x) r = x*x*x - x*x - x + 2; Realice pruebas con esta funci on para comprobar que funciona debidamente.

4.3.2

Ejercicio 2. Una funci on para trazar gr acas

Enunciado. Se desea dibujar la gr aca de y = ax2 , variando las abscisas entre dos valores [xini , xf in ]. La gr aca ha de contener un n umero de puntos equiespaciados n. Se desea programar una funci on que realice esta tarea. La funci on tendr a de nombre grparab, recibir a como argumentos los valores a, xini , xf in y n y trazar a la gr aca en cuesti on usando la funci on plot de MATLAB. Adem as la funci on devolver a el incremento en abscisas entre dos puntos cualesquiera consecutivos en la gr aca. Se ha de suponer que n es un valor entero, que n > 1, que xini < xf in y que los puntos de la gr aca comienzan y acaban en los extremos del intervalo. L ogicamente, para el diagrama de ujo se permite el uso de la funci on plot. Escriba el c odigo de MATLAB de la funci on grparab. Discusi on. Se pide el c ogido de una funci on con un nombre concreto y que admite ciertos argumentos. La funci on traza una gr aca por lo que previamente ha de calcular dos vectores adecuado y luego usar la funci on plot. La funci on devuelve el incremento en el eje x entre dos puntos consecutivos de la gr aca. Se trata pues de un ejercicio similar a los de la pr actica 2 pero usando funciones. Soluci on. El diagrama de ujo que resuelve el problema se muestra en la gura 4.1. La codicaci on en MATLAB se obtiene f acilmente mediante una estructura para como se muestra a continuaci on. function [incremx] = grparab( a, xini, xfin, n)

incremx = (xfin-xini)/(n-1); for k=1:n, vx(k) = xini + (k-1)*incremx; vy(k) = a*vx(k)*vx(k); end plot( vx, vy); Realice pruebas con esta funci on para comprobar que funciona debidamente.

Inform atica,

1o

Ing. Civil

Dpto. Ingenier a de Sistemas y Autom atica. ETSI. US.

47

inicio del clculo de incremx como grparab(a, xini, xfin, n) incremx (xfin-xini)/(n-1) k 1

n? s

no

vx k vy k

xini + (k-1)incremx avx k vx k

k + 1

plot(vx, vy) fin del clculo de incremx como grparab(a, xini, xfin, n)

Objeto argumento, coeciente de x2 argumento, abscisa inicial argumento, abscisa nal argumento, n umero de puntos resultado, incremento de abscisas contador y sub ndice de vectores vector auxiliar de abscisas para dibujo vector auxiliar de ordenadas para dibujo valor inicial e incremental del contador

Nombre a xini xn n incremx k vx vy 1

Tipo real real real entero real entero vector de reales vector de reales entero

Valor variable variable variable variable variable variable variable variable constante

Figura 4.1: Diagrama de ujo de la funci on grparab.

48

PRACTICA 4. FUNCIONES

4.4
4.4.1

Ejercicios propuestos adicionales


Ejercicio propuesto 1.

Dado un vector v IR1n , se pide que desarrolle el programa que calcule la suma s=
k =n k=1 2 (vk m) ,

siendo m la media de las componentes del vector. Para ello, escriba una funci on de nombre momvec que tome como argumento el l mite n (suponiendo que es un n umero entero n > 2) y el vector v . La funci on devolver a el valor de la suma s y no usar a funciones auxiliares.

4.4.2

Ejercicio propuesto 2.

Se desea desarrollar un programa que calcule la suma dada por s=


n 1 . kn k=1

Escriba una funci on de nombre slim que tome como argumento el l mite n (suponiendo que es un n umero entero n > 2). La funci on devolver a el valor de la suma s y no usar a funciones auxiliares.

4.4.3

Ejercicio propuesto 3.

Dado un valor entero y > 1000 se desea hallar otro valor entero x tal que sea una soluci on 3 2 aproximada a la ecuaci on x 2x = y . Para ello, calcule un valor entero xs que cumple 2 y < (x + 1)3 2(x + 1)2 . Codique una funci x3 2 x on en de nombre solent que reciba s s s s como argumento el valor y devolviendo como resultado el valor xs .

Vous aimerez peut-être aussi