You are on page 1of 16

06 Funciones y ficheros de función Mg.

Amado Malca Villalobos

FUNCIONES Y FICHEROS DE FUNCION

Considere una función usual, con una variable de entrada (independiente, y una
variable de salida (dependiente). Lo que varía es la cantidad de argumentos que pueden
tener estas variables.
Ejemplo:
y  f  x   2 x  6 , una variable de entrada, y una de salida.
z  F  x, y   2 x 2  6 xy  y 3  8 , dos variables de entrada, y una de salida.
 u, v   G  x, y, z    2 x  5 y  z, x  3 y  5z  ,
tres variables de entrada, y dos de salida.
Para realizar estas funciones se usaran archivos script de extensión: ****.m. En el
desarrollo de estas funciones es posible usar funciones predefinidas por MatLab,
también se pueden usar funciones definidas por el usuario, las cuales deben ubicarse
siempre en la carpeta de trabajo de MatLab.

Funciones predefinidas: cos(x), sqrt(x), exp(x), det(A), etc.

Funciones definidas por el usuario; generalmente para representar una función que se
usara en varios programas adicionales.

x FUNCIÓN y  f  x

CREACIÓN DE UN ARCHIVO DE FUNCIÓN

Básicamente un archivo de función, es un archivo tipo .m, visto en el capitulo tres. Pero
la diferencia está en la primera línea, que lleva una forma especial, para indicar lo de
función. Además del nombre de tal archivo.

Definición de una función


Las funciones se crean del mismo modo que un script seleccionado en el menú
New/Function y se guardan en un fichero que tiene el mismo nombre que la función y
extensión .m

La primera línea en el editor es la definición de la función que comienza con la palabra


clave function

06 archivos de función 1
06 Funciones y ficheros de función Mg. Amado Malca Villalobos

function variables_salida=nombre_funcion(variables_entrada)
sentencias
end

1. nombre_funcion, es el nombre significativo que se le asigna a la función y


coincide con el nombre del fichero de extensión .m en el que se guarda el código
de dicha función. Las reglas para nombrar una función son las mismas que para
las variables, los nombres no deben de incluir espacios, ni se pueden utilizar
palabras reservadas por MATLAB.
2. variables_entrada, es el conjunto de parámetros que se le pasa a la función.
Los nombres de las variables van entre paréntesis y separadas por coma.
3. variabales_salida, es el valor o conjunto de valores de las variables devueltos
por la función. Las variables de salida van después de la palabra reservada
function entre corchetes cuadrados y separados por comas si hay varios.
3. sentencias, líneas de código que tomando los valores de los parámetros de
entrada calculan mediante expresiones los valores que devuelve la función.
4. end, marca el final de la función es opcional (salvo en las funciones anidadas)
pero es conveniente acostumbrarse a ponerlo al finalizar la función.

Opcionalmente, en la segunda línea se pone un comentario, en el que se explica la tarea


que realiza la función. A continuación, una explicación detallada sobre las variables de
entrada y de salida

1. Cuando una función no devuelve ningún valor, se define


function nombre_funcion(variables_entrada)
2. Cuando una funcion no precisa de variables de entrada se define
function variables_salida=nombre_funcion
3. Cuando una función 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)
4. En general, definiremos una función 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 función 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
función.

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

Vamos a ver unos cuantos ejemplos en esta página de funciones.

06 archivos de función 2
06 Funciones y ficheros de función Mg. Amado Malca Villalobos

Ejemplo: Vamos a construir una función cuadrática, de la forma ( )

Archivo tipo .m funcuad.m Ventana de comandos de MatLab


function y =funcuad(x) >> y=funcuad(1),z=funcuad(2),w=funcuad(3)
y= 1
% Cálculo del valor de una z = 16
función cuadrática w = 37
% El argumento de entrada es: >> y=funcuad([1,2,3])
% x: un numero real
y = 1 16 37
% El argumento de salida es:
>> y=funcuad([1;2;3])
% y = 3x^2+6x-8, tambien real
y=
y=3*x.^2+6*x-8; 1
16
37
>> help funcuad
Cálculo del valor de una función cuadrática
El argumento de entrada es:
x: un numero real
El argumento de salida es:
y = 3x^2+6x-8, tambien real

Archivo script: funcuad.m

