108693886 Introduccion a La Programacion Con MATLAB 46 Ejercicios Resueltos Con Varias Soluciones...

download 108693886 Introduccion a La Programacion Con MATLAB 46 Ejercicios Resueltos Con Varias Soluciones Todas Claramente Explicadas

of 20

Transcript of 108693886 Introduccion a La Programacion Con MATLAB 46 Ejercicios Resueltos Con Varias Soluciones...

  • Introduccin a la programacin con MATLAB

    46 ejercicios resueltos con varias soluciones, todas claramente explicadas

    Macario Polo Usaola Profesor Titular de Lenguajes y Sistemas Informticos en la

    Universidad de Castilla-La Mancha

  • 1

    Macario Polo Usaola, 2012 [email protected]

  • 1

    NDICE DE EJERCICIOS Ejercicio 1. Factorial iterativo ........................................................................................................ 1 Ejercicio 2. Nmero combinatorio ............................................................................................... 7 Ejercicio 3. ex por Taylor .................................................................................................................. 9 Ejercicio 4. seno(x) por Taylor .................................................................................................... 13 Ejercicio 5. Factorial recursivo ................................................................................................... 14 Ejercicio 6. Fibonacci ...................................................................................................................... 16 Ejercicio 7. La divina proporcin ............................................................................................... 19 Ejercicio 8. Conversin de entero a binario .......................................................................... 20 Ejercicio 9. Contador de apariciones ....................................................................................... 25 Ejercicio 10. Producto escalar .................................................................................................... 28 Ejercicio 11. Fibonacci en un vector ........................................................................................ 31 Ejercicio 12. Distancia al primero ............................................................................................. 33 Ejercicio 13. Nmeros primos .................................................................................................... 41 Ejercicio 14. Vector con los n primeros nmeros primos ............................................... 44 Ejercicio 15. Vector con los n primeros nmeros primos ordenados de mayor a menor 46 Ejercicio 16. Calcular el ensimo nmero primo ................................................................ 48 Ejercicio 17. Contar nmeros distintos en un vector ....................................................... 49 Ejercicio 18. Descomposicin en factores primos (I) ....................................................... 50 Ejercicio 19. Descomposicin en factores primos (II) ...................................................... 52 Ejercicio 20. Mximo comn divisor ........................................................................................ 54 Ejercicio 21. Tablero de ajedrez ................................................................................................. 56 Ejercicio 22. Alfil ............................................................................................................................... 57 Ejercicio 23. El caballo de ajedrez ............................................................................................. 61 Ejercicio 24. Matriz identidad ..................................................................................................... 68 Ejercicio 25. Diagonal principal ................................................................................................. 70 Ejercicio 26. Traza de una matriz .............................................................................................. 73 Ejercicio 27. Unos y ceros alternados ...................................................................................... 75

  • Macario Polo Usaola

    2

    Ejercicio 28. Matriz de Vandermonde ..................................................................................... 81 Ejercicio 29. Matriz de Fibonacci ............................................................................................... 83 Ejercicio 30. Producto de matrices. .......................................................................................... 85 Ejercicio 31. Tringulo de Tartaglia ......................................................................................... 87 Ejercicio 32. Tringulo equiltero ............................................................................................. 90 Ejercicio 33. Matriz triangular superior ................................................................................. 95 Ejercicio 34. Diagonales que se incrementan (I) ................................................................ 99 Ejercicio 35. Diagonales que se incrementan (II) ............................................................. 102 Ejercicio 36. Nmeros ordenados ........................................................................................... 103 Ejercicio 37. Nmeros ordenados descendentemente .................................................. 105 Ejercicio 38. Zigzag ........................................................................................................................ 106 Ejercicio 39. Distancias ................................................................................................................ 107 Ejercicio 40. Distancia en letras ............................................................................................... 111 Ejercicio 41. Buscador de cadenas .......................................................................................... 113 Ejercicio 42. Deteccin de palndromos ............................................................................... 115 Ejercicio 43. El monte ................................................................................................................... 124 Ejercicio 44. Clculo de pi () ................................................................................................... 129 Ejercicio 45. La salida del laberinto ....................................................................................... 133 Ejercicio 46. Bsqueda binaria ................................................................................................. 137

  • 46 ejercicios resueltos de MATLAB

    1

    Ejercicio 1. Factorial iterativo

    Realizar una funcin que, recibiendo como argumento de entrada un nmero entero n, devuelva el factorial de dicho nmero.

    Si no se recibiese ningn argumento de entrada se deber devolver un -1 y mostrar un mensaje de aviso por pantalla. Si n fuera menor que cero se deber devolver tambin un -1 y mostrar un mensaje de aviso por pantalla. Si n no fuera entero se deber redondear hacia + . El factorial de un nmero natural n es el producto de todos los nmeros naturales desde 1 hasta ese nmero n. El factorial de 5, por ejemplo, es 12345=120. Adems, el factorial de 0 es 1. La funcin factorial se representa con una admiracin: n!=n(n-1)321.

    Solucin 1. En una primera solucin supondremos que el nmero que se pasa como argumento a la funcin es natural y positivo. Para computar el resultado necesitamos nicamente un bucle for que vaya desde 1 hasta n de 1 en 1 (Funcin 1): a la funcin la hemos llamado factorial1 y toma un argumento1 n. function result = factorial1( n ) result=1; for i=1:1:n result=result*i; end end Funcin 1. Un factorial sencillo, sin comprobacin de parmetros y con un for que incrementa El bucle for i=1:1:n inicializa la variable contador i a 1 y la va incrementando de 1 en 1 hasta n (el valor del argumento pasado). En el cuerpo del bucle se utiliza una variable acumuladora result (puede llamarse de cualquier manera, pero utilizaremos habitualmente result para hacer referencia al resultado que debe devolver la funcin) en la que iremos guardando el resultado de calcular el valor anterior de result multiplicado por el valor de i. Con objeto de que result vaya almacenando correctamente los valores, es necesario inicializarla a 1 antes de empezar el bucle. La Tabla 1 muestra una traza de ejecucin de la funcin cuando pasamos 5 como valor del parmetro n: al entrar a la funcin, ni result ni i tienen valor, y lo nico que est definido es el parmetro n. En la asignacin result=1 que hay antes del bucle, result toma el valor 1 pero i sigue sin estar definida. Al entrar al bucle por primera vez, result sigue valiendo 1 e i toma ya valor 1. 1 argumento y parmetro significan lo mismo. Utilizaremos ambas palabras indistintamente.

  • Macario Polo Usaola

    2

    En la segunda vuelta al bucle, i se ha incrementado en 1, con lo que vale 2, y a result le asignamos el valor que tena (1) multiplicado por el valor de i: la aparicin de la palabra result en el lado derecho de la instruccin result=result*i hace referencia al valor actual de result; la aparicin de result en el lado izquierdo hace referencia al valor que le vamos a asignar. Se contina de esta manera, haciendo ese cmputo, hasta que i alcance el valor 5, que es el valor de n que pasamos como parmetro y que es la condicin de parada en el bucle for: for i=1:1:n Comentarios n result i Al entrar a la funcin 5 Al ejecutar result=1 5 1 La primera vez que entramos al bucle 5 result=result*i result=1*1=1 1 Segunda vuelta al bucle 5 result=result*i result=1*2=2 2 5 result=2*3=6 3 5 result=6*4=24 4 5 result=24*5=120 5

    Tabla 1 Si ejecutamos la funcin desde la lnea de comando, obtenemos esto: >> factorial1(5) ans = 120 Figura 1 La palabra ans que escribe MATLAB es la answer (la respuesta) al clculo que le hemos solicitado. Muestra un 120 porque, en la cabecera de la funcin asignbamos a result el resultado de la funcin, y precisamente es result la variable en la que vamos, iteracin a iteracin, almacenando el resultado que deseamos.

    function result = factorial1( n )

    Solucin 2. Otra forma de implementar exactamente lo mismo es utilizar tambin un bucle for, pero que vaya desde n hasta 1, de -1 en -1. Observa (Funcin 2) que el bucle for ha cambiado: function result = factorial2( n ) result=1; for i=n:-1:1 result=result*i; end end Funcin 2. Un factorial sencillo, sin comprobacin de parmetros y con un for que decrementa

  • 46 ejercicios resueltos de MATLAB

    3

    Solucin 3. En el enunciado del problema nos piden que, si no pasamos ningn argumento, se muestre un mensaje de aviso por pantalla. Ahora mismo se muestra el mensaje de error por defecto de MATLAB, que es bastante feo: >> factorial2() ??? Input argument "n" is undefined. Error in ==> factorial2 at 3 for i=n:-1:1 Figura 2 Modificaremos ligeramente la funcin para que se compruebe que se pasan argumentos y que, en caso de que no sea as, se muestre un mensaje de error personalizado, la funcin devuelva 1 y el programa termine: en la Funcin 3 hemos aadido unas lneas de cdigo en las que usamos la palabra reservada nargin (que indica el nmero de valores pasados a la funcin como parmetros) para comprobar que, si es 0, el resultado de la funcin sea -1 (nos lo pide el enunciado), se muestre un mensaje de error (uso de la funcin disp de MATLAB) y el programa termine (uso de return). function result = factorial2( n ) if (nargin==0) result=-1; disp('Debes dar un argumento a la funcin'); return; end result=1; for i=n:-1:1 result=result*i; end end Funcin 3. El factorial con comprobacin del nmero de parmetros Ahora, el resultado de llamar a la funcin sin argumentos es: >> factorial2() Debes dar un argumento a la funcin ans = -1 Figura 3

    Solucin 4. El enunciado tambin nos dice que, si n es menor que cero, se d un mensaje de aviso y se devuelva tambin -1. Una forma de hacerlo es aadir otro if despus del if que ya aadimos a la Funcin 3, de manera que el cdigo quede como en la Funcin 4:

  • Macario Polo Usaola

    4

    function result = factorial2( n ) if (nargin==0) result=-1; disp('Debes dar un argumento a la funcin'); return; end if (n> factorial2(-5) El parmetro debe ser positivo ans = -1 Figura 4

    Solucin 5. Otra forma de conseguir lo mismo que en la solucin anterior es colocar las dos comprobaciones (existencia de un argumento y que ste sea positivo) en un solo if: en la Funcin 5 unimos ambas condiciones con un or (smbolo |, la barra vertical), de manera que si el nmero de argumentos es 0 o n es menor que cero, la funcin devuelva -1, se muestre un mensaje de error y se termine el clculo.

  • 46 ejercicios resueltos de MATLAB

    5

    function result = factorial2( n ) if (nargin==0 | n

  • Macario Polo Usaola

    6

    >> factorial2(4.5) ans = 120 >> factorial(5) ans = 120 Figura 5

  • 46 ejercicios resueltos de MATLAB

    7

    Ejercicio 2. Nmero combinatorio

    Escribir una funcin que calcule el nmero combinatorio !! , sabiendo que n>=m, !! = !! = ! y que !! = !!!! !!! !. Los valores de n y m sern argumentos de entrada y el resultado del clculo se devolver como argumento de salida.

    Solucin 1. Escribiremos primero una solucin algo larga, pero en la que se realiza todo el clculo: en los primeros tres if (marcados en amarillo) hacemos una comprobacin de los argumentos. En el siguiente comprobamos si m es 0 o si n==m, con lo que debemos devolver 1 como resultado. En los siguientes tres bloques calculamos los factoriales de n, m y de n-m usando tres bucles for como los que ya utilizamos en la primera solucin a la funcin factorial (pgina 1). Estos factoriales los guardamos en tres variables llamadas factorialN, factorialM y factorialNmenosM. Finalmente, asignamos a la variable de resultado (result) el clculo solicitado. function result = numeroCombinatorio1( n, m ) if (nargin~=2) disp('Se necesitan dos argumentos'); return; end if (n

  • Macario Polo Usaola

    8

    end result=factorialN/(factorialM*factorialNmenosM); end Funcin 7

    Solucin 2. En una solucin menos complicada podemos utilizar cualquiera de las funciones factorial que escribimos como soluciones del ejercicio 1. Basta con escribir una nueva funcin en la que las llamamos: function result = numeroCombinatorio2( n, m ) result=factorial1(n)/(factorial1(m)*factorial1(n-m)) end Funcin 8

    Solucin 3. En las dos soluciones anteriores repetimos clculos. Supongamos que nos piden calcular !"! : calculamos primero factorialN=10987654321 y luego computamos factorialM=54321, con lo que estamos repitiendo parte del clculo del factorialN. Si debiramos hacer este clculo a mano, probablemente calcularamos primero el factorial de m y luego, al calcular el de n, nos detendramos al llegar al valor de m. Es decir, que factorialN=109876factorialM. Esto es lo que hacemos en esta solucin (Funcin 9), que requiere menos tiempo de cmputo: en la primera lnea se calcula el factorial de m; luego, en el bucle for resaltado en amarillo, vamos guardando en factorialN el valor de multiplicar i desde n hasta el valor de m+1. En la instruccin siguiente, multiplicamos el valor de factorialN por el valor de factorialM que hemos calculado antes, de manera que nos ahorramos unas cuantas vueltas de bucle. Finalmente calculamos (n-m)! por el mtodo tradicional y calculamos el resultado final del nmero combinatorio. Se han omitido las comprobaciones de argumentos para facilitar la lectura del cdigo. function result = numeroCombinatorio3( n, m ) factorialM=factorial1(m); factorialN=1; for i=n:-1:m+1 factorialN=factorialN*i; end factorialN=factorialN*factorialM; factorialNmenosM=factorial1(n-m); result=factorialN/(factorialM*factorialNmenosM); end Funcin 9

  • 46 ejercicios resueltos de MATLAB

    9

    Ejercicio 3. ex por Taylor

    Realizar una funcin que recibiendo como argumento de entrada un nmero real x devuelva el valor de la exponencial de dicho nmero, que deber calcularse mediante su serie de Taylor truncada en n de tal forma que el error absoluto entre la serie en el trmino n-1 y n sea menor de 10-7. La serie de Taylor de la exponencial viene dada por la expresin:

    !! = !!!! ,!!!!! Solucin 1. Antes de implementar la funcin es conveniente plantear un ejemplo para ver cmo podemos abordar la solucin. Al programar funciones de clculo, en muchos casos, debemos intentar imitar nuestro propio razonamiento. Supongamos que deseamos calcular e5 (cuyo valor es 148,4131591025764) mediante la aproximacin de Taylor:

    !! = !!!! = !!!! +!!!! !!!! + !!!! + !!!! + Pararemos cuando la diferencia entre el trmino n-1 y el n sea menor que 0.0000001. Para una primera solucin no tendremos en cuenta esta consideracin del error absoluto, y lo que haremos ser iterar, por ejemplo, 100 veces. Es decir: !! = !!!! = !!!! +!""!!! !!!! + !!!! + !!!! ++ !!!!!! + !!""!""! Una forma de implementar esta solucin es la siguiente:

    function result = exponencialPorTaylor1( x ) result=0; for n=0:1:100 result=result+(x^n)/factorial(n); end end Funcin 10 El resultado de calcular exponencialPorTaylor1(5) es: >> exponencialPorTaylor1(5) ans = 148.4132 Figura 6

  • Macario Polo Usaola

    10

    Solucin 2. Podemos escribir una solucin parecida a la anterior, pero utilizando un while en lugar de un for. Diremos entonces que mientras n (que es la variable contador del bucle) sea menor o igual a 100, realice el clculo: function result = exponencialPorTaylor2( x ) result=0; n=0; while (nexponencialPorTaylor3(5)

  • 46 ejercicios resueltos de MATLAB

    11

    Inf -5 -12.5 -20.8333333333333 -26.0416666666667 -26.0416666666667 -21.7013888888889 -15.5009920634921 -9.68812003968253 -5.38228891093473 -2.69114445546737 -1.2232474797579 -0.509686449899135 -0.196033249961204 -0.070011874986136 -0.0233372916620453 -0.00729290364438384 -0.00214497166010119 -0.000595825461147115 -0.000156796173996554 -3.91990434991385e-05 -9.33310559503298e-06 -2.12116034958854e-06 -4.61121828720934e-07 -9.60670547556219e-08 0 0 ... 0 ans= 148.413159078837 Figura 7 La larga lista de nmeros que muestra (hemos omitido bastantes ceros al final) se corresponde con los valores de error calculados en cada iteracin del bucle while.

    Solucin 4. Para cumplir con el enunciado, el cmputo debe detenerse en el momento en que el valor absoluto del error sea menor que 10-7. Como lo vamos calculando en cada vuelta del bucle, basta con que modifiquemos la condicin de parada del while para que, en lugar de dar 100 vueltas fijas, est dando vueltas mientras el valor absoluto de error sea mayor o igual a 10-7. Es decir, que modificamos el cdigo para que quede como sigue:

  • Macario Polo Usaola

    12

    function result = exponencialPorTaylor4( x ) result=0; error=Inf(); ultimoResultado=Inf(); n=0; while (abs(error)>=10e-7) result=result+(x^n)/factorial(n); error=ultimoResultado-result; ultimoResultado=result; n=n+1; end end Funcin 13

  • 46 ejercicios resueltos de MATLAB

    13

    Ejercicio 4. seno(x) por Taylor

    Escribir una funcin que recibiendo como argumento de entrada un nmero real x devuelva el seno de dicho nmero, que deber calcularse mediante su serie de Taylor truncada en n de tal forma que el error absoluto entre la serie en el trmino n-1 y n sea menor de 10e-7. La serie de Taylor del seno viene dada por la expresin:

    !"#$ ! = (!)!!"+ ! !!!"!!,!!!!! Solucin 1. La solucin a este ejercicio es muy parecida a la del anterior: ya que no sabemos exactamente cuntas iteraciones debemos hacer, sino slo la condicin de parada, lo haremos, como antes, con un bucle while. La condicin de parada ser la misma, y la forma de clculo tambin muy similar. Cambiar nicamente la frmula de asignacin del resultado.

    function result = senoTaylor(x) result=0; error=Inf(); resultAnterior=Inf(); n=0; while (abs(error)>=10e-7) result=result+((-1)^n/factorial(2*n+1))*(x^(2*n+1)); error=abs(result-resultAnterior); n=n+1; resultAnterior=result; end end Funcin 14

  • Macario Polo Usaola

    14

    Ejercicio 5. Factorial recursivo

    Escribir una funcin que calcule el factorial de manera recursiva.

    Solucin 1. Una funcin recursiva es una funcin que, en su implementacin, contiene una llamada a s misma. La funcin factorial se describe recursivamente de forma muy natural, ya que: n!=n(n-1)! Es decir, el factorial de n es n multiplicado por el factorial de n-1. En efecto, 5!=54321 o, lo que es lo mismo, 5!=54!, ya que 4!=4321. En las funciones debe haber siempre, al menos, un caso base, que haga que las sucesivas llamadas a la funcin se detengan. En el caso del factorial, el caso base se alcanza cuando n=0, ya que 0!=1. En la Funcin 15 preguntamos que si el argumento que se est pasando es 0: en caso afirmativo, asignamos a result el valor 1 y la llamada a la funcin termina; en caso negativo, asignamos a result el resultado de multiplicar n por el factorial de n-

    1, tal y como hacamos arriba al escribir n!=n(n-1)! function result = factorialRecursivo( n ) if (n==0) result=1; return else result=n*factorialRecursivo(n-1); return end end Funcin 15 Supongamos que deseamos calcular recursivamente el factorial de 5. La siguiente tabla muestra una traza de lo que va sucediendo al escribir en la lnea de comando de MATLAB factorialRecursivo(5): Comentarios n result 1 llamada a la funcin. Se ejecuta factorialRecursivo(5) 5 Como n no es 0, se entra al else 5 result=5*factorialRecursivo(4) 2 llamada. Se ejecuta factorialRecursivo(4). n toma ahora el valor 4 4 Como n no es 0, se entra al else 4 result=4* factorialRecursivo(3) 3 llamada. Se ejecuta factorialRecursivo(3). n entra valiendo 3 3

  • 46 ejercicios resueltos de MATLAB

    15

    Comentarios n result Como n no es 0, se entra al else 3 result=3* factorialRecursivo(2) 4 llamada. Se ejecuta factorialRecursivo(2). El valor de n es 2 2 Como n no es 0, se entra al else 2 result=2*factorialRecursivo(1) 5 llamada. Se ejecuta factorialRecursivo(1). n llega valiendo 1 1 Como n no es 0, se entra al else 1 result=1*factorialRecursivo(0) 6 llamada. Se ejecuta factorialRecursivo(0). n vale 0 0 n es ahora 0, por lo que es cierta la condicin del if (n==0) 0 result=1

    En este punto se ha alcanzado el caso base, por lo que no hay ms llamadas recursivas. Ahora, el valor calculado en la 6 llamada se utiliza para calcular el valor

    de la 5 llamada, que a su vez se utiliza para calcular el de la 4, etctera. Regreso a la 5 llamada. 1 result=1*factorialRecursivo(0)=1*1=1 Regreso a la 4 llamada. 2 result=2*factorialRecursivo(1)=1*2=1 Regreso a la 3 llamada. 3 result=3*factorialRecursivo(2)=3*2=6 Regreso a la 2 llamada. 4 result=4*factorialRecursivo(3)=4*6=24 Regreso a la 1 llamada. 5 result=5*factorialRecursivo(5)=5*24=120 Tabla 2