function y=f(x) Prácticas de Matemática Aplicada. % una función que me devuelve el doble de x y=2*x; Introduccion a la programación (con MATLAB) Guardaremos la función en nuestra carpeta con el nombre resto.m. La primera línea del programa es la declaración de la función. Un fichero cuya primera línea es una declaración de función se llama fichero de función. El nombre de la función debe coincidir con el nombre del fichero sin la extensión .m. Así pues el nombre que daremos al fichero que contiene el programa es doble.m. En esta primera sentencia se declaran las variables de entrada, en este caso x, y la variable de salida, en este caso y. Las variables que se crean en un fichero *.m de función, pertenecen al espacio de trabajo de dicha función, por tanto las letras que las designan pueden ser usadas de nuevo. Estructuras de datos, vectores, matrices y cadenas de caracteres. MatLab nos permite trabajar con diversos tipos de datos. De momento introducimos variables que pueden ser escalares, vectores o cadenas de caracteres. Cuando utilizamos alguna variable en Matlab ha de tener algún valor asignado o nos dará error. >>x ??? Undefined function or variable 'x'. El signo % precede a los comentarios de ayuda. Indica que lo que le sigue será ignorado cuando se ejecute el programa. MATLAB imprimirá en pantalla los comentarios de ayuda que escribimos en el fichero, cuando se use el comando help. De este modo contribuimos a la opción help que proporciona MATLAB. Para asignar valor a las variables usamos = por ejemplo un escalar x, un vector v y una matriz A >>x=3 >>v=[2 3 21 2] >>A=[2 4 5;3 3 5] A continuación de los comentarios de ayuda se escribe el núcleo del programa. A la variable y le asignamos el valor 2*x; Esta operación y el “; “ sirve para que no aparezca en pantalla el resultado antes del final de la ejecución del programa. Si queremos modificar el valor de una variable existente en función de su valor actual lo haremos con una expresion del tipo x=f(x) por ejemplo si queremos multiplicar el valor actual de x por 2 haremos: >>x=2*x Podemos leer esta expresion como: valor nuevo de x=2*valor antiguo de x. Para aumentar en 5 el valor de x escribimos >>x=x+5 Veamos ahora un ejemplo de script que me da un numero al azar entre 1 y 10 >> edit v=randperm(10); %esta instrucción me da una permutacion %de los 10 primeros numeros numero=v(1) Guardamos este fichero en aleatorio.m y ejecutamos Ficheros de función y scripts. La diferencia entre las dos es que una función puede tener argumentos de entrada salida y un script no. Comenzamos con un ejemplo sencillo que consiste en definir una nueva función. >> edit >> aleatorio Notar que no podemos utilizar la salida de aleatorio para asignar un valor >> x=aleatorio da un error porque el script no tiene un valor de salida. 1 CONSTRUCCIONES BÁSICAS DE PROGRAMACIÓN Operadores relacionales El lenguaje de programación de MATLAB dispone de los siguientes operadores relacionales: < menor que > mayor que <= menor o igual que >= mayor o igual que == igual que ~= distinto que (el carácter ~ se consigue pulsando Alt 126, manteniendo pulsado Alt hasta que se complete el 126). En MATLAB los operadores relacionales pueden aplicarse a vectores y matrices, y eso hace que tengan un significado especial. Si una comparación se cumple el resultado es 1 (cierto), mientras que si no se cumple es 0 (falso). Cuando los operadores relacionales de MATLAB se aplican a dos matrices o vectores del mismo tamaño, la comparación se realiza elemento a elemento, y el resultado es otra matriz de unos y ceros del mismo tamaño, que recoge el resultado de cada comparación entre elementos. Considérese el siguiente ejemplo como ilustración de lo que se acaba de decir: » A=[1 2;0 3]; B=[4 2;1 5]; » A==B ans = 0 1 0 0 » A~=B ans = 1 0 1 1 Operadores lógicos Los operadores lógicos de MATLAB son los siguientes: & “y” | “o” ~ negación lógica Los operadores lógicos se combinan con los relacionales para poder comprobar el cumplimiento de condiciones múltiples. La bifurcación “if” Una bifurcación “if”(si) es una construcción de la forma if condición sentencias end Se puede interpretar como Si se cumple condición hacer sentencias fin Las sentencias se ejecutan en el caso de que la condición no sea 0 (falsa). Hay que tener en cuenta que en MATLAB A==B, A<=B, etc. son funciones que toman el valor 0 o 1. Frecuentemente una bifurcación se escribe if condición sentencias 1 else sentencias 2 end En este caso else se puede traducir como “en otro caso” es decir, si la condición se cumple(1) se ejecutan las sentencias 1 y si no se cumple se ejecutan las sentencias 2. Podemos incorporar más condiciones con elseif if condición A sentencias 1 elseif condición B sentencias 2 end En este caso si la condición A no es 0 se ejecutan las sentencias 1 y si es 0 y la condición 2 no es 0, se ejecutan las sentencias 2. Si las condiciones 1 y 2 son 0 la bifurcación termina 2 >>edit function r=g(y) % g(y) es el vector que da las soluciones reales de % la ecuación y=0,donde y es el vector de los % coeficients de un polinomio de segundo % grado y(1)*x^2+y(2)*x+y(3). function f(x) if Ejemplos. Vamos a diseñar una funcion que nos diga si un numero que introducimos es mayor o menor que 0. y(2)^2-4*y(1)*y(3) >=0 r(1)= (-y(2)+sqrt(y(2)^2-4*y(1)*y(3)))/(2*y(1)); r(2)= (-y(2)-sqrt(y(2)^2-4*y(1)*y(3)))/(2*y(1)); else 'la ecuación no tiene raices reales' end if x<0 'menor que 0' elseif x>0 'mayor que 0' else 'el numero es 0' end BUCLES MATLAB dispone de dos comandos for (para) y while (mientras), para repetir la ejecución de sentencias. Esto añade flexibilidad a la ejecución repetida de sentencias, sujetas a un control lógico. Guardar el fichero como escero.m Ejecutar para varios numeros, por ejemplo >>escero(3) Bucles “for” Básicamente, un bucle “for” es una construcción de la forma Veamos como hacer algo similar con un script utilizando la entrada desde teclado input. for i=1:n, sentencias end >>edit x=input('introduce un numero ') Se puede interpretar como desde i=1 hasta n hacer sentencias fin if x<0 'menor que 0' elseif x>0 'mayor que 0' else 'el numero es 0' Ejemplos Vamos a hacer un script que nos de una cuenta atrás. Necesitaremos las funciones strcat que une varias cadenas de caracteres y num2str que transforma un numero en una cadena de caracteres (necesario para usar strcat). Pot ultimo pause hace una pausa de 1 segundo para dar mas realismo a nuestro programa. Resolver una ecuación de segundo grado. 3 Guardamos el fichero y ejecutamos: >>recorrevector(V) for i=1:9 strcat(num2str(11-i), ' segundos para el lanzamiento') pause(1) end strcat(num2str(1), ' segundo para el lanzamiento') pause(1) 'ignicion' Ahora queremos que nos cuente el numero de doses que aparecen en el vector. Para ello hacemos una nueva función: >>cuentatras function n=cuentadoses(V) n=0; %antes de empezar a contar no tengo ningun dos for i=1:length(V) if V(i)==2 n=n+1; %si en la posicion en la que estoy end %hay un dos aumento en uno el valor end %de n. Veamos como recorrer todos los elementos de un vector o matriz. Dado un vector V podemos calcular su longitud con el comando length Podemos hacer lo mismo que antes con matrices. En primer lugar dada la matriz A el comando size me da un vector de 2 columnas con el numero de filas en la primera componente y el numero de columnas en la segunda. Guardamos en cuentatras.m y ejecutamos Ejemplo: >>V=[1 2 4 4 2 3 4]; >>length(V) nos da la respuesta ans= 7 >> A=[[1 2 2];[4 2 5]] Ahora si queremos hacer un programa que dado el vector v nos escriba sus elementos un por uno: >> size(A) ans = >>edit 2 3 Ahora queremos escribir una funcion que escriba todos los elementos uno por uno: A = 1 4 2 2 2 5 ya en el editor: function recorrematriz(A) [nfilas ncolumnas]=size(A); for i=1:nfilas for j=1:ncolumnas A(i,j) end end function recorrevector(V) for i=1:length(V) V(i) end 4 Ejemplos: finalmente una función que cuente cuantos doses hay: Cuantos números pares hay debajo de uno dado. function n=cuentadosmatriz(A) [nfilas ncolumnas]=size(A); n=0; for i=1:nfilas for j=1:ncolumnas if A(i,j)==2 n=n+1; end end end function k=npares(x) k=0; while 2*k<x k=k+1; end Ejemplo/Ejercicio Combinar ejemplos anteriores y hacemos un juego en el que el ordenador genera un numero aleatorio que nosotros habremos de adivinar y en cada intento nos diga si nos hemos pasado o nos hemos quedado cortos. Bucles “while” El comando “while” repite las sentencias tantas veces como una expresión lógica sea verdadera. En general un bucle while es de la forma: while expresión lógica A sentencias end. Se puede interpretar como Mientras se cumple la condicion A hacer Sentencias Hasta que ya no se cumpla. Hay que tener aquí mucho cuidado con no hacer bucles infinitos. Para ello es a veces util la siguiente sentencia: Sentencia “break” Hace que se termine la ejecución del bucle cuando se cumple una condición lógica. if condición break end 5 end 7. Examinar los siguientes bucles while y determinar el valor de la variable x al final de cada uno de ellos. ¿Cuántas veces se ejecuta el bucle? EJERCICIOS. 1. 2. Escribir una funci\'on de MATLAB para calcular la media aritmética de n datos. a) x = 2; while x <= 200 x = x^2; end b) x = 2; while x > 200 x = x^2; end Escribir un programa en MATLAB que calcule la suma de los elementos de una matriz nxn 3. Escribir un programa en MATLAB que determine si dados 4 números a, b, c, d están en progresión aritmética 4. 5. a) b) c) d) Escribir las sentencias de MATLAB necesarias para obtener los cuadrados de los números pares entre 0 y 50. Crear una tabla con cada entero y su cuadrado. 8. Diseñar un programa que dado una cadena de caracteres con las letras ATCG, cuente cuantas veces aparece la letra T y nos diga si aparece o no la secuencia ATTC. (por ejemplo probar con C1=’ATTACAATTTATATTATTAAAT’ y con la secuencia C2=’ATTACAAACAATATATATATATTACAGATTA’, notar que que C1(k) me da la letra en el lugar k de C1 Determinar cuantas veces se ejecutará un bucle for si escribimos: for n = 7:10 for j = 7:-1:10 for i = 1:10:10 for –10:3:-7 6. Determinar el valor de x al final de los siguientes bucles: a) x= 0; for x = 1:10 x = x+1; end b) x = 0; for x = 1:10 y = x + x; end c) x = 0; for x1 = 1:10 for x2 = x1:10 if x2 >6 break; end x = x + 1; end 6