1
UNMSM Programacin con MATLAB
Profesor: Heber Helfer
Funciones inline
La funcin inline es una manera rpida de convertir cadenas de caracteres en objetos que pueden ser
argumentos para las funciones matlab que operan en otras funciones.
Ejemplo:
>>f = inline('1/x - (x-1)')
f =
Inline function:
f(x) = 1/x - (x-1)
>> f(5)
ans =
-3.80000000000000
Si inline no retorna las variables de funcin deseadas o si las variables de funcin estn en el orden
equivocado, usted puede especificar explcitamente las variables deseadas con la lista de argumentos
inline.
g = inline('sin(alpha*x)','x','alpha')
g =
Inline function:
g(x,alpha) = sin(alpha*x)
Una grfica de f(x) en el intervalo 0 x 4 se obtiene con:
>> ezplot(f,0,4)
El nombre ezplot se refiere a "easy plot" (grfico fcil). An cuando f(x) se hace infinito cuando x
0, ezplot lo grafica automticamente en una razonable escala vertical. La sentencia
>>phi = fzero(f,1)
busca un cero de f(x) cerca de x = 1. Produce una aproximacin que es certera a casi precisin
completa. El resultado puede ser insertado en el grfico ezplot con
>> hold on
>> plot(phi,0,'o')
clc
clear all
disp('Programa que genera la tabla de una funcin f(x),')
disp('la grafica y encuentra una raz')
f = inline('x*sin(x)');
2
UNMSM Programacin con MATLAB
Profesor: Heber Helfer
fprintf('x\t\t\tx*sin(x)\n**********************\n')
for i=0:0.1:1
fprintf('%4.2f\t\t%6.4f\n',i,f(i));
end
ezplot(f,-10,10)
% Se busca una raz de la funcin
x = fzero(f,1);
fprintf('Se encontr una raz en %8.3f\n',x)
hold on
plot(x,0,'o')
grid on
Programa que genera la tabla de una funcin f(x), la grafica
y encuentra una raz
x x*sin(x)
**********************
0.00 0.0000
0.10 0.0100
0.20 0.0397
0.30 0.0887
0.40 0.1558
0.50 0.2397
0.60 0.3388
0.70 0.4510
0.80 0.5739
0.90 0.7050
1.00 0.8415
Se encontr una raz en 3.142
Otra manera de crear funciones en lnea:
>> g = @(x) 1/x -(x-1)
g =
-10 -8 -6 -4 -2 0 2 4 6 8 10
-6
-4
-2
0
2
4
6
8
x
x sin(x)
3
UNMSM Programacin con MATLAB
Profesor: Heber Helfer
@(x)1/x-(x-1)
>> g(5)
ans =
-3.8000
>> h = @(x,y) 1/y -(x-1)
h =
@(x,y)1/y-(x-1)
>> h(5,2)
ans =
-3.5000
Ejemplo: Programa que calcula la integral
usando la regla de
Simpson.
% Clculo de la integral. la funcin solo est definida entre -1<=x<=1
f = inline('sqrt(1-x*x)');
disp('Regla de Simpson para la integral de f(x) sobre el')
disp('intervalo[a,b]')
a = input('Desde a = ');
b = input('hasta b = ');
n = input('Nmero de subintervalos (nmero par) :');
dx = (b-a)/n;
sum = 0;
c = 2;
for i=1:n-1
c = 6 - c; % genera los coeficientes 4,2,4,2,...
sum = sum + c*f(a + i*dx);
end
integral = dx/3*(f(a) + sum + f(b));
fprintf('Integracin numrica de f(x) sobre [a,b] = %10.6f\n', integral);
4
UNMSM Programacin con MATLAB
Profesor: Heber Helfer
Funciones definidas por el usuario
Reglas para escribir funciones
De acuerdo a las reglas de MATLAB, las reglas que describen cmo se van a generar salidas de
resultados a partir de las entradas de datos (o sea la codificacin) debe ser guardada en un archivo
que tenga el mismo nombre de la funcin, con una extensin .m. La primera sentencia (despus de
cualquier comentario) es de la forma
function [variables de salida] = nombre_de _la_funcin(variables de entrada)
Note que podemos tener ms de una variable de salida y ms de una variable de entrada.
Ejemplo:
Escribamos una funcin que nos retorne las races reales de una ecuacin cuadrtica ax
2
+ bx + c , si
existen. As, las variables de entrada de la funcin seran a, b y c . Las variables de salida seran las
dos races ms otra variable que informar al usuario si hay o no races reales. Una implementacin
posible de esta funcin es la \siguiente:
function [raiz1,raiz2,condicion] = cuadratica(a,b,c);
% Esta funcin calcula las races de una ecuacin cuadrtica, si
% las ecuaciones tienen races reales. en estos casos la funcin
% retorna un valor de condicin igual a 0. Si las races son complejas
% la funcin retorna un valor de condicin igual a -1
% se chequea si las races son reales
det = b^2 - 4*a*c;
if det < 0 % Se chequea si la ecuacin tiene races reales
condicion = -1 % No hay races reales
else
condicion = 0
raiz1 = (-b + sqrt(det))/(2*a);
raiz2 = (-b - sqrt(det))/(2*a)
end
end
Como el nombre de la funcin es cuadratica, el archivo debe ser guardado con el mismo nombre,
esto es cuadratica.m. Para usar esta funcin en MATLAB para obtener las races de la ecuacin 2x
2
+ 4x + 1 = 0 escribimos
>> [x,y,z] = cuadratica(2,4,1)
Basndose en la forma cmo se escribi la funcin, x contendr la primera raz, y contendr la
segunda raz y z ser cero si la ecuacin tiene races reales o -1 si son complejas. la respuesta de
MATLAB es
x =
-0.2929
y =
-1.7071
z =
0
5
UNMSM Programacin con MATLAB
Profesor: Heber Helfer
Por consiguiente las races son 0.2929 y 1.7071. vea si puede hacer cuadratica ms general,
haciendo que retorne la parte real y la parte imaginaria de la primera y segunda variables de salida
cuando las races son complejas.
Note las lneas de comentario despus de la declaracin de la funcin. Estas lneas son una sentencia
de ayuda para esta funcin. Es decir, si usted escribe help cuadratica obtendr la respuesta
Esta funcin calcula las races de una ecuacin cuadrtica, si
las ecuaciones tienen races reales. en estos casos la funcin
retorna un valor de condicin igual a 0. Si las races son
complejas la funcin retorna un valor de condicin igual a -1
Ejemplo
En nuestro ejemplo de caja registradora podemos escribir una funcin que calcule el impuesto.
function[impuesto] = calcula_impuesto(precio,tipo);
% Esta funcin calcula el impuesto a las ventas de diferentes tems
% usando las siguientes tasas:
% alimento, medicina- sin impuesto
% todos los otros tems- 6% de impuesto
%
switch tipo
case {'alimento','medicina'}
impuesto = 0;
case 'lujo'
impuesto = .1*precio;
otherwise
impuesto = .06*precio;
end
end
Podemos cambiar el ejemplo de la caja registradora incorporando la funcin calcula_impuesto.
total = 0;
precio = input('Digite el precio de la mercanca:');
while precio > 0
tipo = input('Ingrese el tipo de mercanca:', 's');
impuesto = calcula_impuesto(precio,tipo);
costo = precio + impuesto;
total = total + costo;
precio = input('Digite el precio de la mercanca:');
end
a = sprintf('El precio final es %8.2f\n',total);
disp(a);
Note que el nuevo programa es ms legible que el anterior. Ms an, si la cambian los impuestos
todo lo que tenemosue hacer es hacer el reemplazo en la funcin calcula_impuesto.
Funcin de Fibonacci
La siguiente funcin genera los n primeros elementos de la serie de fibonacci (un elemento es la
suma de los dos elementos anteriores.) Escriba la funcin en el editor, luego grbela con el mismo
nombre de la funcin (fibonacci). Las funciones no se ejecutan directamente desde el editor,
6
UNMSM Programacin con MATLAB
Profesor: Heber Helfer
function [f] = fibonacci(n)
% fibonacci(n) - retorna los primeros n elementos
% de la funcin de Fibonacci.
f = zeros(n,1);
f(1) = 1;
f(2) = 2;
for k = 3:n
f(k) = f(k-1) + f(k-2);
end
end
Puede usar la funcin dentro de un programa o desde la lnea de comandos, por ejemplo,
>> fibonacci(8)
ans =
1
2
3
5
8
13
21
34
retorna los primeros 8 nmeros de Fibonacci. La funcin se puede llamar desde un programa:
clc
clear
disp('Serie de Fibonacci');
x = input('Indique el nmero de elementos de la serie:');
nes = fibonacci(x);
fprintf('Los primeros %3d elementos de la serie son:\n',x);
fprintf('%16d%16d%16d%16d\n',nes);
FUNCIN - CAPACIDAD CALORFICA DEL CALCIO
function ce = capcalcio(t)
% capcalcio - Funcin que calcula el calor especfico del Calcio
% capcalcio solo se ejecuta en el intervalo de temperatura
% 273-873 Kelvin. Unidades: cal/mol-K
if t>=273 && t < 673
ce = 5.31 + 0.00333*t;
elseif t>= 673 && t<=873
ce = 6.29 + 0.0014*t;
else
ce=NaN;
error('Fuera de rango. Digite valores entre 273 y 873 K.');
end
end
PROGRAMA QUE HACE USO DE LA FUNCIN capcalcio
clc
clear
disp('Clculo de la capacidad calorfica del calcio');
7
UNMSM Programacin con MATLAB
Profesor: Heber Helfer
temp=input('Ingrese la temperatura (Kelvin):');
fprintf('La capacidad calorfica es %9.5f cal/mol-K\n',...
capcalcio(temp));
8
UNMSM Programacin con MATLAB
Profesor: Heber Helfer
FUNCIN tinversion Clculo del tiempo de inversin
function t = tinversion(cini,interes,cfinal)
t = 0;
if cini >= cfinal
error('El capital inicial debe ser menor que el final')
end
if interes <=0 || cini <=0 || cfinal <=0
error('Los datos deben ser positivos')
end
while cini < cfinal
t = t + 1;
cini = cini + cini*interes/100;
end
end
Programa que llama a la funcin tinversion
clc
clear all
disp('Clculo de las ganancias en un banco')
disp('Se calcula el nmero de meses que se debe ahorrar')
disp('a plazo fijo para que se duplique su dinero')
capital = input('Monto inicial: ');
capfin = input('Monto final: ');
interes = input('Inters mensual (%) :');
t = tinversion(capital,interes,capfin);
fprintf('Se tardar %d meses\n',t)
9
UNMSM Programacin con MATLAB
Profesor: Heber Helfer
% Clculo de la integral. La funcin solo est definida
% entre -1 <= x <= 1
f = inline('sqrt(1-x*x)');
disp('Regla de Simpson para la integral de f(x) sobre el')
disp('intervalo[a,b]')
a = input('Desde a = ');
b = input('hasta b = ');
n = input('Nmero de subintervalos (nmero par) :');
dx = (b-a)/n;
sum = 0;
c = 2;
for i=1:n-1
c = 6 - c; % genera los coeficientes 4,2,4,2,...
sum = sum + c*f(a + i*dx);
end
integral = dx/3*(f(a) + sum + f(b));
fprintf('Integracin numrica de f(x) sobre [a,b] = %10.6f\n',
integral);
ezplot(f,a,b)
% Clculo de la integral. La funcin solo est definida
% entre -1 <= x <= 1
f = @(x) sqrt(1-x.*x);
disp('Regla de Simpson para la integral de f(x) sobre el')
disp('intervalo[a,b]')
a = input('Desde a = ');
b = input('hasta b = ');
n = input('Nmero de subintervalos (nmero par) :');
dx = (b-a)/n;
sum = 0;
c = 2;
for i=1:n-1
c = 6 - c; % genera los coeficientes 4,2,4,2,...
sum = sum + c*f(a + i*dx);
end
integral = dx/3*(f(a) + sum + f(b));
fprintf('Integracin numrica de f(x) sobre [a,b] = %10.6f\n',
integral);
x = a:0.01:b;
plot(x,f(x))
Funcin f.m
function fx = f(x)
% Funcin f(x) = sqrt(1-x.^2). Integrable entre -1 y 1.
fx = sqrt(1-x.^2);
end
10
UNMSM Programacin con MATLAB
Profesor: Heber Helfer
function m = medio(a,b,c)
if (a > b && c < b) || (c > b && a < b)
m = b;
elseif (a < c && a > b) || (a < b && a > c)
m = a;
else
m = c; % Por descarte.
end
end
clc
clear all
disp('Programa que lee tres valores aleatorios y determina cul es
el intermedio')
x = rand();
y = rand();
z = rand();
vm = medio(x,y,z);
fprintf('El valor intermedio es %6.4f\n',vm)
fprintf('Los valores obtenidos fueron %6.4f, %6.4f y
%6.4f\n',x,y,z)
clc
clear all
disp('Programa que lee los anlisis de n muestras de pH que
consisten de 3 pruebas/muestra')
disp('toma el valor intermedio del anlisis de c/muestra y lo
grafica')
n = input('Cuntas muestras son?: ');
ma = rand(n,3)*14;
mm = zeros(n,1); % prelocalizacin, se llena mm con ceros para
aumentar la velocidad
for fila=1:n
for col=1:3
mm(fila) = medio( ma(fila,col), ma(fila,col), ma(fila,col)
);
end
end
hist(mm)