Funciones

21
Funciones Estamos acostumbrados a trabajar con funciones del tipo y=f(x) donde f(x) es una expresión matemática en términos de la variable x. Se calcula un valor de y (salida) cuando se proporciona un valor de x (entrada) en la expresión. MATLAB define muchas funciones como sin(x), sqrt(x), etc. Podemos definir nuestras propias funciones guardarlas en un fichero y usarlas de un modo semejante a las funciones predefinidas. En muchos casos las funciones son los componentes básicos dentro de un programa de ordenador. Habitualmente, un programa se subdivide en tareas y cada una de ellas es llevada a cabo por una función, a esta forma de resolver los problemas se denomina programación estructurada. La principal ventaja de las funciones es la posibilidad de reutilizar el código en otros programas distintos al cual fueron definidas. La entrada y la salida puede ser una o varias variables, cada una de ellas puede ser un escalar, un vector o una matriz de cualquier tamaño. Definición de una función Las funciones se crean del mismo modo que un script seleccionado en el menú File/New/Function y se guardan en un fichero que tiene el mismo nombre que la función y extensión .m

description

funciones

Transcript of Funciones

Funciones

Estamos acostumbrados a trabajar con funciones del tipoy=f(x) dondef(x) es una expresin matemtica en trminos de la variablex. Se calcula un valor dey(salida) cuando se proporciona un valor dex(entrada) en la expresin. MATLAB define muchas funciones comosin(x),sqrt(x), etc.

Podemos definir nuestras propias funciones guardarlas en un fichero y usarlas de un modo semejante a las funciones predefinidas. En muchos casos las funciones son los componentes bsicos dentro de un programa de ordenador. Habitualmente, un programa se subdivide en tareas y cada una de ellas es llevada a cabo por una funcin, a esta forma de resolver los problemas se denomina programacin estructurada.

La principal ventaja de las funciones es la posibilidad de reutilizar el cdigo en otros programas distintos al cual fueron definidas.

La entrada y la salida puede ser una o varias variables, cada una de ellas puede ser un escalar, un vector o una matriz de cualquier tamao.

Definicin de una funcin

Las funciones se crean del mismo modo que un script seleccionado en el menFile/New/Functiony se guardan en un fichero que tiene el mismo nombre que la funcin y extensin .m

La primera lnea en el editor es la definicin de la funcin que comienza con la palabra clavefunction

function variables_salida=nombre_funcion(variables_entrada)

sentencias

end

nombre_funcion, es el nombre significativo que se le asigna a la funcin y coincide con el nombre del fichero de extensin .men el que se guarda el cdigo de dicha funcin. Las reglas para nombrar un funcin son las mismas que para las variables, los nombres no deben de incluir espacios, ni se pueden utilizar plabras reservadas por MATLAB.

variables_entrada, es el conjunto de parmetros que se le pasa a la funcin. Los nombres de las variables van entre parntesis y separadas por coma.

variabales_salida, es el valor o conjunto de valores de las variables devueltos por la funcin. Las variables de salida van despus de la palabra reservadafunctionentre corchetes cuadrados y separados por comas si hay varios.

sentencias, lneas de cdigo que tomando los valores de los parmetros de entrada calculan mediante expresiones los valores que devuelve la funcin.

end, marca el final de la funcin es opcional (salvo en las funciones anidadas) pero es conveniente acostumbrarse a ponerlo al finalizar la funcin.

Opcionalmente, en la segunda lnea se pone un comentario, en el que se explica la tarea que realiza la funcin. A continuacin, una explicacin detallada sobre las variables de entrada y de salida

Cuando una funcin no devuelve ningn valor, se define

functionnombre_funcion(variables_entrada)

Cuando una funcion no precisa de variables de entrada se define

functionvariables_salida=nombre_funcion

Cuando una funcin devuelve una solo resultadoyse puede escribir, de dos maneras

function [y]=nombre_funcion(a,b,c)functiony=nombre_funcion(a,b,c)

En general, definiremos una funcin del siguiente modo:

function [y1,y2]=nombre_funcion(a,b,c)

con tres argumentosa,bycvariables de entrada y que devuelve dos resultados en las variablesy1 ey2.

Una funcin se llama del mismo modo que las funciones predefinidas. Las funciones se pueden llamar desde la ventana de comandos, desde un fichero script o desde otra funcin.

Todas las variables en una funcin son locales a dicha funcin, incluyendo las de entrada y las de salida.

Vamos a ver unos cuantos ejemplos en esta pgina de funciones.