Con esta función se podrían hacer muchas cosas, como: graficar, derivar, integrar, etc.
Veamos una de ellas, grafiquemos en el intervalo [-10,10]

En la ventana de comandos de MatLab.


>> x=-10:0.1:10; y=funcuad(x); plot(x,y),grid
>>

06 archivos de función 3
06 Funciones y ficheros de función Mg. Amado Malca Villalobos

Grafico Resultante:
400

350

300

250

200

150

100

50

-50
-10 -5 0 5 10

Ejemplo: Cálculo de la altura y la distancia máximas que alcanzan un proyectil, cuando


se lanza con un ángulo determinado, y con una velocidad inicial dada.
funcuad.m
Function [hmax,dmax]=trayectoria(v0,theta)
% Cálculo de la altura y la distancia máximas, que alcanzan un
proyectil
%
% Los argumentos de entrada son:
% v0: velocidad inicial en m/s
% theta: ángulo en grados sexagesimales.
%
% Los argumentos de salida son:
% hmax: altura máxima en metros
% dmax: distancia máxima en metros

g=9.81;
v0x=v0*cos(theta*pi/180);
v0y=v0*sin(theta*pi/180);
thmax=v0y/g;hmax=v0y^2/(2*g);
ttot=2*thmax;dmax=v0x*ttot;

%Creación de un grafico de la trayectoria


tplot=linspace(0,ttot,200);
x=v0x*tplot;;
y=v0y*tplot-0.5*g*tplot.^2;
plot(x,y), grid
xlabel('DISTANCIA (m)')
ylabel('ALTURA (m)')
title('TRAYECTORIA DE UN PROYECTIL')
Ejecución en la ventana de comandos de MatLab
>> [hmax,dmax]=trayectoria(120,30)
hmax = 183.4862
dmax = 1.2712e+003
>> [hmax,dmax]=trayectoria(80,60)
hmax = 244.6483
dmax = 564.9911
>>

06 archivos de función 4
06 Funciones y ficheros de función Mg. Amado Malca Villalobos

Grafico resultante
TRAYECTORIA DE UN PROYECTIL
250

200
ALTURA (m)

150

100

50

0
0 100 200 300 400 500 600
DISTANCIA (m)

Ventana del programa: trayectoria.m

Media y desviación estándar de un conjunto de datos

La definición de media y desviación estándar es la siguiente

∑ ∑ ( ̅)
̅ √

06 archivos de función 5
06 Funciones y ficheros de función Mg. Amado Malca Villalobos

Creamos una función denominada estadistica a la que se le pasa un vector x de datos y


devuelve la media med y la desviación, des, y la guardamos en un fichero con el mismo
nombre que la función

Archivo en MatLab: estadística.m


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

Ejemplo: Calcular la media y la desviación estándar 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 función estadistica en la ventana de comandos y le pasamos


el vector de datos

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

>> [media, desviacion]=estadistica(x)

media = 1.7690

desviacion = 0.0713

MATLAB dispone de dos funciones que calculan la media mean y la desviación


estándar, 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

06 archivos de función 6
06 Funciones y ficheros de función Mg. Amado Malca Villalobos

Funciones anónimas

Las funciones anónimas nos permiten definir una función 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 función, con la siguiente sintaxis:

variable=@(parámetros) expresion

expresion consiste en una única y válida expresión, puede tener una o más 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. Más adelante veremos cómo se llama a
una función dentro de otra función que se le pasa en uno de sus parámetros.

Comparamos la definición de una función func que se guarda en un fichero func.m y su


equivalente anónima

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

Llamada a la función

>> z=func(0.5)
z = 0.3776

Su equivalente anónima se escribe en la ventana de comandos sin necesidad de


guardarla en un fichero y se llama del mismo modo que cualquier otra función

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


>> z=f(0.5)
z = 0.3776

f guarda un valor asociado a una función que denominaremos manejador ( function


handle)

En la ventana Workspace, vemos que aparece una variable f de distinto tipo que guarda
la referencia a la función anónima.

Sea una función anónima f que incluye una variable a cuyo valor definimos previamente

06 archivos de función 7
06 Funciones y ficheros de función Mg. Amado Malca Villalobos

>> a=4;
>> f=@(x) a*x;
>> f(3)
ans = 12

Si cambiamos el valor de la variable a, el cambio no tiene efecto en la función f como


