Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
El aspecto más importante de esta página, son las funciones anónimas, que se utilizarán con
mucha frecuencia en la programación con MATLAB
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.
function variables_salida=nombre_funcion(variables_entrada)
sentencias
end
function nombre_funcion(variables_entrada)
function variables_salida=nombre_funcion
Cuando una función devuelve una solo resultado y se puede escribir, de dos
maneras
function [y1,y2]=nombre_funcion(a,b,c)
Todas las variables en una función son locales a dicha función, incluyendo las de
entrada y las de salida.
Ejemplos
Suma de dos números
Empezaremos por una función suma que realiza la siguiente tarea, suma de dos
números x e y y devuelve la suma z=x+y
Definición de la función
El fichero que guarda la función tiene el mismo nombre que la función, tal como
vemos al seleccionar en el Editor File/Save as...
Llamada a la función
>> suma(2,3)
ans = 5
a=3;
b=2;
res=suma(a,b);
disp(res)
En la llamada a la función suma su parámetro x adquiere el valor del primer
argumento a, el segundo parámetro y toma el valor del argumento b, se efectúa la
suma en el cuerpo de la función, se guarda el resultado en la variable z que
devuelve la función. El valor que guarda z se copia en la variable res. Las
variables x, y y z son locales a la función y por tanto, no aparecen en la
ventana Workspace, no se puede acceder a ellas desde la ventana de comandos.
>> suma(2,3)
ans = 5
>> x
Undefined function or variable 'x'.
>> z
Undefined function or variable 'z'.
Como hemos visto hay que pasar los valores que guardan las variables a y b a la
función sumapor que una función no tiene acceso a las variables declaradas en un
script o en la ventana de comandos.
Sistema de ayuda
v=v0+g⋅tx=x0+v0t+12gt2v=v0+g·tx=x0+v0t+12gt2
v=40-10·t
x=200+40·t-5·t2
1. Definimos la función:
o La palabra clave function
o Las variables de salida entre corchetes cuadrados [x,v]
o El operador asignación =
o El nombre de la función, caida_libre
o Entre paréntesis la variable de entrada (t)
2. Escribimos el cuerpo de la función con dos sentencias que calculan la
velocidad v y la posición x cuando se proporciona el dato del tiempo t
3. Finalizamos con end.
4. Seleccionamos Save para guardar la función en el fichero caida_libre.m con
el mismo nombre que la función.
>> [pos,vel]=caida_libre(2)
pos = 240
vel = 20
Que calcula y muestra, la velocidad v=20 m/s y la posición x=240 m en el
instante t=2 s
>> x,t
??? Undefined function or variable 'x'.
Si queremos que la función caida_libre calcule la posición y velocidad del móvil
para una secuencia (vector) de tiempos t, tendremos que modificar la definición de
dicha función
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 función caida_libre, pasándole 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 200 100
vel = 40 20 0 -20 -40 -60
<x>=n∑1xinσ=
⎷n∑1(xi−x)2n−1<x>=∑1nxin σ=∑1n(xi−x)2n−1
function [med,des]=estadistica(x)
n=length(x);
med=sum(x)/n;
des=sqrt(sum((x-med).^2/(n-1)));
end
>> 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 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
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
Sea una función anónima f que incluye una variable a cuyo valor definimos
previamente
>> 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
c=√a2+b2−2abcosγc=a2+b2−2abcosγ
>> 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);
>> f(0.5)
ans = 0.0707
dydx=f(x0−2h)−8f(x0−h)+8f(x0+h)−f(x0+2h)12hdydx=f(x0−2h)−8f(x0−h)+
8f(x0+h)−f(x0+2h)12h
y=x3−6x2+3dydx=3x2−12xd2ydx2=6x−12y=x3−6x2+3dydx=3x2−12xd2ydx2
=6x−12
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.
x1=−b+√b2−4ac2ax2=−b−√b2−4ac2ax1+x2=−bax1⋅x2=cax1=−b+b2−4ac2a
x2=−b−b2−4ac2ax1+x2=−ba x1·x2=ca
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 x1 y la segunda la raíz x2.
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
>> [b_a,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 función
primaria y las anidadas deben obligatoriamente terminar con end
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.
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
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.
>> [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.
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
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