Ejemplos

Suma de dos nmeros

Empezaremos por una funcinsumaque realiza la siguiente tarea, suma de dos nmerosxeyy devuelve la sumaz=x+y

Definicin de la funcin

function [z] = suma (x,y)

%Esta funcin suma dos nmeros x e y

%y devuelve el resultado de la suma en z

z=x+y; %efecta la suma

end

A la funcinsumase le pasan dos datos en las variablesxey, y devuelve el resultado en la variablez.

La funcin se guarda en un fichero

El fichero que guarda la funcin tiene el mismo nombre que la funcin, tal como vemos al seleccionar en elEditorFile/Save as...

Llamada a la funcin

La llamada a la funcin se puede hacer desde la ventana de comandos

>> suma(2,3)

ans = 5

Se puede hacer desde un script

a=3;

b=2;

res=suma(a,b);

disp(res)

En la llamada a la funcinsumasu parmetroxadquiere el valor del primer argumentoa, el segundo parmetroytoma el valor del argumentob, se efecta la suma en el cuerpo de la funcin, se guarda el resultado en la variable z que devuelve la funcin. El valor que guarda z se copia en la variableres. Las variablesx,yy z son locales a la funcin y por tanto, no aparecen en la ventanaWorkspace, no se puede acceder a ellas desde la ventana de comandos.

Como hemos visto hay que pasar los valores que guardan las variablesayba la funcinsumapor que una funcin no tiene acceso a las variables declaradas en un script o en la ventana de comandos.

Sistema de ayuda

En la ventana de comandos escribimos

>> help suma

Esta funcin suma dos nmeros x e y

y devuelve el resultado de la suma en z

aparecen los comentarios que hemos puesto al principio de la funcin, pero no aparecen el comentario "efecta la suma", que hemos puesto en la tercera lnea.

Movimiento de cada de los cuerpos

Las ecuaciones que describen el movimiento de cada de los cuerpos son:

v=v0+gtx=x0+v0t+12gt2

Dondev0yx0es la velocidad inicial y la posicin inicial, respectivamente.Vamos a crear una funcin denominadacaida_libreque admita como parmetros el tiempoty devuelva la posicinxy velocidadvde un mvil que se lanza desde 200 m de altura con velocidad de 40 m/s. La aceleracin constante de la gravedadg=-10 m/s2

v=40-10tx=200+40t-5t2

SeleccionamosFile/New/Functionpara abrir el editor de funciones.

1. Definimos la funcin:

La palabra clavefunction

Las variables de salida entre corchetes cuadrados [x,v]

El operador asignacin =

El nombre de la funcin,caida_libre

Entre parntesis la variable de entrada (t)

2. Escribimos el cuerpo de la funcin con dos sentencias que calculan la velocidadvy la posicinxcuando se proporciona el dato del tiempot

3. Finalizamos conend.

4. SeleccionamosFile/Save As.. para guardar la funcin en el fichero caida_libre.m con el mismo nombre que la funcin.

function [x,v] = caida_libre(t) v=40-10*t; x=200+40*t-5*t^2;end

En la ventana de comandos se llama a esta funcincaida_libre, pasndole un tiempot=2 s, del siguiente modo

>> [pos,vel]=caida_libre(2)

pos = 240

vel = 20

Que calcula y muestra, la velocidadv=20 m/s y la posicinx=240 m en el instantet=2 s

En la llamada a la funcincaida_libreel parmetrotadquiere el valor de 2, en las dos sentencias se calcula la velocidad y posicin y se guardan en las variables localesvyx. La funcin devuelve estos dos valores que se copian en las variablesvelyposde la ventana de comandos. En la ventana de comandos no tenemos acceso a las variablest,vyxpor ser locales a la funcincaida_librey desaparecen cuando termina de ejecutarse, pero si tenemos acceso a las variablesvelyposque guardan los resultados del clculo realizado en el cuerpo de la funcin.

Si intentamos acceder a la variablexotobtendremos un mensaje de error

>> x,t

??? Undefined function or variable 'x'.

Si queremos que la funcincaida_librecalcule la posicin y velocidad del mvil para una secuencia (vector) de tiempost, tendremos que modificar la definicin de dicha funcin

function [x,v] = caida_libre(t)

v=40-10*t;

x=200+40*t-5*t.^2;

end

En la ventana de comandos se llama a esta funcincaida_libre, pasndole los tiempost=[0,2,4,6,8,10] o bien,t=0:2:10 , del siguiente modo

>> t=0:2:10;

