Está en la página 1de 15

Funciones

Estamos acostumbrados a trabajar con funciones del tipo y=f(x) donde f(x)
es una expresin matemtica en trminos de la variable x. Se calcula un
valor de y (salida) cuando se proporciona un valor de x (entrada) en la
expresin. 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 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
men File/New/Function y 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 clave function

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 .m en 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
reservada function entre 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


function nombre_funcion(variables_entrada)

Cuando una funcion no precisa de variables de entrada se define


function variables_salida=nombre_funcion

Cuando una funcin devuelve una solo resultado y se puede escribir, de


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

En general, definiremos una funcin del siguiente modo:


function [y1,y2]=nombre_funcion(a,b,c)
con tres argumentos a, b y c variables de entrada y que devuelve dos
resultados en las variables y1 e y2.

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 funcin suma que realiza la siguiente tarea, suma de
dos nmeros x e y y 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
end

z=x+y; %efecta la suma

A la funcin suma se le pasan dos datos en las variables x e y, y devuelve el


resultado en la variable z.
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 elEditor File/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 funcin suma su parmetro x adquiere el valor del primer


argumento a, el segundo parmetro ytoma el valor del argumento b, 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
variable res. Las variables x, y y z son locales a la funcin y por tanto, no
aparecen en la ventana Workspace, no se puede acceder a ellas desde la
ventana de comandos.
Como hemos visto hay que pasar los valores que guardan las
variables a y b a la funcin suma por 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

Donde v0 y x0 es la velocidad inicial y la posicin inicial, respectivamente.


Vamos a crear una funcin denominada caida_libre que admita como
parmetros el tiempo t y devuelva la posicin x y velocidad v de un mvil
que se lanza desde 200 m de altura con velocidad de 40 m/s. La aceleracin
constante de la gravedad g=-10 m/s2
v=40-10t
x=200+40t-5t2
Seleccionamos File/New/Function para abrir el editor de funciones.

1.

2.
3.
4.

Definimos la funcin:
o

La palabra clave function

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)

Escribimos el cuerpo de la funcin con dos sentencias que calculan la


velocidad v y la posicin x cuando se proporciona el dato del tiempo t
Finalizamos con end.
Seleccionamos File/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 funcin caida_libre, pasndole


un tiempo t=2 s, del siguiente modo
>> [pos,vel]=caida_libre(2)
pos =
240
vel = 20

Que calcula y muestra, la velocidad v=20 m/s y la posicin x=240 m en el


instante t=2 s
En la llamada a la funcin caida_libre el parmetro t adquiere el valor de 2,
en las dos sentencias se calcula la velocidad y posicin y se guardan en las
variables locales v y x. La funcin devuelve estos dos valores que se copian
en las variables vel y pos de la ventana de comandos. En la ventana de
comandos no tenemos acceso a las variables t, v y x por ser locales a la
funcin caida_libre y desaparecen cuando termina de ejecutarse, pero si
tenemos acceso a las variables vel y pos que guardan los resultados del
clculo realizado en el cuerpo de la funcin.
Si intentamos acceder a la variable x o t obtendremos un mensaje de error
>> x,t
??? Undefined function or variable 'x'.

Si queremos que la funcin caida_libre calcule la posicin y velocidad del


mvil para una secuencia (vector) de tiempos t, tendremos que modificar la
definicin de dicha funcin
function [x,v] = caida_libre(t)
v=40-10*t;

end

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

En la ventana de comandos se llama a esta funcin caida_libre, pasndole


