UNMSM Programación con MATLAB –
Funciones inline
La función inline es una manera rápida 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 función deseadas o si las variables de función están en el orden equivocado, equivocado, usted puede especificar explícitamente 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 gráfica de f(x) en el intervalo 0
x 4 se obtiene con:
>> ezplot(f,0,4)
El nombre ezplot ezplot se refiere a "easy "easy plot" (gráfico fácil). Aún cuando f(x) se hace infinito cuando x 0, ezplot lo grafica automáticamente automáticamente en una razonable escala escala vertical. La sentencia >>phi = fzero(f,1) x) cerca de x = 1. Produce una aproximación que es certera busca un cero de f ( x certera a casi precisión precisión completa. El resultado puede puede ser insertado en el gráfico ezplot con con
>> hold on >> plot(phi,0,'o') plot(phi,0,'o')
clc clear all disp('Programa disp( 'Programa que genera la tabla de una función f(x),' ) disp('la disp( 'la grafica y encuentra una raíz' ) f = inline('x*sin(x)' inline( 'x*sin(x)'); );
Profesor: Heber Helfer
1
UNMSM Programación con MATLAB –
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 raíz de la función x = fzero(f,1); fprintf('Se encontró una raíz en %8.3f\n' ,x) hold on plot(x,0,'o') grid on Programa que genera la tabla de una función f(x), la grafica y encuentra una raíz 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 raíz en 3.142 x sin(x) 8 6 4 2 0 -2 -4 -6 -10
-8
-6
-4
-2
0 x
2
Otra manera de crear funciones en línea: >> g = @(x) 1/x -(x-1) g =
Profesor: Heber Helfer
4
6
8
10
2
3
UNMSM Programación con MATLAB –
@(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.
% Cálculo de la integral. la función 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('Número de subintervalos (número 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('Integración numérica de f(x) sobre [a,b] = %10.6f\n', integral);
Profesor: Heber Helfer
UNMSM Programación con MATLAB –
Funciones definidas por el usuario Reglas para escribir funciones
De acuerdo a las reglas de MATLAB, las reglas que describen cómo se van a generar salidas de resultados a partir de las entradas de datos (o sea la codificación) debe ser guardada en un archivo que tenga el mismo nombre de la función, con una extensión .m. La primera sentencia (después de cualquier comentario) es de la forma function [variables de salida] = nombre_de _la_función(variables de entrada)
Note que podemos tener más de una variable de salida y más de una variable de entrada. Ejemplo:
Escribamos una función que nos retorne las raíces reales de una ecuación cuadrática ax2 + bx + c , si existen. Así, las variables de entrada de la función serían a b y c . Las variables de salida serían las dos raíces más otra variable que informará al usuario si hay o no raíces reales. Una implementación posible de esta función es la \siguiente: ,
function [raiz1,raiz2,condicion] = cuadratica(a,b,c); % Esta función calcula las raíces de una ecuación cuadrática, si % las ecuaciones tienen raíces reales. en estos casos la función % retorna un valor de condición igual a 0. Si las raíces son complejas % la función retorna un valor de condición igual a -1 % se chequea si las raíces son reales det = b^2 - 4*a*c; if det < 0 % Se chequea si la ecuación tiene raíces reales condicion = -1 % No hay raíces reales else condicion = 0 raiz1 = (-b + sqrt(det))/(2*a); raiz2 = (-b - sqrt(det))/(2*a) end end Como el nombre de la función es cuadratica, el archivo debe ser guardado con el mismo nombre, esto es cuadratica.m. Para usar esta función en MATLAB para obtener las raíces de la ecuación 2 x2 + 4 x + 1 = 0 escribimos
>> [x,y,z] = cuadratica(2,4,1)
Basándose en la forma cómo se escribió la función, x contendrá la primera raíz, y contendrá la segunda raíz y z será cero si la ecuación tiene raíces reales o -1 si son complejas. la respuesta de MATLAB es x = -0.2929 y = -1.7071 z = 0
Profesor: Heber Helfer
4
UNMSM Programación con MATLAB –
Por consiguiente las raíces son 0.2929 y 1.7071. vea si puede hacer cuadratica más general, haciendo que retorne la parte real y la parte imaginaria de la primera y segunda variables de salida cuando las raíces son complejas. Note las líneas de comentario después de la declaración de la función. Estas líneas son una sentencia de ayuda para esta función. Es decir, si usted escribe help cuadratica obtendrá la respuesta −
−
Esta función calcula las raíces de una ecuación cuadrática, si las ecuaciones tienen raíces reales. en estos casos la función retorna un valor de condición igual a 0. Si las raíces son complejas la función retorna un valor de condición igual a -1
Ejemplo
En nuestro ejemplo de caja registradora podemos escribir una función que calcule el impuesto. function[impuesto] = calcula_impuesto(precio,tipo); % Esta función 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 función calcula_impuesto. total = 0; precio = input('Digite el precio de la mercancía:'); while precio > 0 tipo = input('Ingrese el tipo de mercancía:', 's'); impuesto = calcula_impuesto(precio,tipo); costo = precio + impuesto; total = total + costo; precio = input('Digite el precio de la mercancía:'); end a = sprintf('El precio final es %8.2f\n',total); disp(a);
Note que el nuevo programa es más legible que el anterior. Más aún, si la cambian los impuestos todo lo que tenemosue hacer es hacer el reemplazo en la función calcula_impuesto. Función de Fibonacci
La siguiente función genera los n primeros elementos de la serie de fibonacci (un elemento es la suma de los dos elementos anteriores.) Escriba la función en el editor, luego grábela con el mismo nombre de la función (fibonacci). Las funciones no se ejecutan directamente desde el editor,
Profesor: Heber Helfer
5
UNMSM Programación con MATLAB –
function [f] = fibonacci(n) % fibonacci(n) - retorna los primeros n elementos % de la función 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 función dentro de un programa o desde la línea de comandos, por ejemplo, >> fibonacci(8) ans = 1 2 3 5 8 13 21 34
retorna los primeros 8 números de Fibonacci. La función se puede llamar desde un programa: clc clear disp('Serie de Fibonacci' ); x = input('Indique el número 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);
FUNCIÓN - CAPACIDAD CALORÍFICA DEL CALCIO function ce = capcalcio(t) % capcalcio - Función que calcula el calor específico 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 FUNCIÓN capcalcio clc clear disp('Cálculo de la capacidad calorífica del calcio' );
Profesor: Heber Helfer
6
UNMSM Programación con MATLAB –
temp=input('Ingrese la temperatura (Kelvin):'); fprintf('La capacidad calorífica es %9.5f cal/mol-K\n' ,... capcalcio(temp));
Profesor: Heber Helfer
7
UNMSM Programación con MATLAB –
FUNCIÓN tinversion – Cálculo del tiempo de inversión 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 función tinversion clc clear all disp('Cálculo de las ganancias en un banco' ) disp('Se calcula el número 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('Interés mensual (%) :' ); t = tinversion(capital,interes,capfin); fprintf('Se tardará %d meses\n' ,t)
Profesor: Heber Helfer
8
UNMSM Programación con MATLAB –
% Cálculo de la integral. La función 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('Número de subintervalos (número 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('Integración numérica de f(x) sobre [a,b] = %10.6f\n' , integral); ezplot(f,a,b) % Cálculo de la integral. La función 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('Número de subintervalos (número 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('Integración numérica de f(x) sobre [a,b] = %10.6f\n' , integral); x = a:0.01:b; plot(x,f(x))
Función f.m function fx = f(x) % Función f(x) = sqrt(1-x.^2). Integrable entre -1 y 1. fx = sqrt(1-x.^2); end
Profesor: Heber Helfer
9
UNMSM Programación con MATLAB –
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
10
clc clear all disp('Programa que lee tres valores aleatorios y determina cuál 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 análisis de n muestras de pH que consisten de 3 pruebas/muestra' ) disp('toma el valor intermedio del análisis de c/muestra y lo grafica') n = input('¿Cuántas muestras son?: ' ); ma = rand(n,3)*14; mm = zeros(n,1); % prelocalización, 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)
Profesor: Heber Helfer