>> [pos,vel]=caida_libre(t)

pos = 200 260 280 260 200 100

vel = 40 20 0 -20 -40 -60

Media y desviacin estndar de un conjunto de datos

La definicin de media y desviacin estndar es la siguiente

=1nxin=1n(xix)2n1

Creamos una funcin denominadaestadisticaa la que se le pasa un vectorxde datos y devuelve la mediamedy la desviacin,des, y la guardamos en un fichero con el mismo nombre que la funcin

function [med,des]=estadistica(x) n=length(x); med=sum(x)/n; des=sqrt(sum((x-med).^2/(n-1)));end

La funcinsumcalcula la suma de los elementos de un vectorx

La funcinlength, calcula el nmero de elementos del vectorx.

Calcular la media y la desviacin estndar de la altura de los 10 alumnos de una clase:1.65, 1.82, 1.72, 1.75, 1.73, 1.85, 1.90, 1.74, 1.76, 1.77.

Escribimos el nombre de la funcinestadisticaen la ventana de comandos y le pasamos el vector de datos

>> [media, desviacion]=estadistica([1.65 1.82 1.72 1.75 1.73 1.85 1.90 1.74 1.76 1.77])

media = 1.7690

desviacion = 0.0713

MATLAB dispone de dos funciones que calculan la mediameany la desviacin estndar,std.

>> x=[1.65 1.82 1.72 1.75 1.73 1.85 1.90 1.74 1.76 1.77];

>> mean(x)

ans = 1.7690

>> std(x)

ans = 0.0713

Funciones definidas en el mismo fichero

Un fichero funcin puede contener ms de una funcin. Las funciones se definen una a continuacin de la otra. La primera funcin es la primaria y tiene el mismo nombre que el fichero, las otras funciones son secundarias y se denominan subfunciones y pueden estar en cualquier orden dentro del fichero. Solamente se puede llamar a la funcin primaria en la ventana de comandos o por otras funciones. Cada funcin tiene sus propias variables que son locales a la funcin, no se puede acceder a las variables de una subfuncin desde la funcin primaria o desde otra subfuncin. No se puede acceder a las variables de la funcin primaria desde una subfuncin.

Las subfunciones permiten organizar tareas grandes en otras ms pequeas.

Ms adelante veremos la utilidad de estas funciones cuando los programas sean ms largos y complejos, de momento vamos a ver un ejemplo que nos permita vislumbrar como se definen y llaman las subfunciones.

Ecuacin de segundo gradoax2+bx+c=0Las races sonx1yx2y tienen las siguientes propiedades:

x1=b+b24ac2ax2=bb24ac2ax1+x2=bax1x2=ca

Vamos a crear una funcin que nos permita comprobar las propiedades de las races de una ecuacin de segundo grado, y dos subfunciones, la primera calcula la razx1y la segunda la razx2.

En el editor de funciones creamos la funcincomprobar_raices, a la que se le pasa los coeficientesa,bycde la ecuacin de segundo grado y devuelve los cocientes -b/ayc/ade la suma y producto de las dos racesx1yx2. Guardamos el cdigo de la funcin primariacomprobar_raicesy de las subfuncionescalcula_raiz1 ycalcula_raiz2 en el fichero comprobar_raices.m

function [r1,r2]=comprobar_raices(a,b,c) x1=calcula_raiz1(a,b,c); x2=calcula_raiz2(a,b,c); r1=x1+x2; r2=x1*x2;endfunction raiz=calcula_raiz1(a,b,c) raiz=(-b+sqrt(b*b-4*a*c))/(2*a); end function raiz = calcula_raiz2(a,b,c) raiz=(-b-sqrt(b*b-4*a*c))/(2*a); end

Para comprobar las races de la ecuacin de segundo gradox2-x-6=0, llamamos a la funcincomprobar_raicesy le pasamos los coeficientes 1,-1,-6 y nos devolver -b/a=1 yc/a=-6

>> [b_a,c_a]=comprobar_raices(1,-1,-6)

b_a = 1

c_a = -6

Funciones anidadas

Una funcin anidada es una funcin definida dentro de otra funcin. Las funcin primaria y las anidadas deben obligatoriamente terminar conend

Las funciones anidadas tiene acceso a las variables de la funcin primaria y la funcin primaria tiene acceso a las variables definidas por la funcin anidada.

Una funcin anidada puede contener otra y as sucesivamente, pero este proceso puede llevar a confusin. Existen reglas para llamar a una funcin anidada dentro de otra pero no tiene por el momento inters para el lector.