los tiempos t=[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
vel =
40
20
0
-20

200
-40

100
-60

Media y desviacin estndar de un conjunto de datos


La definicin de media y desviacin estndar es la siguiente
<x>=1nxin=1n(xix)2n1

Creamos una funcin denominada estadistica a la que se le pasa un


vector x de datos y devuelve la media med y 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 funcin sum calcula la suma de los elementos de un vector x

La funcin length, calcula el nmero de elementos del vector x.

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 funcin estadistica en la ventana de comandos
y le pasamos el vector de datos
>> [media, desviacion]=estadistica([1.65 1.82
1.85 1.90 1.74 1.76 1.77])
media = 1.7690
desviacion = 0.0713

1.72 1.75 1.73

MATLAB dispone de dos funciones que calculan la media mean y 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 grado
ax2+bx+c=0
Las races son x1 y x2 y 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 raz x1 y la segunda la raz x2.
En el editor de funciones creamos la funcin comprobar_raices, a la que se
le pasa los coeficientes a, b y c de la ecuacin de segundo grado y devuelve
los cocientes -b/a y c/a de la suma y producto de las dos races x1 y x2.
Guardamos el cdigo de la funcin primaria comprobar_raices y de las
subfunciones calcula_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;
end
function 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 grado x2-x-6=0,


llamamos a la funcin comprobar_raices y le pasamos los coeficientes 1,1,-6 y nos devolver -b/a=1 y c/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 con end
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 funcin comprobar_raices1, a la que
se le pasa los coeficientes a, b y c de la ecuacin de segundo grado y
devuelve los cocientes -b/a y c/a de la suma y producto de las dos
races x1 y x2. Guardamos el cdigo de la funcin
primaria comprobar_raices1 y de las subfunciones calcula_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 anidadas calcula_raiz1 y calcula_raiz2 tienen


acceso a los parmetros a, b y c de la funcin primaria, que son variables
locales a la funcin comprobar_raices y tambin, a la variable
local dis, que guarda el discriminante de la ecuacin de segundo grado. Por
otra parte, la funcin primaria tiene acceso a las variables x1 y x2
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 grado x2-x-6=0,
llamamos a la funcin comprobar_raices1 y le pasamos los coeficientes 1,1,-6 y nos devolver -b/a=1 y c/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 funcin estadistica_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 anidada media y la
desviacin estndar mediante la funcin anidada desviacion.
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
expresion consiste 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 funcin func que 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

f guarda un valor asociado a una funcin que denominaremos manejador


( function handle)

En la ventana Workspace, vemos que aprece una variable f de distinto tipo


que guarda la referencia a la funcin annima.
Teorema del coseno

Podemos calcular el lado c del tringulo si conocemos los lados a y b y 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 funcin f1 utiliza otra funcin f2.
Por ejemplo, MATLAB tiene una funcin fzero que se utiliza para calcular
las races de una ecuacin f(x)=0. La funcin f se le pasa a fzero cuando se
llama para encontrar las races de f(x). Hay varias formas de pasar una
funcin f a otra funcin para su uso.
Ya hemos visto el significado de manejador para una funcin annima, un
valor que guarda una variable f o c y que est asociado a una funcin.
Si definimos una funcin de forma explcita en un fichero por ejemplo, la
funcin func, 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 primera dy/dx, de una funcin y=f(x) en un punto x0, se puede


calcular aproximadamente mediante la frmula
dydx=f(x02h)8f(x0h)+8f(x0+h)f(x0+2h)12h

donde h un un nmero pequeo en comparacin con x0. Escribir una


funcin denominada derivada, cuyos parmetros sean la funcin f, y la
abscisa x0 y devuelva el valor de la derivada de la funcin f(x)
en x0.Tomarh=10-5. Utilizar la funcin derivada para 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 denominada grafica y le pasamos el manejador de
la funcin cuya grfica queremos representar en un determinado
intervalo a, 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


es func y 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 similar func1 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 funcin grafica, pasndole el


manejador de la funcin func1, @func1 y el intervalo (a,b) en el cual
queremos representar la funcin.
>> grafica(@func1,0,pi/2)

Se obtiene la misma grfica

La funcin fplot
La funcin fplot dibuja una grfica si se le pasa la funcin f en el primer
parmetro y el intervalo [xmin, xmax] en el segundo
>> f=@(x) x-5*(1-exp(-x));
>> fplot(f,[0 6]);

Alternativamente, fplot devuelve una tabla de valores [x, y] que pueden ser
utilizadas por la funcin plot(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 entre plot y fplot. La primera evala la


funcin para valores de x igualmente espaciados. Como vemos hay que
especificar el intervalo x o el nmero de puntos, mientras que en la
segunda no es necesario especificarlo. fplot evala 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 x o del nmero de puntos.

También podría gustarte