vemos en el siguiente código

>> a=5;
>> f(3)
ans = 12

Ejemplo: Teorema del coseno

Calculamos el lado c del triángulo si conocemos los lados a y b y el ángulo en grados


sexagesimales comprendido γ, mediante el teorema del coseno

√ ( )

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


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

Nota: MATLAB captura el valor de las variables cuando se define la función anónima.
La función anónima f(x) se define con un valor de a=2

>> a=2;
>> f=@(x) cos(a*x);
>> f(0.5)
ans = 0.5403

Ahora cambiamos el valor de la variable a=3, pero la función anónima f(x) no se


modifica

>> a=3;
>> f(0.5)
ans = 0.5403

Para que la función f(x) utilice el nuevo valor de a hay que volverla a definir

>> a=3;
>> f=@(x) cos(a*x);

06 archivos de función 8
06 Funciones y ficheros de función Mg. Amado Malca Villalobos

>> f(0.5)
ans = 0.0707

Llamada a una función desde otra función

Existen mucha situaciones en las que una función f1 utiliza otra función f2. Por ejemplo,
MATLAB tiene una función fzero que se utiliza para calcular las raíces de una ecuación
f (x)=0. La función f se le pasa a fzero cuando se llama para encontrar las raíces de f(x).
Hay varias formas de pasar una función f a otra función para su uso.

Ya hemos visto el significado de manejador para una función anónima, un valor que
guarda una variable f o c y que está asociado a una función.

Si definimos una función de forma explícita en un fichero por ejemplo, la función func,
obtenemos el manejador anteponiendo el carácter @ al nombre de la función

La derivada de una función

Vamos ahora, a ver como se le pasa una función a otra función en uno de sus
parámetros.

La derivada primera , de una función ( ) en un punto , se puede


calcular aproximadamente mediante la fórmula

( ) ( ) ( ) ( )

Donde h un un número pequeño en comparación con . Escribir una función


denominada derivada, cuyos parámetros sean la función f, y la abscisa x0 y devuelva el
valor de la derivada de la función ( ) en x0. Tomar . El valor de h para
matlab, se escribe como: .

Archivo en MatLab: derivada.m


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 función y=x3-6x2+3 (anónima) que queremos


derivar y llamamos a la función derivada.

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


>> derivada(f1,2)
ans = -12.0000

Calculamos también la derivada segunda de una función en un punto del siguiente modo

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

06 archivos de función 9
06 Funciones y ficheros de función Mg. Amado Malca Villalobos

>> derivada(f2,2)
ans = 9.8686e-007

Comparamos con el valor exacto

Para

Funciones definidas en el mismo fichero

Un fichero función puede contener más de una función. Las funciones se definen una a
continuación de la otra. La primera función 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 función
primaria en la ventana de comandos o por otras funciones. Cada función tiene sus
propias variables que son locales a la función, no se puede acceder a las variables de
una subfunción desde la función primaria o desde otra subfunción. No se puede acceder
a las variables de la función primaria desde una subfunción.

Las subfunciones permiten organizar tareas grandes en otras más pequeñas.

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

Ecuación de segundo grado


Resolveremos ahora una ecuación cuadrática

Las raíces son , tienen las siguientes propiedades:

√ √

Vamos a crear una función que nos permita comprobar las propiedades de las raíces de
una ecuación de segundo grado, y dos subfunciones, la primera calcula la raíz y la
segunda la raíz .

En el editor de funciones creamos la función comprobar_raices, a la que se le pasa los


coeficientes a, b y c de la ecuación de segundo grado y devuelve los cocientes -b/a y c/a
de la suma y producto de las dos raíces x1 y x2. Guardamos el código de la función

06 archivos de función 10
06 Funciones y ficheros de función Mg. Amado Malca Villalobos

primaria comprobar_raices y de las subfunciones calcula_raiz1 y calcula_raiz2 en el


fichero comprobar_raices.m

Archivo en MatLab: comprobar raíces.m


function [suma,producto]=comprobar_raices(a,b,c)
x1=calcula_raiz1(a,b,c);
x2=calcula_raiz2(a,b,c);
suma=x1+x2;
producto=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 raíces de la ecuación de segundo grado x2-x-6=0, llamamos a la


función comprobar_raices y le pasamos los coeficientes 1,-1,-6 y nos devolverá -b/a=1
y c/a=-6