En el editor de funciones creamos la funcincomprobar_raices1, a la que se le pasa los coeficientesa,bycde la ecuacin de segundo grado y devuelve los cocientes -b/ayc/ade la suma y producto de las dos racesx1yx2. Guardamos el cdigo de la funcin primariacomprobar_raices1 y de las subfuncionescalcula_raiz1 ycalcula_raiz2 en el fichero comprobar_raices1.m

function [r1,r2]=comprobar_raices1(a,b,c) dis=sqrt(b*b-4*a*c); calcula_raiz1; calcula_raiz2; r1=x1+x2; r2=x1*x2; function calcula_raiz1 x1=(-b+dis)/(2*a); end function calcula_raiz2 x1=(-b-dis)/(2*a); end end

Vemos que las funciones anidadascalcula_raiz1 ycalcula_raiz2 tienen acceso a los parmetrosa,bycde la funcin primaria, que son variables locales a la funcincomprobar_raicesy tambin, a la variable localdis,que guarda el discriminante de la ecuacin de segundo grado. Por otra parte, la funcin primaria tiene acceso a las variablesx1 yx2 declaradas en cada una de las funciones anidadas.

Estas funciones anidadas no precisan de variables de entrada y no devuelven nada.

Para comprobar las races de la ecuacin de segundo gradox2-x-6=0, llamamos a la funcincomprobar_raices1 y le pasamos los coeficientes 1,-1,-6 y nos devolver -b/a=1 yc/a=-6

>> [b_a,c_a]=comprobar_raices(1,-1,-6)

b_a = 1

c_a = -6

Como ejercicio se porpone al lector crear la funcinestadistica_1, que devuelva la media y la desviacin estndar, cuando se le pasa un vector de datos. El valor medio se calcular mediante la funcin anidadamediay la desviacin estndar mediante la funcin anidadadesviacion.

Solucin

Funciones annimas

Las funciones annimas nos permiten definir una funcin simple sin necesidad de crearla y guardarla en un fichero .m. Se pueden definir en la ventana de comandos, en un fichero script o dentro de otra funcin, con la siguiente sintaxis:

variable=@(lista_argumentos) expresion

expresionconsiste en una nica y vlida expresin, puede tener una o ms variables de entrada que se especifican en la lista de argumentos separadas por comas. Puede incluir variables que se han definido previamente

Las funciones se pueden asignar a variables y estas variables se pueden pasar a otras funciones como se pasan escalares o vectores. Ms adelante veremos cmo se llama a una funcin dentro de otra funcin que se le pasa en uno de sus parmetros.

Comparamos la definicin de una funcinfuncque se guarda en un fichero func.m y su equivalente annima

function y=func(x) y=cos(x)-x;end

Llamada a la funcin

>> z=func(0.5)

z = 0.3776

Su equivalente annima se escribe en la ventana de comandos sin necesidad de guardarla en un fichero y se llama del mismo modo que cualquier otra funcin

>> f=@(x) cos(x)-x;

>> z=f(0.5)

z = 0.3776

fguarda un valor asociado a una funcin que denominaremos manejador ( function handle)

En la ventanaWorkspace, vemos que aprece una variablefde distinto tipo que guarda la referencia a la funcin annima.

Teorema del coseno

Podemos calcular el ladocdel tringulo si conocemos los ladosayby el ngulo comprendido, mediante el teorema del coseno

c=a2+b22abcos

>> c=@(a,b,gamma) sqrt(a^2+b^2-2*a*b*cosd(gamma));

>> lado=c(3,4,30)

lado = 2.0531

Llamada a una funcin desde otra funcin

Existen mucha situaciones en las que una funcinf1utiliza otra funcinf2. Por ejemplo, MATLAB tiene una funcinfzeroque se utiliza para calcular las races de una ecuacinf(x)=0. La funcinfse le pasa afzerocuando se llama para encontrar las races def(x). Hay varias formas de pasar una funcinfa otra funcin para su uso.

Ya hemos visto el significado de manejador para una funcin annima, un valor que guarda una variablefocy que est asociado a una funcin.

Si definimos una funcin de forma explcita en un fichero por ejemplo, la funcinfunc, obtenemos el manejador anteponiendo el carcter @ al nombre de la funcin

La derivada de una funcin

Vamos ahora, a ver como se le pasa una funcin a otra funcin en uno de sus parmetros.

La derivada primerady/dx, de una funciny=f(x) en un puntox0, se puede calcular aproximadamente mediante la frmula

