Universidad Nacional de Misiones SINTAXIS EN MATLAB Dr. Ing. Aldo Luis Caballero – MSc. Ing. Corina Feltan Última versión: agosto de 2013 Se desarrollan a continuación una serie de programas para ejemplificar funciones en Matlab, especialmente las que se utilizan con bifurcaciones y bucles. Funciones definidas por el usuario Se pueden crear funciones similares a las conocidas por el usuario, por ejemplo magic(2) crea una matriz cuadrada 2x2 con valores al azar. Para esta función tenemos un argumento de entrada 2, y valores de retorno o argumentos de salida, cómo se muestra a continuación, si se escribe lo siguiente en la ventana de comandos: >> Matriz = magic(2) Matriz = 1 3 4 2 Para crear funciones definidas por el usuario tenemos varias opciones: crear una función con el comando function o utilizar las referencias de función, por ejemplo si queremos que una función halle la edad ingresando como variable de entrada el año de nacimiento –suponiendo que se tiene como referencia el año 2013– Escribimos en la ventana de comandos edad = @(x)(2013-x); Luego para saber la edad de Nina por ejemplo: Nina = edad(1998) lo que devolverá como argumento de salida la edad Otra forma es creando un fichero llamado edad_1.m cuya primera línea es la siguiente function [e1,e2,e3…en] = edad_1(x1,x2,x3…xn) donde edad_1 es el nombre de la función, EL FICHERO CREADO Y LA FUNCIÓN DEBEN TENER UGUAL NOMBRE, las x son las variables de entrada, en nuestro caso el año de nacimiento y la variable e de salida nos devolverá la edad pedida function e = edad_1(x1,x2) Juan Manuel de Rosas 325 Tel/Fax (+54 3755) 422 179 – 422 170 www.fiobera.unam.edu.ar e-mail: [email protected] CP3360 Oberá Misiones Argentina Sintaxis en MATLAB anio = x1; nombre = x2; e = 2013 - anio ; disp(['la edad de ' nombre ' es de ' num2str(e) ' años']) luego se escribe en la pantalla de comandos edad_1(1998,'Nina'); Tenga en cuenta que el nombre es una cadena de caracteres y debe ir entre comillas simples. Luego usted se da cuenta que el programa no siempre da la respuesta correcta especialmente si la persona a la que estamos calculando su edad todavía no cumplió años al día de la fecha, por lo que usted se dispone a programar algo que sirva, bueno si sirve no siempre es tan fácil de hacer, antes de pasar al programa vamos a ver otro conceptos Bifurcaciones Una bifurcación es una estructura selectiva, se usa para realizar operaciones cuando se cumple una condición, esto se consigue mediante la sentencia if Falso Condición Verdadero Sentencias if condición sentencias end Puede ser que se tengan varias opciones, por lo que se utiliza una bifurcación múltiple, en la que pueden concatenarse la cantidad de condiciones que se desee. MODELACIÓN EN INGENIERÍA – Año 2013 – 2 Sintaxis en MATLAB Falso Condición Verdadero Verdadero Condición1 Sentencias 2 Sentencias 1 Sentencias 1 Falso Verdadero Condición 2 Falso Sentencias 3 Sentencias 2 if condición 1 sentencias 1 elseif condición 2 sentencias 2 else sentencias 3 end Ahora si podemos realizar el siguiente programa para determinar la edad de la incauta tía o abuela que nunca quiso decirnos su edad. clc, close all fecha.dia = input( 'ingrese el día de su nacimiento = ' );%muestra un mensaje en la ventana de comandos para que el usuario ingrese lo que se le pide que será el valor que recupera el programa fecha.mes = input( 'ingrese el número del mes de su nacimiento = ' ); fecha.anio = input( 'ingrese el año de su nacimiento con cuatro dígitos = ' ); f_actual = date; % nos da la fecha actual como una cadena de caracteres [Y,M,D] = datevec(f_actual); % trasformamos en números la fecha if M > fecha.mes; % el mes del cumpleaños ya pasó (ya cumplió años) e = Y - fecha.anio; elseif M < fecha.mes % el mes del cumpleaños no pasó (todavía no cumplió años MODELACIÓN EN INGENIERÍA – Año 2013 – 3 Sintaxis en MATLAB e = Y - fecha.anio -1; else M == fecha.mes; % si cumple este mes if D >= fecha.dia % ya cumplió años, su día de cumpleaños ya pasó e = Y - fecha.anio; else % todavía no paso su día de cumpleaños e = Y - fecha.anio -1; end end h = msgbox([' '' tenés ' num2str(e) ' años '],'EDAD','help') ; %caja de diálogo Puede verse que se utilizó para la variable fecha: fecha.dia; fecha.mes; fecha.anio (no puede utilizarse la letra ñ en Matlab) Esta forma de llamar a las variables crea una estructura que agrupa datos bajo el mismo nombre en nuestro caso fecha >> fecha fecha = dia: 15 mes: 12 anio: 1998 Por lo que con nuestro programa podemos ver que Nina tiene 14 años. Sentencia switch Realiza una función análoga a if con bifurcación múltiple. Su forma general es la siguiente switch expresión case caso 1 sentencias 1 case caso 2 sentencias 2 otherwise sentencias 3 ejemplo: programa que identifica si el número entero ingresado es par o impar disp(' programa que identifica si un número entero es par o impar ') disp( ' ' ) % dejamos un espacio para realizar un interlineado n = input(' ingrese el valor de x = '); v = mod(n,2); % nos da el resto de la división x/2 MODELACIÓN EN INGENIERÍA – Año 2013 – 4 Sintaxis en MATLAB switch v case 0 % es divisible por 2 y su resto es 0 disp( ' ' ) disp([' '' EL VALOR x = ' num2str(n) ' es PAR ']) %imprime un mensaje si el número es par num2str(n) convierte al número n en una cadena de caracteres otherwise disp( ' ' ) disp([' end '' EL VALOR x = ' num2str(n) ' es IMPAR ']) ; Bucles Son estructuras iterativas que se repiten un número determinado de veces (sentecia for) o hasta que sea necesario (while) Sentencia for En esta sentencia las operaciones se repiten un número fijo de veces que viene determinado por la longitud del vector i for i = 1:n setencias end Sentencia while Las sentencias se siguen ejecutando mientras haya algún elemento verdadero, el bucle se termina cuando todos los elementos de condición sean falsos Sentencia break Hace que termine la ejecución de un bucle más interno de los que comprenden a dicha sentencia Ahora con lo aprendido podemos mejorar nuestro fichero edad_1.m function e = edad_1(d,m,a,n) f_actual = date; % nos da la fecha actual como una cadena de caracteres [Y,M,D] = datevec(f_actual); if M > m; e = Y - a; elseif M < m e = Y - a -1; MODELACIÓN EN INGENIERÍA – Año 2013 – 5 Sintaxis en MATLAB else M == m; if D >= d e = Y - a; else e = Y - a -1; end end h = msgbox([n ' tiene ' num2str(e) ' años '],'EDAD','help') ; y escribimos en la ventana de comandos edad_1(2,12,1995,'Lucy'); que nos devuelve el siguiente cuadro de diálogo Ejemplo % programa que pide al el usuario que ingrese un número y lo compara con un % numero al azar generado por la computadora y el usuario debe ingresar % tantas veces el número hasta que lo adivine clc num = input(' ingresa un número del 0 al 10 = '); disp(' ') n_azar = rand *10; n_ent = fix(n_azar); if num == n_ent disp( 'acertaste!!') break % el programa se interrumpe porque el usuario acertó en número else disp ('no acertaste sos un perdedor :( ') disp(' ') disp( ['el número era ' num2str(n_ent)]),disp(' ') while num ~= n_ent % se ejecutaran las sentencias hasta que acierte el número num = input(' ingresa un número del 0 al 10 = '); disp(' ') n_azar = rand *10; n_ent = fix(n_azar); MODELACIÓN EN INGENIERÍA – Año 2013 – 6 Sintaxis en MATLAB if num == n_ent disp( 'acertaste!!') break else disp ('no acertaste sos un perdedor :( ') disp(' ') disp( ['el número era ' num2str(n_ent)]), disp(' ') end end end El siguiente programa es una variante del anterior que pregunta cuántas oportunidades quiere para adivinar y se ejecuta el programa tantas veces cómo el usuario desee o adivine el número, lo que ocurra primero. disp('adivine el número' ) disp(' ') oport = input('cuántas oportunidades quiere? = ' );disp(' ') for i = 1:oport num = input(' ingresa un número del 0 al 10 = '); disp(' ') n_azar = rand *10; % genera números al azar n_ent = fix(n_azar); % toma sólo el valor entero de los números generados al azar if num == n_ent disp( 'acertaste!!') break else disp ('no acertaste sos un perdedor :( ') disp(' ') end Regresión En clase se vieron varios ejemplos de programación del método de los mínimos cuadrados. Matlab tiene varias funciones programadas para ajustes de curvas, la función: P = ployfit(x,y,n) realiza un ajuste polinómico de grado n a los puntos dados (x,y) dando cómo salida los coeficientes del polinomio en potencias descendentes ܲሺݔሻ = ଵ ∙ ݔ + ଶ ∙ ݔିଵ + ⋯ + ∙ ݔ+ ିଵ MODELACIÓN EN INGENIERÍA – Año 2013 – 7 Sintaxis en MATLAB cftool (Curve Fitting Tool) abre una ventana que nos permite encontrar el ajuste de curva deseado. Otra opción que tiene Matlab es realizar un ajuste de curva mediante la opción lsqcurvefit cuya sintaxis es la siguiente: x = lsqcurvefit(curva,xo,xdatos,ydatos) donde: curva = es la función a ajustar y a la que vamos a encontrar los coeficientes y la creamos como una referencia de función o una función definida por el usuario por ejemplo si queremos ajustar los siguientes datos: t= [0 1 2.01 3.01 4 5 6 7.01 8.01 9]; tita= [150 -131.1 114.6 -100.3 87.7 -76.6 67 -58.6 51.2 -44.8]; a la función : ∙ ܣcosሺ߱ ∙ ݐሻ ∙ ݁ ି௧ A = tita(1); Ti= @(a,tp)A*cos(a(1).*tp).*exp(-a(2)*tp); % función a ajustar w= 3; b= 0;xo= [w b]; % condiciones iniciales ab= lsqcurvefit(Ti,xo,t,tita); w= ab(1) ; b=ab(2); T= t(1):.01:t(length(t)); Tita= A*cos(w*T).*exp(-b*T); plot(t,tita,'*r',T,Tita,'b'), grid on xlabel('t') ylabel('tita') dando como resultado el ajuste de la curva mostrado con la línea azul y los puntos rojos son los datos. MODELACIÓN EN INGENIERÍA – Año 2013 – 8 Sintaxis en MATLAB Solución numérica de ecuaciones: Método de la bisección a = 0; b = 1; x = a:0.01:b; fx = exp(-x) - x ; fx = exp(-x) - x; %función que queremos encontrar una raíz plot(x,fx), grid on ead=0.01; E=1; x = (a+b)/2; k = 1; while E>ead fx = exp(-x)-x; fa = exp(-a)-a; %función evaluada en a fb = exp(-b)-b; % función evaluada en b if fx*fa < 0 ; b = x; fb = fx; else MODELACIÓN EN INGENIERÍA – Año 2013 – 9 Sintaxis en MATLAB fx*fb < 0; a = x; fa = fx; end E = abs((fb-fa)/2); xi(k) = x ; fxi = exp(-xi(k))-xi(k); k = k + 1; % se arma un vector para graficar las sucesivas raíces x = (a+b)/2 end raiz = x hold on, plot(xi,fxi,'r.'), grid on MODELACIÓN EN INGENIERÍA – Año 2013 – 10