CAPÍTULO 7 Programación en MATLAB 7.1 Operadores relacionales y lógicos Operadores relaciones ( >, < , <= , >= , = = ,~=) • Cuando se comparan dos números, el resultado es 1 si la comparación es verdadera y 0 si es falsa. • Si se comparan dos arrays (sólo si tienen el mismo tamaño), la comparación se llevará a cabo elemento a elemento, y el resultado será también un array del mismo tamaño que los anteriores. Éste contendrá ceros y unos dependiendo del resultado de la comparación. • Si se compara un número con un array, se comparará el número con todos los elementos del array, de forma que el resultado será un array lógico, con unos y ceros. >> 5>8 ans = 0 >> a=5<10 a= 1 >> y=(6<10)+(7>8)+(5*3= =60/4) y= 2 >> b=[15 6 9 4 11 7 14];c=[8 20 9 2 19 7 10]; >> d=c>=b d= 0 1 1 0 1 1 0 >> b= =c % comprueba si los elementos de b son iguales a los de c. ans = 0 0 1 0 0 1 0 >> b~=c % comprueba si los elementos de b son diferentes de los de c. ans = 1 1 0 1 1 0 1 >> f=b-c>0 % Resta c a b y después comprueba qué elementos son mayores que 0. f= 1 0 0 1 0 0 1 >> A=[2 9 4;-3 5 2;6 7 -1] A= 2 9 4 -3 5 2 6 7 -1 >> B=A<=2 % Comprueba si los elementos de A son menores ó iguales que 2. Asigna % el resultado a la matriz B. B= 1 0 0 1 0 1 0 0 1 • El resultado de una operación relacional con vectores será un vector con unos y ceros, también llamado vector lógico. Estos vectores se pueden utilizar para acceder a los elementos de un array. >> r=[8 12 9 4 23 19 10] r= 8 12 9 4 23 19 10 >> s=r<=10 s= 1 0 1 1 0 0 1 >> t=r(s) % Se utiliza para acceder a los elementos de r. t= 8 9 4 10 >> w=r(r<=10) % Lo anterior en una sóla instrucción. w= 8 9 4 10 >> 3+4<16/2 % + y / se ejecutan primero. ans = 1 >> 3+(4<16)/2 % 4 < 16 se ejecuta primero. El resultado es 1, ya que es verdadero. ans = 3.5000 Operadores lógicos & Y O | ~ NO >> 3&7 % 3 y 7 son números distintos de 0, luego se consideran verdaderos, por lo tanto el resultado de operación lógica es 1. ans = 1 >> a=5|0 % El resultado es 1 porque al menos uno de los dos números es verdadero(distinto de cero). a= 1 >> ~25 % El resultado es 0(falso), ya que 25, al ser un valor distinto de 0, se considera verdadero, y el opuesto es, por tanto falso. ans = 0 >> t=25*((12|0)+(~0)+(0/5)) t= 50 >> t=25*((12&0)+(~0)+(0/5)) t= 25 >> x=[9 3 0 11 0 15];y=[2 0 13 -11 0 4]; >> x&y ans = 1 0 0 1 0 1 1 1 0 1 >> a=x|y a= 1 1 >> ~(x+y) % La salida es un vector con cero en cada posición donde el resultado de x+y sea verdadero(valores distintos de cero), y unos en cada posición donde el resultado de x+y sea falso(elementos iguales a 0). ans = 0 0 0 1 1 0 Orden de precedencia: 1 (la mayor) Paréntesis 2 Exponenciación 3 NO 4 * ,/ 5 +,- 6 op. Relacionales 7 Y 8 O >> x=-2;y=5 y= 5 >> x=-2;y=5; >> -5<x & x<-1 ans = 1 >> ~(y<7) % y<7 se ejecuta primero, dando verdadero(1), por tanto ~1 es falso(0). ans = 0 >> ~y<7 % ~y se ejecuta primero, y es verdadero(1), ya que es un valor distinto de cero, ~1 es 0, y 0<7 es verdadero (1). ans = 1 >> ~((y>=8)|(x<-1)) % y>=8 (falso), y x<-1(verdadero) se ejecutan primero. El operador O se ejecuta después (verdadero). ~ se ejecuta al final, dando como resultado falso(0). ans = 0 >> ~(y>=8)|(x<-1) % y>=8(falso), y x<-1(verdadero) se ejecutan primero. La negación de (y>=8) se ejecuta después (verdadero). El operador O se ejecuta al final, dando como resultado verdadero (1). ans = 1 Funciones lógicas predefinidas: And(A,B) Equivale a A&B Or(A,B) Equivale a A| B Not (A) Equivale a ~A Funciones: all(A), any(A), find(A), find(A>4) 7.2 Sentencias condicionales if-end, if-else-end, if-elseif-else-end Ejemplo:C7salario.m % % % % % (if – end) Un trabajador cobra un determinado salario por hora hasta 40 horas semanales. Además, si hace horas extras(más de 40 horas semanales),esas horas se pagan un 50% más. Escribir un programa(script) que calcule % la paga semanal del trabajador. Nombre fichero: C7salario.m t=input('Introduzca el número de horas trabajadas: '); h=input('Introduzca el salario por hora en euros: '); PagaSemanal=t*h; if (t>40) PagaSemanal=PagaSemanal+(t-40)*0.5*h; end fprintf('La paga semanal del trabajador es de %5.2f Euros',PagaSemanal); >> C7salario Introduzca el número de horas trabajadas: 35 Introduzca el salario por hora en euros: 8 La paga semanal del trabajador es de 280.00 Euros Ejemplo: C7mayor.m (if – else - end) %Realizar un programa(script) que lea dos valores numéricos distintos %X e Y y determine cual es el mayor, dejando el resultado en una %tercera variable llamada Z. % Nombre fichero: C7mayor.m x=input('Introduce primer número: '); y=input('Introduce segundo número: '); if (x>y) z=x; else z=y; end fprintf('El mayor es : %i',z); >> C7mayor Introduce primer número: 2 Introduce segundo número: 3 El mayor es : 3 7.3 La sentencia switch-case Ejemplo C7semana.m %Realizar un programa que nos indique el día de la semana(literal) a %partir de un número(1..7) % Nombre del fichero: C7semana.m dia=input('Introduce un dia(1 al 7): '); switch dia case 1 fprintf('Lunes'); case 2 fprintf('Martes'); case 3 fprintf('Miércoles'); case 4 fprintf('Jueves'); case 5 fprintf('Viernes'); case 6 fprintf('Sábado'); case 7 fprintf('Domingo'); otherwise fprintf('Número incorrecto') end >> C7semana Introduce un dia(1 al 7): 4 Jueves 7.4 Bucles 7.4.1 For-end % Ejemplo C7exponente.m for k=1:3:10 x=k^2 end % 1 valor inicial, 3 incremento, 10 valor final >>C7exponente x= 1 x= 16 x= 49 x= 100 Bucle for-end y las operaciones elemento a elemento: En ciertas ocasiones se puede obtener el mismo resultado aplicando un bucle for-end o realizando operaciones elemento a elemento sobre arrays. Las operaciones elemento a elemento con arrays son una de las características más notables de MATLAB, ya que ofrece una método de cálculo que en ciertas circunstancias evita la utilización de bucles. En general, las operaciones elemento a elemento son más rápidas que los bucles, y se recomiendan en aquellas situaciones en las que se pueden utilizar ambos métodos. %C7ForEnd.m n=input('Introduzca el número de términos:'); S=0; for k=1:n S=S+(-1)^k*k/2^k; end fprintf('El valor(suma) de la serie es:%f\n',S) >> C7ForEnd Introduzca el número de términos:4 El valor(suma) de la serie es:-0.125000 % C7Elemento.m n=input('Introduzca el número de términos:'); S=0; k=1:1:n; S=S+(-1).^k.*k./2.^k; fprintf('El valor(suma) de la serie es:%f\n',sum(S)) >> C7Elemento Introduzca el número de términos:4 El valor(suma) de la serie es:-0.125000 Modificación de los elementos de un vector. Ejemplo C7Exp75.m Sea el vector V=[5, 17,-3,8,0,-1,12,15,20,-6,6,4,-7,16]. Escribir un programa, en forma de fichero script, que multiplique por dos los elementos de V positivos y divisibles por 3 o por 5, y eleve al cubo los elementos negativos pero mayores que -5. V=[5, 17,-3,8,0,-1,12,15,20,-6,6,4,-7,16]; n=length(V); for k=1:n if V(k)>0 && (rem(V(k),3)==0||rem(V(k),5)==0) %rem resto divisón V(k)=2*V(k); elseif V(k)<0&&V(k)>-5 V(k)=V(k)^3; end end >> C7Exp75 V = 10 17 -27 8 0 -1 24 30 40 -6 12 4 -7 16 7.4.2 While – end Ejemplo C7expox.m La función f(x)=ex se puede representar mediante la siguiente serie de Taylor: x e= ∞ ∑ n = 0 x n n! Escribir un programa script en MATLAB que calcule ex utilizando la serie de Taylor indicada anteriormente. El programa debe calcular ex sumando los términos de la serie en un proceso iterativo que se detenga cuando el valor absoluto del último término sumado sea inferior a 0.0001. Utilizar para ello un bucle de tipo while-end, limitando el número de iteraciones a 30.Si en la iteración número 30 el valor del término sumado no es inferior a 0.0001, el programa deberá parar y visualizar un mensaje que diga que se necesitan más de 30 términos. Utilizar el programa para calcular e2,e-4 y e21. x=input('Introduzca el valor x:'); n=1;an=1;S=an; while abs(an)>=0.0001 && n<=30 an=x^n/factorial(n); S=S+an; n=n+1; end if n>=30 disp('Se necesitan más de 30 términos') else fprintf('exp(%f)=%f',x,S) fprintf('\nEl número de términos utilizados es %i',n) end >> C7expox Introduzca el valor x:2 exp(2.000000)=7.389046 El número de términos utilizados es 12 >> C7expox Introduzca el valor x:-4 exp(-4.000000)=0.018307 El número de términos utilizados es 18 >> C7expox Introduzca el valor x:21 Se necesitan más de 30 términos 7.5 Bucles anidados y sentencias condicionales anidadas. Ejemplo C7anidados.m Escribir un programa(fichero script) que cree una matriz de dimensión n x m cuyos elementos sean los que a continuación se detallan. El valor de los elementos de la primera fila deberá ser el número de la columna correspondiente. El valor de los elementos de la primera columna será el número de la fila correspondiente. El valor del resto de los elementos es igual a la suma del valor del elemento que se encuentra por encima de él y el valor que se encuentra a su izquierda. Cuando se ejecuta, el programa debe pedir al usuario que introduzca la dimensión(n y m) de la matriz en cuestión. n=input('Introduzca el número de filas: '); m=input('Introduzca el número de columnas: '); A=[]; for k=1:n for h=1:m if k==1 A(k,h)=h; elseif h==1 A(k,h)=k; else A(k,h)=A(k,h-1)+A(k-1,h); end end end A >> C7anidados Introduzca el número de filas: 3 Introduzca el número de columnas: 4 A= 1 2 3 4 2 4 7 11 3 7 14 25 EJERCICIOS EJERCICIO-1 Escribir un programa que sume dos números si son pares y repita el proceso n veces (ese dato se introducirá por teclado). Los resultados obtenidos se guardarán en un vector. Salida por pantalla >> C7pares Introduce número de repeticiones: 3 Introduce el primer número: 2 Introduce el segundo número: 4 Introduce el primer número: 1 Introduce el segundo número: 2 Introduce el primer número: 4 Introduce el segundo número: 6 En la posición 1 valor 6 En la posición 2 valor 0 En la posición 3 valor 10 EJERCICIO-2 Realizar un programa que escriba en orden descendente los 10 primeros números impares. Salida por pantalla >> C7impares 19 17 15 13 11 9 7 5 3 1 EJERCICIO-3 Realizar un programa que pida por teclado 5 números y escriba el menor y mayor de todos ellos. Salida por pantalla >> C7maymen Introduce número: 2 Introduce número: 1 Introduce número: 3 Introduce número: 6 Introduce número: 7 El número mayor es 7 El número menor es 1 EJERCICIO-4 Generar números enteros de tres en tres desde el 2 hasta un valor menor que 30.Posteriormente calcular la suma de los enteros generados que sean divisibles por 5. Salida por pantalla >> C7divisibles La suma de los números divisibles por 5 es: 25 EJERCICIO-5 Realizar un programa que pida dos números por teclado y nos devuelva el menor. Se realizará una función para obtener el número menor. >> C7menor Introduce primer valor: 3 Introduce segundo valor: 7 El menor es 3 EJERCICIO-6 Realizar un programa que sume dos números si son pares y repita el proceso diez veces. Se creará una función que indique si un número es par ó impar.