dydx=f(x02h)8f(x0h)+8f(x0+h)f(x0+2h)12h

dondehun un nmero pequeo en comparacin conx0. Escribir una funcin denominadaderivada, cuyos parmetros sean la funcinf, y la abscisax0y devuelva el valor de la derivada de la funcinf(x) enx0.Tomarh=10-5. Utilizar la funcinderivadapara calcular las derivadas de las siguientes funciones, comparando con los resultados exactos.

y=2x3x2+3x0=1y=x2exx0=0.25

function yp= derivada(f,x0)

h=1e-5;

yp=(f(x0-2*h)-8*f(x0-h)+8*f(x0+h)-f(x0+2*h))/(12*h);

end

En la ventana de comandos, definimos la funcin (annima) que queremos derivar y llamamos a la funcinderivada.

>> f1=@(x) x^2*exp(x);

>> derivada(f1,0.25)

ans = 0.7223

Podemos calcular tambin la derivada segunda de una funcin en un punto del siguiente modo

>> f1=@(x) x^3-6*x^2+3;

>> derivada(f1,2)

ans = -12.0000

>> f2=@(x) derivada(f1,x);

>> derivada(f2,2)

ans = 9.8686e-007

Podemos representar la funcin (en color azul), su derivada primera (en color rojo) y su derivada segunda (en color verde)

y=x36x2+3dydx=3x212xd2ydx2=6x12

x=-3:0.05:7;

f1=@(x) x.^3-6*x.^2+3;

y=f1(x); %funcin

yp=derivada(f1,x); %derivada primera

f2=@(x) derivada(f1,x);

ypp=derivada(f2,x); %derivada segunda

plot(x,y,'b',x,yp,'r',x,ypp,'g')

xlabel('x')

ylabel('y')

title('funcin y derivadas')

ylim([-50,50])

grid on

Representacin grfica de una funcin

Definimos una funcin denominadagraficay le pasamos el manejador de la funcin cuya grfica queremos representar en un determinado intervaloa,b. La funcin no devuelve ningn valor.

function grafica(f, a, b)

x=linspace(a,b,50);

y=f(x);

plot(x,y,'r')

grid on

xlabel('x')

ylabel('y')

title('grfica de una funcin')

end

En la ventana de comando creamos una funcin annima cuyo manejador esfuncy llamamos a la funcingrafica, pasndole el manejador, el intervalo (a,b) en el cual queremos representar la funcin

>> func=@(x) x-cos(x);

>> grafica(func,0,pi/2)

Aparece la ventana grfica

Definimos una funcin similarfunc1 y la guardamos en un fichero func1.m

function y=func1(x) y=cos(x)-x;end

En la ventana de comandos llamamos a la funcingrafica, pasndole el manejador de la funcinfunc1, @func1 y el intervalo (a,b) en el cual queremos representar la funcin.

>> grafica(@func1,0,pi/2)

Se obtiene la misma grfica

La funcinfplot

La funcinfplotdibuja una grfica si se le pasa la funcinfen el primer parmetro y el intervalo [xmin, xmax] en el segundo

>> f=@(x) x-5*(1-exp(-x));

>> fplot(f,[0 6]);

Alternativamente,fplotdevuelve una tabla de valores [x, y] que pueden ser utilizadas por la funcinplot(x,y) para dibujar grfica, superponer una rejilla (grid), poner ttulo (title) y etiquetas (xlabel,ylabel), etc. tal como se muestra en el siguiente script

f=@(x) x-5*(1-exp(-x));

[x,y]=fplot(f,[0 6]);

plot(x,y)

grid on

xlabel('x')

ylabel('y')

title('grfica de una funcin')

Hay diferencias significativas entreplotyfplot.La primera evala la funcin para valores dexigualmente espaciados. Como vemos hay que especificar el intervalo xo el nmero de puntos, mientras que en la segunda no es necesario especificarlo.fplotevala internamente la funcin ms frecuentemente en aquellas regiones en las que cambia rpidamente. En el siguiente ejemplo se dibuja la siguiente funcin en el intervalo [0.01 0.1]

y=sin(1x)

>> x=0.01:0.001:0.1;

>> y=sin(1./x);

>> plot(x,y)

Tomando x=0.001, se obtiene una figura con baja resolucin . Sin embargo,

>> f=@(x) sin(1/x);

>> fplot(f,[0.01 0.1])

Obtenemos una figura con mejor resolucin sin tener que probar distintos valores de xo del nmero de puntos.