>> [-b/,c/a]=comprobar_raices(1,-1,-6)
b_a = 1
c_a = -6

Funciones anidadas

Una función anidada es una función definida dentro de otra función. Las funciones
primarias y las anidadas deben obligatoriamente terminar con end

Las funciones anidadas tienen acceso a las variables de la función primaria y la función
primaria tiene acceso a las variables definidas por la función anidada.

Una función anidada puede contener otra y así sucesivamente, pero este proceso puede
llevar a confusión. Existen reglas para llamar a una función anidada dentro de otra pero
no tiene por el momento interés para el lector.

En el editor de funciones creamos la función comprobar_raices1, a la que se le pasa los


coeficientes a, b y c de la ecuación de segundo grado y devuelve los cocientes -b/a y c/a
de la suma y producto de las dos raíces x1 y x2. Guardamos el código de la función
primaria comprobar_raices1 y de las subfunciones calcula_raiz1 y calcula_raiz2 en el
fichero comprobar_raices1.m

06 archivos de función 11
06 Funciones y ficheros de función Mg. Amado Malca Villalobos

Archivo en MatLab: comprobar raíces1.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
x2=(-b-dis)/(2*a);
end
end

Vemos que las funciones anidadas calcula_raiz1 y calcula_raiz2 tienen acceso a los
parámetros a, b y c de la función primaria, que son variables locales a la función
comprobar_raices y también, a la variable local dis, que guarda el discriminante de la
ecuación de segundo grado. Por otra parte, la función 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 raíces de la ecuación de segundo grado x2-x-6=0, llamamos a la


función 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 función estadistica_1, que devuelva la


media y la desviación estándar, cuando se le pasa un vector de datos. El valor medio se
calculará mediante la función anidada media y la desviación estándar mediante la
función anidada desviacion.

En primer lugar, creamos la función estadistica_1, y dos funciones auxiliares: la


función media y la función desviacion en el mismo fichero estadistica_1.m

function [med,des]=estadistica_1(datos)
n=length(datos);
med=media(datos,n);
des=desviacion(datos,med,n);
end
%calcula la media del vector de datos
function res=media(x,num)
res=sum(x)/num;
end
%calcula la desviación estándar

06 archivos de función 12
06 Funciones y ficheros de función Mg. Amado Malca Villalobos

function res=desviacion(x,m,num)
xd=x-m;
xd_suma=sum(xd.^2);
res=sqrt(xd_suma)/(num-1);
end

Ahora trasladamos las funciones media y desviacion al interior de la función estadistica


_1.

function [med,des]=estadistica_1(x)
n=length(x);
media;
desviacion;
%calcula la media del vector de datos
function media
med=sum(x)/n;
end
%calcula la desviación estándar
function desviacion
xd=x-med;
xd_suma=sum(xd.^2);
des=sqrt(xd_suma)/(n-1);
end
end

En la ventana de comandos probamos las dos versiones de la función estadistica_1.

>> [med,des]= estadistica_1([1.65 1.82 1.72 1.75 1.73 1.85


1.90 1.74 1.76 1.77])
med =
1.7690
des =
0.0713

FUNCIONES EN LINEA
Se usan para realizar funciones simples, que también pueden tener una o más variables
de entrada.
nombre  inline  'exp resion matematica en forma de cadena '
nombre  inline  'exp resion matematica ','arg1','arg 2', ,'arg n ' 

y  f  x   3x 2  6 x  8
Ejemplo: Considerando la función cuadrática:

>> f=inline('3*x^2+6*x-8') % definiendo una function en linea


f = Inline function:
f(x) = 3*x^2+6*x-8
>> f=inline('3*x^2+6*x-8','x') % agregando la variable
f = Inline function:
f(x) = 3*x^2+6*x-8

06 archivos de función 13
06 Funciones y ficheros de función Mg. Amado Malca Villalobos

>> f(1)
ans = 1
>> f(2)
ans = 16

Ejemplo: Ahora consideraremos una función real de dos variables:

