UNIVERSIDAD DE LOS ANDES FACULTAD DE MATEMATICAS CURSO DE ANALISIS NUMERICO TALLER GUIA SOBRE MANEJO DE PROGRAMACION BASICA EN MATLAB1 Temas a tratar: Definición de funciones en MATLAB Aspectos básicos de programación: if, for, while, switch. Recordemos las ventanas básicas de MATLAB: WorkSpace Ventana de Edición Command Window Donde, los comandos o las operaciones sin importancia se efectúan en el Command Window; las variables definidas en el WorkSpace y en el Editor se escribirán el código de programación. AUN CUANDO SE PUEDEN EFECTUAR COMANDOS DE PROGRAMACION DENTRO DEL COMMAND WINDOW, NUNCA SE DEBE 1 David Méndez Suárez. Estudiante Ing. Industrial Uniandes da-mende@uniandes.edu.co UTILIZAR DICHA OPCION YA QUE DEBERAN EFECTUAR TODOS LOS COMANDOS CADA VEZ QUE QUIERAN EJECUTAR SU FUNCION2. El primer paso para Definir una función es introducir su nombre, la variable de salida (o el conjunto de variables) así como los imput que utilizara la función; esto se desarrolla de la siguiente manera: Function a = furier (x,y) a será el output de la función, furier será el nombre (este se utilizara desde el command window para ejecutarla) “x” y “y” serán los imput de la función. NOTA: Tenga presente que no se especifica la naturaleza de ninguna de las variables (es decir, no se dice si es una matriz o un vector o un real o una función). Una vez se escribe el encabezado el usuario podrá trabajar libremente recurriendo a todas las librerías y funciones predeterminadas que MATLAB posee3. No es necesario utilizar algún tipo de comando o código para mostrar la finalización de una función. Simplemente hay que ser cuidadosos de poner los datos finales dentro de las variables que se definieron como output. Hagamos una serie de ejemplos: Construyamos una función coseno _ grafica. Que tome un vector con datos, calcule el coseno para cada uno de ellos y grafique la función. El algoritmo en MATLAB seria: function resultado= coseno_grafica (x) resultado=cos(x); hold on; title('Grafica de Coseno'); plot(x,resultado,'r'); Para guardarlo, por default MATLAB propone el mismo nombre con que se definió la función (coseno _ grafica) no lo cambien ya que en algunas oportunidades el programa molesta cuando se ejecutan las funciones. De igual manera, si es la primera vez que utilizaran una carpeta especifica (por ejemplo, su memoria de USB) es necesario agregar a la misma un directorio que matlab reconocerá para encontrar un conjunto de funciones (se llama Sethpat) este es un procedimiento muy sencillo: 1) Ingresen a File, busquen la opción Seth Path… , esta les abrira la siguiente ventana: 2 Si por alguna razón ninguna de las ventanas les aparece a ustedes una vez inician MATLAB, pueden buscarla ingresando a DESKTOP y la opción DESKTOP LAYOUT. 3 Para una lista completa ingresé a HELP. En la opción MATLAB aparecerá una lista completa por orden alfabético así como por categoría. Dentro del curso ustedes podrán utilizarlas al menos que se indique lo contrario ya que en algunas oportunidades se les pedirá la creación de funciones que ya existen, tales como sacar los valores propios o la inversa de una matriz. Hagan clic en Add fólder y posteriormente Save4. Una vez guardada la función y asegurada la existencia del Path, podemos ejecutar nuestra función desde el command window: >> x=-2*pi: pi/6:2*pi; >> Coseno _ grafica (x); Primero definimos el vector imput (desde 2 hasta 2 ) para posteriormente ejecutar la función. Para definir mas de una salida dentro de una función en MATLAB, se define un conjunto de variables de salida, utilizando los paréntesis cuadrados: function [q,w,e]=nombre(a,b,c) Ahora modifiquemos nuestra función para graficar coseno y tangente, de igual manera, la función nos tiene que dar dos vectores con la información. Nuestros imput serán: el vector de valores en x, así como el color que queremos las graficas: function [seno,coseno]= coseno_grafica (x,color_seno,color_coseno) seno=sin(x); coseno=cos(x); hold on; title('Grafica de Coseno'); plot(x,seno,color_seno); plot(x,coseno,color_coseno); Note que MATLAB es bastante versátil en el manejo de la información, ya que en este caso, x es un vector, mientras que “seno _ color” y “coseno _ color” son unos valores char. Ahora ejecutemos nuestra nueva función: >> x=-2*pi:pi/6:2*pi; >> [a,b]=coseno _ grafica (x,'r','b'); Los resultados son a, b y la grafica de seno y coseno: 4 Recuerden, si en la carpeta que vana utilizar para guardar la función ya aparece el archivo setpath no es necesario realizar este procedimiento. Grafica de Coseno 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 -8 -6 -4 -2 0 2 4 6 8 Sin embargo gran parte del potencial de las funciones radica en su manejo de funciones lógicas. ALGUNAS OPERACIONES LOGICAS NECESARIAS. Operaciones Numericas: < Menor que <= Menor o igual que > Mayor que >= Mayor o igual que == Igual que ~= Diferente que Operaciones Logicas: && and || or ~ no. PROCEDIMIENTOS IF Sirven para ejecutar un conjunto de tareas cuando se cumple una función específica. Normalmente esta relacionado con la comparación de alguna variable con un valor específico, así como de los resultados de una operación requerida. Algunos ejemplos de encabezados: If a==2 If (a==s) && (w==1) De igual manera se pueden realizar operaciones, e incluso utilizar funciones. If det(A)==0 %Si el determinante de la función A es igual a cero% If det(A)==0 && eig(A)==0 Una vez escritos los comandos que se utilizaran en el if, este se finaliza con la palabra end, de tal manera que el depurador reconozca donde inicia y donde finaliza dicha subrutina, por ejemplo: If a~=0 c=b/a; end Al igual que lenguajes de programación como C++, MATLAB también permite anidar if, lo único necesario es tener presente que cada anidacion necesitara un end para finalizarlo. If a~=0 c=b/a; else if a<0 c=b; end PROCEDIMIENTO FOR El procedimiento for suele utilizarse para hacer un recorrido sobre un arreglo (vector o una matriz. for i=1:10 Note que for toma una variable (que bien puede no estar definida) para generar un intervalo donde realizar las tareas posteriores al for; de igual manera dentro de los parámetros pueden encontrarse funciones o procedimientos que definan el intervalo donde se trabajara: for i=1:length(A) for i=min(A):max(A) Ejemplo: Desarrollemos una función que calcule la media y la varianza de un conjunto de datos: function [media,varianza] =estadistica(x) media=0; varianza=0; n=length(x); %Primero se calculara la media for i=1:n media=media+x(i)/n; end %Ahora se calculara la varianza for i=1:n varianza=varianza+((x(i)-media)^2)/(n-1); end Tomemos la siguiente lista de valores: -0.300232159 -1.277683168 0.244257308 1.27647354 1.198350219 1.733133104 -2.18358764 -0.234181243 1.095022526 -1.086700649 -0.69020416 -1.690432327 Luego, los resultados fueron: >> [media,varianza] =estadística(s) Media = -0.1596 Varianza = 1.6439 De igual manera también se pueden presentar un anidado de ciclos for, por ejemplo aquel relacionado con la consecución de la suma de los elementos de aquellos vectores columna que se encuentran en una matriz. function a=suma_vectores(Q) tamano=size(Q) a=zeros(tamano(2),1); for i=1:tamano(1) for j=1:tamano(2) a(j)=a(j)+Q(i,j); end end De la matriz: 0.17029328 0.61015656 0.35029145 0.0753502 0.1900998 0.0966216 0.76299326 0.69154942 0.36649678 0.72884304 0.6732078 0.66734825 0.93914609 0.65352336 0.54356517 0.40617084 Los resultados fueron los siguientes: >> a=suma_vectores (Q) a= 1.6660 2.0891 2.3301 1.8404 Por ultimo, introduzcamos una última función que recopile lo que hallamos visto: Suponga que tenemos una lista con los resultados de una prueba de esferzo realizadas con 2 tipos diferentes de acero, 10-20 y 10-40. El experimento consistió en tomar 5 varillas de cada uno de los tipos de acero, elaborar 4 probetas y desarrollar la respectiva prueba. Para guardar la información, se construyo una matriz, donde cada una de sus filas corresponde a las pruebas realizadas sobre una varilla especifica. Para saber a que tipo de acero corresponde la información, se construyo un vector donde sus posiciones muestran dicha información. Para el acero 10-20 se codifico con la opción 1 mientras que el 10-40 la opción 2, luego si la i-esima componente del vector tiene el número 1, quiere decir que la i-esima columna de la matriz posee la información correspondiente a un acero 10-20. Construya una funciona en MATLAB que reciba una matriz, su correspondiente vector guía y el tipo de acero para que este extraiga los resultados relacionados en una matriz que contenga el resultado de todos los experimentos. function W=acero(Q,v,tipo) W=[] a=zeros(1,4) tamano=size(Q) for i=1:length(v) if v(i)==tipo for j=1:tamano(2) a(j)=Q(i,j) end W=cat(1,W,a); end end Tomemos la siguiente matriz: 0,38200018 0,88460952 0,86324656 0,03238014 0,28504288 0,37183752 0,42616047 0,99124119 0,70503861 0,30021058 0,10068056 0,95846431 0,13858455 0,16412854 0,34308908 0,35560167 0,30390332 0,25626392 0,81652272 0,750206 0,59648427 0,01449629 0,24503311 0,21961119 0,55363628 0,9103061 0,97570727 0,9516892 0,97250282 0,35148167 Con su vector indicador: 1 2 2 2 1 1 2 1 0,89910581 0,4074221 0,04547258 0,01709037 0,35737175 0,46601764 0,80666524 0,05343791 0,46632282 0,77565844 1 2 Luego, al implementar la función “acero” los resultados fueron: >> W=acero(Q,V,2) W= 0.8846 0.8632 0.0324 0.4262 0.3002 0.9585 0.1386 0.1641 0.3039 0.7502 0.0145 0.2450 0.2196 0.9757 0.3515 0.4074 0.0455 0.0171 0.8067 0.7757 0.5965 0.5536 0.9103 0.9517 0.9725 0.8991 0.3574 0.4660 0.0534 0.4663 >> W=acero(Q,V,1) W= 0.3820 0.2850 0.3718 0.9912 0.7050 0.1007 0.3431 0.3556 0.2563 0.8165 Note algo interesante: >> cat(1,acero(Q,V,1),acero(Q,V,2)) ans = 0.3820 0.2850 0.3718 0.9912 0.7050 0.8846 0.8632 0.0324 0.4262 0.3002 0.1007 0.3431 0.3556 0.2563 0.8165 0.9585 0.1386 0.1641 0.3039 0.7502 0.5965 0.5536 0.9103 0.9517 0.9725 0.0145 0.2450 0.2196 0.9757 0.3515 0.8991 0.3574 0.4660 0.0534 0.4663 0.4074 0.0455 0.0171 0.8067 0.7757 La tarea cat(1,acero(Q,V,1),acero(Q,V,2)) organiza los experimentos, poniendo en las cinco primeras filas los aceros 10-20 y en las ultimas cinco los 10-40. PROCEDIMIENTO WHILE El procedimiento While sirve como un indicador para controlar la ejecución de cierta rutina basada una condición especifica. Por ejemplo, dentro de nuestro curso será muy útil para mantener cierto procedimiento funcionando mientras que nuestro error sea menor a un número específico. while a>b while a/b==2 while mod(x,2)==0 RECURSIONES SERIES DE FIBONACCI: function a=fibo(n) if n==0 a=0; else if n==1 a=1; else a=fibo(n-1)+fibo(n-2); end end DETERMINANTE DE UNA MATRIZ: function d=determinante(A) d=0; tam=size(A); if tam(1)~=tam(2) d='no se puede invertir la matriz'; else if tam(1)==1 d=A; else for i=1:tam(1) B=A B(i,:)=[] B(:,1)=[] d=d+((-1)^(i+1))*A(i,1)*determinante(B) end end end FUNCIÓN DE JOSÉ LUIS function Vec=puntosiete(MatA) %el alg. tendra como precondicion la mat. de pares de datos %y devolvera un vector con la pendiente y el corte de la recta que %optimiza el error cuadratico [n,m]=size(MatA); uno=zeros(1,n); Vec=0 if (m==2) %evita procesar matrices del tamaño incorrecto X=MatA(:,1); Y=MatA(:,2); for k= 1:n uno(k)=1; end A=dot(X,uno);% sumatoria de Xi B=dot(Y,uno);% sumatoria de Yi C=dot(X,X);% sumatoria de Xi*Xi D=dot(Y,X);% sumatoria de Yi*Yi M1=[n A; A C]; Vb=[B; D]; Vec=inv(M1)*Vb corte=Vec(1) pendiente=Vec(2) end