>> G=inline('3*x+6*y+9*x*y-6','x','y')
G = Inline function:
G(x,y) = 3*x+6*y+9*x*y-6
>> G(1,2)
ans = 27
>> G(1,2),G(6,8)
ans = 27
ans = 492
>> [G(1,2), G(3,5), G(8,1), G(3,7)]
ans = 27 168 96 234
>> x=[1 2 3],y=[7 6 4]
x= 1 2 3
y= 7 6 4
>> G(x,y)
??? Error using ==> inlineeval at 15
Error in inline expression ==> 3*x+6*y+9*x*y-6
Inner matrix dimensions must agree.
Error in ==> inline.subsref at 27
INLINE_OUT_ = inlineeval(INLINE_INPUTS_,
INLINE_OBJ_.inputExpr, INLINE_OBJ_.expr);

Como aparece un error debemos redefinir la función, para cuando los argumentos son
vectores o matrices.

>> G=inline('3*x+6*y+9*x.*y-6','x','y') % véase la diferencia


G = Inline function:
G(x,y) = 3*x+6*y+9*x.*y-6
>> G(x,y)
ans = 102 144 135
>>
Ahora una función de dos variables de entrada y dos de salida
>> g=inline('[3*x+6*y+9,x+y-6]','x','y')
g = Inline function:
g(x,y) = [3*x+6*y+9,x+y-6]
>> g(2,3)
ans = 33 -1
>> x=[1 3 5],y=[9 8 4]
x= 1 3 5
y= 9 8 4
>> g(x,y)
ans = 66 66 48 4 5 3
>> g(1,9),g(3,8),g(5,4)
ans = 66 4

06 archivos de función 14
06 Funciones y ficheros de función Mg. Amado Malca Villalobos

ans = 66 5
ans = 48 3
>>

Ejemplos 02: g  x, y   4 x5 y  7 x3 y 2  8x 2 y 4  6 x  29 y 6
>> G=inline('4*(x.^5).*y+7*(x.^3).*(y.^2)-8*(x.^2).*(y.^4)+6*x-29*(y.^6)')
G = Inline function:
G(x,y) = 4*(x.^5).*y+7*(x.^3).*(y.^2)-8*(x.^2).*(y.^4)+6*x-29*(y.^6)
>> G(5,6),G(8,7),G(9,1)
ans = -1505694
ans = -3547965
ans = 240676
>> x=[-2 -1 0 1 2 3 4 5],y=[-3 -2 -1 0 1 2 3 4]
x = -2 -1 0 1 2 3 4 5
y = -3 -2 -1 0 1 2 3 4
>> G(x,y)
ans = -23865 -2010 -29 6 135 -290 -15165 -105954

EL COMANDO “feval”
Este comando evalúa el valor de una función, en algún o algunos valores dados. La
diferencia con el caso anterior, está en que aquí se da la función, solo el nombre, y se
evalúa en el valor dado.
variable = feval(‘nombre_funcion’,valor_argumento)

Se tiene que seguir ciertos lineamientos, como son:


-El nombre de la función debe introducirse en forma de cadena.
-La función puede ser una de MATLAB, o alguna definida por el usuario.
- Los argumentos de entrada se separan por comas, y después del nombre de la función.
-Los argumentos de salida van entre corchetes, y separados por comas.

Ejemplo 01: Aquí vamos a definir una función H, y luego la evaluamos en x=1.
>> H=inline('exp(x.^2)./(1+x.^4)')
H = Inline function: H(x) = exp(x.^2)./(1+x.^4)
>> feval(H,1)
ans = 1.3591
>>
Ejemplo 02:
>> D=feval(inline('exp(x.^2)./(1+x.^4)'),1)
D = 1.3591
>> H=inline('exp(x.^2)./(1+x.^4)')
H = Inline function: H(x) = exp(x.^2)./(1+x.^4)
>> feval(H,1)
ans = 1.3591

>> G=inline('exp(x.^2)./(y+x.^4)')
G = Inline function: G(x,y) = exp(x.^2)./(y+x.^4)
>> feval(G,1,1)
ans = 1.3591

06 archivos de función 15
06 Funciones y ficheros de función Mg. Amado Malca Villalobos

>> feval(G,4,5)
ans = 3.4046e+004

>> D=feval(inline('exp(x.^2)./(1+x.^4)'),1)
D = 1.3591
>> D=feval('sin',0)
D= 0
>> D=feval('sin',pi/6)
D = 0.5000
>> D=feval(inline('cos(x)+tan(x)'),pi/7)
D = 1.3825

06 archivos de función 16

You might also like