Buenas tardes y bienvenidos a la tutoría online. Es la primera tutoría del tema 4 de la asignatura de herramientas informáticas para matemáticas. Este tema en concreto se titula Programación orientada a la resolución de problemas. Vamos a ver fundamentalmente un enfoque orientado a matemáticas, sobre las utilidades de programación que nos ofrece las dos herramientas que estamos estudiando en esta asignatura, que son ExitLab, una herramienta de tipo numérico y el Máxima, que también resuelve problemas numéricos pero está orientada a la representación algebraica de los resultados. Como es mi primera tutoría durante este curso, me presentaré. Mi nombre es Jorge Riera, como veis por ahí. A ver si puedo poner una flechita, efectivamente. Como veis, soy profesor tutorial del Centro Asociado de Tenerife, aunque mi ocupación principal es de... Soy profesor titular de universidad en la Universidad de La Laguna, en el área de Ciencia de la Computación e Inteligencia Artificial. Así que mis clases, mi docencia, van sobre todo en informática, aunque en algoritmia, en teoría de la computación y todo esto. En investigación, sobre todo en matemáticas y en investigación operativa. Y después también, a veces, impartimos cursos en primero en matemáticas, una asignatura que se llama, aquí la llamamos Iniciación a la Computación Científica, que tiene más o menos el mismo propósito que esta que estamos viendo. Bueno, como podéis ver a continuación, bueno, este es el primer... Bueno, este se suponía que era la página de presentación. Vamos allá. Efectivamente. Bueno, pues el tema este, el tema 4, pues se divide en 5 epígrafes. Que son estos que tenéis aquí. Me imagino que se ven bien. Y todos ellos los vamos a abordar en 4 sesiones. Pues una sesión para cada uno de los epígrafes, a excepción del 4 y 5, que la vamos a englobar en la última sesión. Bueno, en la primera tutoría, que es esta, vamos a abordar el tema 4.1. O sea, obviamente no podemos abordarlo de forma exhaustiva, porque, bueno, tiene mucho contenido y aquí intentaremos resumir. Ese es el tema que vamos a ver. Y, bueno, vamos a abordar eso. El concepto de algoritmo, función, programa y librería. Bueno, casi... No sé si veremos el concepto. El concepto de librería. Pero, entre otras cosas, porque suele ser una traducción de la palabra biblioteca en inglés. Y todo esto ya, bueno, en este caso se la han traducido como librería. Y, bueno, lo que vamos a hacer es eso. Pues intentar resolver problemas. Esto de qué es esto de la programación orientada a resolución de problemas. Pues sobre todo, os lo podéis imaginar, es un redundante. Porque, obviamente, lo que hacemos... Obviamente, la programación, mediante el diseño de algoritmos, es resolver problemas. Así que son los algoritmos los que resuelven los problemas. Vamos a ver qué es esto. Pero antes de empezar, pues vamos a contextualizar un poco. Como sois matemáticos y, bueno, vais a ser matemáticos o matemáticas, pues vamos a intentar darle un enfoque a esto que vamos a ver desde la perspectiva de las matemáticas. Entonces, rápidamente, ¿qué es lo que vamos a hacer aquí? Vamos a resolver problemas. Los problemas, pues se nos plantean... Mira, este que tenéis aquí se trata de... Vamos, están construyendo... Estamos trabajando con el Instituto Astrofísico de Canarias. Están construyendo un instrumento. Sé que veis ahí. Finalmente tendrá 12 brazos robots. Y lo que quieren hacer ellos es... Bueno, ese instrumento, pues se pone en un telescopio muy grande que se llama Gran Telescopio de Canarias, que está en la isla de La Palma. Y lo que hace es fundamentalmente eso. Esos brazos robots, pues lo que pueden hacer es... Cada uno de ellos puede observar un objeto diferente. Estudian en el espectro infrarrojo de objetos diferentes de forma simultánea. Cada uno de los 12 brazos va por su lado y va apuntando cada uno de ellos. Se tiene que mover y, bueno, pues así van observándolos. Entonces nos proponen un problema. Un problema del mundo real que consiste... Nos dicen, mira, el tiempo de telescopio cuesta carísimo. Entonces lo que queremos hacer es observar el número máximo de objetos. Por ejemplo, tenemos 1000 objetos y queremos observarlos lo más rápidamente posible, así que debemos optimizar el movimiento de los brazos robots. Entonces, ¿qué es lo que hacemos nosotros? ¿Y qué es lo que vais a hacer vosotros? Pues lo que vamos a hacer es establecer un modelo. Es decir, vamos a describir el problema. En este caso, pues en forma de estructuras discretas. Tenemos un problema de optimización. Esto que veis aquí es un fragmento de un... De un problema de optimización matemática. Un problema basado en programación matemática. En programación lineal entera vista. Bueno, programación lineal entera. Y bueno, una vez que tenemos el problema modelizado lo que vamos a hacer es establecer el algoritmo. Pero lo que quiero que tengáis claro es que el algoritmo en realidad va directamente... Pues estrechamente ligado a lo que es el modelo matemático. De manera que sin matemáticas no hay algoritmos. Y no hay método de resolución. Bueno, seguro que vosotros sabéis que los buenos algoritmos se basan en buenos modelos matemáticos. Por ejemplo, el algoritmo que encripta vuestros WhatsApps. O por ejemplo, ese algoritmo que en Google nos dice cómo llegar a un sitio lo más rápidamente posible. O el que nos dice en Facebook, por ejemplo, qué debemos comprar en Amazon. O incluso ese, y esto es verdad, ese terrible de las líneas aéreas que cada vez que vas a consultar un precio de un avión pues está más caro. Y sobre todo si es una línea irlandesa de la que no quiero mencionar su nombre. Entonces, todo esto son modelos matemáticos que se traducen en algoritmos. Nosotros para resolver esos problemas, para darles solución, vamos a tener dos herramientas muy potentes que nos ofrecen mucha... Vamos, nos permiten resolver problemas de alto nivel. Lo que sucede es que, bueno, en algunas cosas vamos a encontrar alguna serie de... Vamos a encontrar carencias. Y esas cosas para las cuales no podemos resolver exactamente. Y con las herramientas que vienen de base pues vamos a tener que implementar nuestros propios algoritmos, nuestro método de resolución basándonos en instrumentos, en estructuras que nos proporciona... Eso es lo que vamos a hacer fundamentalmente. En eso se basa esto de la aprobación y la resolución del problema. Vamos a ver ciertas herramientas que nos van a permitir mejorar la potencialidad de nuestras herramientas. Es decir, la I máxima. Bueno, vamos a ver. Pasamos aquí. Vamos a ver en qué nos vamos a... Bueno, la bibliografía o la documentación en la cual podéis utilizar para prepararos esta parte sin dudas es el tema cuatro de los apuntes que proporciona el equipo docente. Vamos, eso es sin duda es la referencia que vais a utilizar. Pero bueno, podéis encontrar otras referencias. Como son los dos apuntes estos que tenéis aquí de 2010, de C-Lab, la típica Introduction to C-Lab y otro, Primeros Pasos en Máxima que es también un clásico. Aunque también tengo que confesaros que cada vez que tengo una duda o quiero saber cómo se resuelve algo de forma rápida imagino que hago lo mismo que hacéis vosotros. Voy a Google y lo busco y siempre hay alguien en un foro en el cual pues resuelvo. Así que vamos a comenzar con el concepto de función. Es algo que nos va a permitir enriquecer la funcionalidad de ambas herramientas de C-Lab y Máxima y bueno, vamos a ver cómo. Como podéis ver aquí las funciones que la hemos representado por esta caja que tenemos aquí pues son una serie de identidades que nos permiten combinar funciones de base, funciones básicas de las que ya forman parte del C-Lab para obtener resultados más complejos. Podemos ver una de estas funciones como una caja negra en la que tiene una serie de parámetros de entrada que son los que veis aquí y una serie de parámetros de salida. Por ejemplo, en determinadas en el caso del C-Lab por ejemplo nos permiten varios parámetros de entrada y vamos a obtener también varios parámetros de salida. En el caso de Máxima no es exactamente así lo que sucede es que podemos permitir tener como salida cualquier cosa y podemos tener como salida una lista de cosas o una matriz o lo que sea de manera que se puede simular fácilmente el tener varias cosas de salida varios elementos de salida no vamos a tener ningún problema ambos son comparables. Así que bueno en ese caso son parecidos. Entonces lo que vamos a ver es para cada una de estas herramientas cómo mejorar la funcionalidad, cómo resolver cuestiones un poquito más complejas utilizando esto de las funciones. Después vamos a ver un paso más allá pero bueno, así que vamos a enfrentarnos con nuestras primeras funciones. Como podéis ver aquí tenemos definidas dos funciones muy sencillitas yo sospecho que son dos funciones que ya tenéis en los apuntes esta es de las pocas cosas que vamos a ver de los apuntes originales porque mi idea es daros un enfoque un poco diferente para que no sea exactamente lo mismo que tenéis ahí escrito. Como podéis ver tenemos dos funciones una función de x que devuelve un valor son funciones nos van a devolver ambas f y g dos valores reales y tienen un único parámetro la función f, la función g y a continuación se describe lo que hace, lo que devuelve cada una de ellas en términos de los parámetros de entrada. Aquí tenemos por ejemplo 2x más 2 o 1 menos x cuadrado más 1 Lo que vamos a ver es el enfoque que le vamos a hacer a la sintaxis que va a tener en Ercilla como podéis ver me he quitado unas cuantas flechas como podéis ver vamos a empezar por cierto por la definición de la función g, que la veo más clara como podéis ver aquí tenemos dos funciones la función f y la g la f está definida en línea y la g está definida en bloque. A mi me gusta más la definición en bloque porque la veo mucho más clarito vamos cualquier código cualquier conjunto de funciones que tengáis hechas por cualquier otra persona probablemente la entendáis mejor si está definida en bloque, si la ponéis en línea pues a lo mejor hay más información en una línea. Vamos a centrarnos en la sintaxis y como podéis ver tenemos por un lado la delimitación de la función. La función viene delimitada por las dos palabras function o infunction final de función y en una primera parte acompañando a la palabra clave function vamos a tener el nombre de nuestra función en este caso estoy en el bloque en este caso sería el de arriba la función f así como los parámetros de entrada aquí en este caso sólo tenemos un solo parámetro y aquí tenemos otro parámetro y el valor devuelto o el identificador sobre el cual vamos a devolver el resultado de esa función lo que nos va a devolver esa función de manera que esto es la primera parte de nuestra función tenemos ya hemos definido perfectamente esa función en SCILAB bueno por cierto cuando veáis esta etiqueta significa que el código si lo he puesto bien es de SCILAB bien pues en SCILAB pues se admiten igual que máxima por cierto varios parámetros de entrada y también varios parámetros de salida justo después de la definición de la función aquí seguida de una coma y aquí en la parte justo después la línea siguiente a la definición de la función vamos a tener el cuerpo de la función el cuerpo de la función puede ser una o más instrucciones bueno pues que van a definir lo que vamos a devolver en este caso es muy sencillito simplemente vamos a reproducir lo que pone nuestras dos funciones y finalmente tenemos el eso como habíamos indicado al principio el identificador de final de función así de sencillo vamos no es muy complicada esta sintaxis le digo aquí se contrasta la sintaxis del bloque frente a la sintaxis en línea y en mi caso prefiero bueno no sé que sea sencillo como en este caso pero si vamos a trabajar con funciones complejas sin duda utilizar bloques es mucho más clarito aquí tenéis una manera de mostrar los datos por pantalla pero bueno lo podéis hacer de la manera que vosotros queráis aquí tenemos por ejemplo la evaluación aquí se invoca la función como podéis ver fd3 o fd4 se evalúa la función con el parametro 3 y 4 o incluso aquí la función g se evalúa con el resultado que nos da la evaluación de la función f con el valor 3 ahora mismo no tengo aquí se me ha olvidado hacer una captura de pantalla del resultado pero cuando veamos el equivalente en máxima pues ya veréis que no vamos que es muy sencillo es el mismo resultado vamos a pasar a otro ejemplito muy sencillo que es por ejemplo la función seno de x aquí tenemos esta la función seno de x por cierto es una función al cual le pasamos un x un real y uno se vuelve un real en concreto le pasamos en x bueno la función es trigonométrica funciona en radiales bueno pues tenemos aquí lo mismo definición de la función cuerpo de la función y el límite final de la función en este caso es muy sencilla para la cual no nos hace falta pues eso hacer una función porque ya existe la función seno directamente pero bueno aquí es una excusa simplemente para ver un ejemplo aquí definimos pues el definimos un vector entre 0 y 2 pi para representar esta función saltando de 0 1 y finalmente bueno pues haciendo con el plot 2d este pues vamos a poder funcionar vamos a poder mostrar la función esto pues me trae a colación lo que pasa es que lo vamos a ver un poquito más tarde un comentario os invito que visitéis el foro del tema 4 en este caso ha habido una intervención la última intervención que ha habido de Óscar y Miguel Ángel si no me equivoco José María bueno ahora mismo no recuerdo la última intervención que hubo es muy interesante porque bueno hacía referencia a uno de los problemas que os proponen que resolváis en los apuntes y y bueno hacía referencia al tipo de dato que devuelve o con el que se computa había una especie de confusión entre si una función real iba a poder como se llama a un vector o no entonces la verdad es que los dos alumnos que han intervenido han resuelto muy bien el problema y le han dado soluciones diferentes y que son aceptables vamos a ver aquí en este caso vamos a centrarnos en máxima como podéis ver tenemos las mismas dos funciones la sintaxis en este caso es un poquito más sencilla aunque también tengo que decir que al menos en esta manera es un poquito más limitada pero la sintaxis bueno es un pelín como podéis ver aquí se define la función directamente con los aspectos de sintaxis que tiene el máxima en este caso dos puntos igual y bueno podéis ver eso que definimos la función casi de la misma manera que antes pero en este caso en una sola línea y podéis ver aquí en este caso si que vemos la evaluación con la salida la evaluación de la función una evaluación numérica primero f de 3 f de 5 en este caso como veíamos antes g de f de 3 pero bueno lo que a mi me encanta del máxima es la evaluación simbólica aquí le hemos pasado x y nos va a dar el resultado simbólico de la evaluación g de f de x muy bien perfecto bueno pues vamos a complicar un poquito más la cosa vamos a intentar pues resolver funciones un poquito más sencillas el ejemplo que voy a poner a continuación es un poco artificial en cuanto a su resolución porque quería forzar la utilización de dos parámetros de salida de doble parámetro de salida así que en este caso es el típico problema de la rotación de un punto aquí está enfocado en esta imagen que descargué está enfocado como la rotación de los ejes pero bueno dado un punto lo que queremos hacer es aplicarle una matriz de transformación en este caso pues una matriz de rotación tenemos aquí el punto x e y le aplicamos la matriz de rotación y vamos a obtener pues el punto transformado x prima y prima y esto en realidad lo podemos hacer de manera muy sencilla pero vamos a ha sido una excusa simplemente para poder utilizar pues pues eso varios parámetros de salida y aquí tenemos aquí tenemos el enfoque que le damos con el scilla como podéis ver esto es muy parecido a antes podéis observar que tenemos la delimitación de la función ahora vamos a trabajar con bloques porque es mucho más visual y después en la primera línea en la definición de la función tenemos en este caso pues el nombre de la función los parámetros de entrada que los voy a dar separados x e y así como el ángulo de rotación fi y después aquí y esto es lo que decía pues eso tenemos la excusa de utilizar dos parámetros dos valores de salida xr e ir que se supone que son los valores de x e y rotados así que lo primero que hacemos bueno lo que encontramos en el cuerpo de la función primero es el cálculo del producto rotado como podéis ver hemos definido aquí la matriz de rotación y hemos transformado nuestros parámetros de entrada pues en una matriz columna como esta que tenemos aquí para poder llevar a cabo el producto la transformación este resultado lo hemos almacenado en ar y lo que hemos hecho es extraer de esa columna pues los elementos para dárselos a las variables de salida los valores de salida xr e ir y entonces bueno pues ya con esto hemos hecho hemos hecho una hemos tenido una excusa para definir una función en la cual se utilizan dos valores de salida aquí tenéis algunos ejemplos de como se llama de evaluación de esa función aquí rota lo que hacemos es que le vamos a ver rotamos menos 90 grados en el primer caso rotamos aquí 90 grados en el segundo caso y en este caso pues rotamos 180 grados se supone que imprime el resultado de esto y otra vez pues he vuelto a omitir la impresión de los resultados bueno vamos a ver en el otro caso veis que en realidad esto es una excusa para utilizar estos parámetros para que lo veáis una ilustración se podría haber puesto cualquier otro mi compañero el año pasado puso el de no me acuerdo radio y tenía dos parámetros también era un poco así rebuscado y bien aquí tenemos otro enfoque en este caso es la misma función la hemos llamado rota2 lo que pasa es que en este caso el punto lo vamos a pasar como una matriz fila de dos elementos de dos columnas esa matriz y el resultado de la rotación lo vamos a pasar como una matriz fila es un poco artificial esto nos ha permitido simplemente hacer alguna que otra operación más como podéis ver aquí pues lo que hacemos es que calculamos el punto rotado con haciendo un producto con la matriz de transformación en este caso pues la matriz fila pues la transformamos en una matriz columna y después el resultado pn también va a ser una matriz columna y bueno pues devolverla en el mismo formato la transponemos otra vez y ya está y esto es el ejemplo sencillito de la función vamos a ver cómo lo hacemos ahora en máxima aquí sí que hay novedades en lo que se refiere a eso a la resolución de problemas un poquito más complejos en este caso cuando el cuerpo de la función es algo más complejo que una línea pues conviene utilizar lo que se llama bloques y este va a ser con lo que vamos a trabajar cuando vayamos a hacer pues ya digo funciones que tengan un cuerpo pues que requiera operaciones un pelín más complejas como podéis ver un bloque en realidad un bloque es un conjunto de instrucciones va a venir delimitado definido por la palabra bloc que tenéis aquí veis que aquí por cierto que hago el no lo estoy mostrando en línea porque ya digo en línea es muy latoso como podéis ver el bloque está delimitado por dos paréntesis y nos encontramos con una estructura especial dentro que está delimitada por corchetes en esta estructura de aquí es donde vamos a almacenar vamos a definir las variables auxiliares locales que vayamos a utilizar dentro del cuerpo de este bloque es una función la vamos a llamar bloque pero vamos en este caso lo que hacemos es que en este en esta unidad que tenemos aquí definida por los corchetes vamos a definir las variables auxiliares que vamos a utilizar dentro y que no queremos que no vayan a ser definidas para que estén definidas por el máximo fuera del ámbito de esta función así que lo que hacemos si os fijáis vamos a definir no solo definirlas sino inicializarlas por ejemplo nosotros estamos diciendo aquí que vamos a utilizar dentro de este bloque tres variables locales que se llaman m, xy y rxy son tres variables de ámbito local esas tres variables de ámbito local además las vamos a inicializar como podéis ver la m se inicializa con una matriz que es nuestra matriz de rotación y después la xy es algo un poquito artificial también se define como una matriz columna igual que en el caso anterior a partir de los puntos que teníamos originalmente además vamos a definir una variable local rxy que no se inicializa en este momento de manera que como veis aquí tenemos que el resultado ya una vez dentro del cuerpo del bloque propiamente el apartado anterior se refería a eso, a la definición de esas variables locales dentro del cuerpo del propio bloque pues vamos a tener lo que es aquí la operación esta que hemos hecho la multiplicación entre la matriz de rotación y el punto original que nos va a dar al punto rotado que es lo que hemos llamado rxy y finalmente ese va a ser el valor que va a retornar como podéis ver aquí resulta muy bonita el resultado simbólico que nos da máxima, aparece mucho más clarito y se puede ver muy bien y aquí tenemos el resultado de la evaluación como podéis ver estamos igualando b que puede ser bueno pues eso, en este caso va a ser una matriz columna al resultado de la función en este caso pues vamos a tomar el punto 1,1 lo vamos a rotar pues en 45 grados vamos a rotar 45 grados y el resultado lo vamos a guardar en b que es el resultado de la rotación efectivamente 0 raíz de 2 fijaos que en este caso eso es un pelín más complejo no os preocupéis por ahora por esta sintaxis porque la vamos a seguir viendo a lo largo de toda esta presentación, va a ser muy sencillo bueno pues ya hemos sido capaces de definir las funciones porque el concepto de función es independiente de que lo utilicemos en máxima o en el sílab o lo que sea y simplemente lo que hemos hecho es resaltar un poco la sintaxis para ver esas funciones lo que sucede es que ahora pues queremos algo más queremos pues nos damos cuenta de que si bien máxima y el sílab son herramientas muy pero que muy potentes pues tienen ciertas carencias que nos impiden resolver algunos problemas pero estos problemas van a demandar ciertas estructuras de control, ya veréis que siempre son las mismas, se van a llamar estructuras iterativas estructuras de control iterativas y estructuras de control selectivas y bueno lo que va a hacer es que todos los lenguajes de programación para irlo estructurado, bueno todos los lenguajes de programación que vamos a conocer más o menos y las herramientas que vamos el lenguaje de programación que tiene por decirlo así el sílab y el máxima pues van a incluir eso estos dos tipos de estructuras, lo que pasa es que cada una con sus características bien aquí tenemos como podéis ver seguro que en alguna asignatura tenéis estructuras discretas o bueno seguro que habéis visto alguna de estas estructuras discretas esto como podéis ver se trata de un grafo, eso es relevante en realidad el significado de todo esto pero simplemente para demostrar que en matemáticas necesitamos el uso de esas estructuras, entonces tenemos un grafo definido por un conjunto de vértices verdad, es un grafo dirigido por lo que veo aquí donde el conjunto de arcos es un grafo completo dirigido sin loops sin bucles y entonces hemos definido para cada uno de los arcos de nuestro grafo pues un corte C y J y queremos por alguna razón saber pues por ejemplo que tenemos aquí pues queremos saber cual es el máximo el arco de mayor coste de todo el conjunto de arcos que tenemos por ejemplo ahora mismo no se me ocurre la aplicación práctica pero bueno podríamos querer saberlo y esto implica, que implicaría esto que os parece que deberíamos hacer, sin duda recorrer todos los elementos del conjunto A el conjunto de aristas verdad y evaluar cada uno de los costes asociados a cada una de las aristas y bueno probablemente deberíamos determinar pues eso simplemente tras evaluar cada uno de las de los costes pues quedarnos con el mayor de manera que necesitamos una herramienta para recorrer todo el conjunto de elementos y además otras cosas más aquí tenemos otra posible aplicación por ejemplo aquí queremos saber el conjunto de arcos que tienen un coste menor que un C que nosotros le pasamos, efectivamente aquí también se nos demanda tenemos la necesidad de recorrer toda la estructura A todo el conjunto A de forma iterativa, elemento a elemento evaluándolos de manera que contabilicemos contabilicemos los elementos que cumplen estas características bueno pues para efectuar esto vamos a necesitar probablemente pues una serie de estructuras de control ya digo, dos tipos de estructuras de control estructuras de control iterativas y estructuras de control selectivas vamos a ver como se traduce eso en los distintos lenguajes asociados a nuestras herramientas el philab y maxima bueno aquí tenemos otro ejemplito simplemente quería justificaros simplemente quería justificaros el uso de pues eso, de estructuras de control iterativas en este caso también tiene que ver con las matemáticas esto es algo que he extraído de nuestros apuntes de teoría de la computación de complejidad computacional y bueno como veis aquí tenéis una serie de variables lógicas las variables x y aquí también tenemos una serie de herramientas de necesidad de recorrer determinados conjuntos para evaluar ciertas cosas, no os asustéis por la anotación esto es más bien de lógica y bueno lo que quiero hacer simplemente es justificar la necesidad de nuestras estructuras de control bueno quizá ha sido un poco pesado al preparar la presentación aquí tenemos también una serie como podéis ver probablemente ya la conozcáis una serie que va desde 1 hasta infinito, esto del infinito a los informáticos no nos gusta nada no nos gusta absolutamente nada es muy difícil representarlo es una broma, no se puede representar entonces efectivamente aquí tenemos una estructura de control que nos obliga a recorrer pues a ir dándole valores a este índice i que va a valer 1, 2, 3 bueno hasta la precisión que queramos si queremos hasta el infinito para obtener pi o bueno aquí cualquier expresión de este tipo en este caso ya no tenemos un sumatorio sino un producto tenemos que ir recorriendo todos los evaluando, multiplicando pues el parámetro i por la variable i esta que tenemos aquí sin duda yo creo que ya estaréis convencidos de que necesitamos por lo menos lo que hemos visto así estructuras repetitivas estructuras iterativas ¿qué tienen en común todas estas estructuras? ya digo el máxima en el CLAB, el C++ en el Python, en lo que queráis ¿qué tienen de común? bueno como podéis ver aquí lo que tiene de común es que tenemos que repetir algo ¿verdad? tenemos que repetir algo y solemos indicar o bien un comienzo de esta repetición y un final de la repetición en este caso pues desde 1 2, 3, 4 hasta n y también suele haber un índice asociado aquí también el sumatorio lo veis o si volvemos atrás tenemos que recorrer todos los elementos de un conjunto ¿verdad? entonces tenemos la iteración una repetición por cada uno de los elementos del conjunto y el valor ese que va tomando los valores de cada uno de los elementos bueno como traducimos bueno esto es lo que quería explicaros también es que bueno pues todo el bueno pues que tanto cualquier lenguaje de programación que había mencionado como vais a tener este tipo de estructuras y también es muy habitual que se utilice el lenguaje algorítmico como ésta aquí tenéis un procedimiento un procedimiento y una función como podéis ver aquí y aquí ya os damos una pista aunque estoy seguro de que vosotros ya habéis estado leyendo el tema 4 aquí nos damos una pista sobre cuál es la forma que suelen tener las estructuras iterativas o la estructura de control selectiva que nos permite determinar tomar llevar a cabo acciones en términos de el valor de una condición que vayamos evaluando aquí tenéis un punto más compleja y también lo que podéis ver son bueno pues los bloques asociados a cada una de las estructuras la idea que quería haceros llegar es que no os preocupéis del lenguaje de programación que utilizáis no os preocupéis de la herramienta sea maxima vamos a necesitar nosotros tenemos que saber de antemano qué es lo que queremos y ya buscaremos la manera de hacerlo la manera de hacerlo en el lenguaje de programación pues viéndonos mirándonos el manual como podéis ver cada una de estas estructuras además tiene asociado un bloque un bloque y bien ya vamos a entrar ahora un poquito más en detalle bueno otra vez insistiendo simplemente quería haceros llegar la idea de que también podemos representar estas estructuras a través de diagramas de bloque pero bueno no nos vamos a meter en ello bien para hacer uso de las estructuras repetitivas para ir un poquito para intentar explicarlas con problemas sencillitos pues qué mejor que una matriz que nos da un poquito de juego para recorrer sus elementos filas columnas diagonal su matriz triangular inferior superior cuando estamos con matrices cuadradas o lo que sea de manera que esto nos va a permitir vamos a tener con esto la excusa de poder ver cómo son las estructuras repetitivas en cada uno de estas dos herramientas que estamos estudiando por ejemplo mira aquí tenemos una función que la vamos a definir la hemos llamado scol porque va a ser la suma de las columnas le vamos a pasar como parámetro como podéis ver la matriz del número de filas y el número de columnas podemos pasar una matriz y no lia a lo mejor sólo queremos abordar pues un número de filas y columnas determinados trabajar con una submatriz triangular o lo que sea y qué es lo que tenemos que hacer pues efectivamente tal y como vosotros estáis viendo lo que vamos a hacer es simplemente pues sumar los elementos de una columna qué utilidad tiene esto ninguna pero para nosotros para ilustrar el concepto de bucle o de estructura de control repetitiva vamos a ver cómo hacen pues normalmente empiezo por y después por máxima sospecho que me he equivocado a sospecho que he quitado una transparencia por lo que veo pero bueno ya intentamos avanzar ahora yo lo que he hecho cada uno de estos ejemplos los había hecho con scilab y máxima pero me debo haber cargado la transparencia que teníamos asociado al scilab si no me equivoco efectivamente bueno después veremos otros ejemplos pasamos directamente a máxima como podéis ver aquí en lo que tenemos que hacer es sumar hacer un procedimiento hacer una función que nos devuelva la suma de los elementos de una columna determinada estos son los como habíamos hecho antes aquí lo que estamos haciendo es definir un bloque como habíamos explicado al principio habíamos visto la sintaxis con esta con este bloque inicial en el cual se definen las variables locales que vamos a utilizar en este caso suma e i inicializando a 0 suma va a ser una variable acumulador que lo que va a hacer es ir acumulando los resultados de cada una de las celdas que vamos visitando como podéis ver aquí estamos visitando aquí tenemos una estructura iterativa veis la sintaxis como podéis ver lo que hacemos es igual que antes teníamos definimos un índice un valor de comienzo y un valor de final pues aquí estamos haciendo exactamente lo mismo igual que en el sumatorio o en el producto un índice un valor de comienzo y un valor de final y aquí tenemos el índice for dos puntos un valor de comienzo through es hasta el final m y estos son los límites de manera que lo que está dentro de este bloque lo que está dentro de de esta estructura iterativa pues se va a repetir variando el índice i el índice j ya se lo pasamos nosotros como parámetro de manera que una vez que esté sumado que esté acumulado todo la variable suma se retorna y esto es así de sencillo hemos visto un ejemplo muy sencillo en el cual pues hemos definido por primera vez ya para la sintaxis específica del máxima pues una estructura iterativa además muy sencilla veis que la sintaxis pues no tiene mucha cosa bueno vamos a ver ahora y en este caso sí que tengo los dos casos en este caso tengo parámetros y máxima os pido disculpas por la por la transparencia que me he cargado en el caso anterior en este caso vamos a hacer una función tan útil como la que habíamos visto antes en este caso vamos a hacer la suma de todos los elementos de la matriz la suma de todos los elementos de la matriz como veis aquí tenemos que recorrer filas y cada una de las columnas y esto nos obliga a efectuar pues una la utilización de dos bucles anidados uno dentro del otro uno que recorre las filas y otro que recorre las columnas fijaos que volvemos otra vez a la sintaxis de scilab definimos la función definimos los parámetros de entrada función s los parámetros de entrada suma y aquí bueno pues inicializamos nuestra variable acumulador y bueno como podéis ver aquí tenemos dos estructuras iterativas una dentro de la otra cuando cuando se efectúa la primera iteración de la primera estructura iterativa se efecturan tantas operaciones de la segunda como indica su sus límites vamos a ver porque antes no lo habíamos visto vamos a ver la sintaxis específica del scilab como veis es totalmente diferente no efectivamente se define por aquí por un lado el índice el primer elemento y de manera que dentro del cuerpo de este de esta estructura iterativa la i va tomando los valores 1 2 hasta m y a su vez dentro del cuerpo de esta estructura iterativa la j va a ir tomando los valores del 1 hasta el n de manera que la variable suma se va a ir acumulando las sumas las sumas de cada uno se va a acumular la suma de cada una de las celdas vamos a ver entonces como lo haríamos en máxima en máxima pues igual lo hacemos en forma de bloque verdad como habéis visto antes en este caso además de definir la variable de suma la variable local pues vamos a definir las variables índices y j ambas con la sintaxis específica y como podéis ver pues no varía mucho con respecto al caso anterior bueno pues lo que vamos a hacer a continuación es efectivamente hemos visto una estructura iterativa rígida una estructura iterativa en la cual especificamos exactamente los valores cuando comience y cuando acaba pero vamos a introducir una estructura iterativa un poquito más flexible que no se utiliza para el caso que vamos a ver a continuación no se utiliza en absoluto se utiliza para cuando nosotros no sabemos de antemano cuántas iteraciones vamos a efectuar porque el hecho del número de repeticiones o las repeticiones que vamos a hacer va a depender de algo que se va a ir modificando a lo largo de cada una de las iteraciones pero bueno que en este caso está ilustrado lo que hacemos es resolver este mismo problema de las sumas con esta nueva tipo de estructura iterativa que es el while efectivamente aquí tenéis exactamente lo mismo que hacíamos antes pero con una estructura que se llama while la estructura iterativa while lo único que hace es repite lo que está dentro de su cuerpo es decir lo que está entre el while y el end lo repite mientras se cumpla la condición que está especificada aquí ahora al final de la presentación veremos cómo pueden ser esas condiciones entonces bueno pues simplemente ya digo lo que hace es repetir una y otra vez vamos a ver en este caso en particular como podéis ver aquí la condición depende de del valor que tenga i con respecto a m de manera que nosotros inicializamos como veis aquí el valor de i a 1 mientras si sea menor o igual que m pues que hacemos aquí pues ahora hacemos una serie de operaciones aquí inicializamos la j1 que es otra variable que vamos a utilizar y aquí también como veis tenemos una serie una estructura iterativa que depende de j como veis en cada una de las iteraciones tanto en la estructura de dentro como la de fuera pues tenemos una actualización de los valores de los índices eso supone que afortunadamente en algún momento terminarán ambos bucles el bucle interno terminará cuando la j supera el valor de n como podéis ver en la condición y el externo cuando la i supera el valor de m como veis cada vez que vamos a entrar en el bucle j pues utilizamos el valor de j a 1 es muy sencillito también es un poquito más flexible y no se utiliza en estas situaciones se utiliza cuando pues no sabemos de antemano el número de iteraciones que vamos a tener aquí si lo sabemos bueno seguimos entonces esta es la el equivalente en el máxima como veis tenemos de nuevo definido el bloque y bueno el bloque de de la definición de variables locales y aquí tenemos lo mismo veis que en este caso cuando tenemos más de una instrucción dentro del bloque de una estructura iterativa o ya veremos después de selectiva lo que sea utilizamos las los paréntesis para definir el principio y el final del bloque como podéis ver pero la mecánica es exactamente igual la mecánica es exactamente igual bien bien vamos a pasar entonces al siguiente ejemplo el siguiente ejemplo lo que nos va a forzar es la utilización de estructuras con condicionales la estructura condicional ya la había visto antes es el tipo if o sea vamos a tomar en base a una evaluación de una condición vamos a tomar una decisión u otra en este caso y volviendo con las matrices lo que vamos a hacer es calcular el máximo los elementos de esta de una columna que le pasemos como parámetro a la columna j de manera que vamos a tener una variable que vamos a llamar max o como queramos una variable en la cual vamos a ir almacenando parcialmente cual es el elemento máximo del elemento máximo que hasta el momento vamos a ver como lo hacemos en el cilab en el cilab como veis definimos la función inicializamos el valor máximo en teoría habitualmente la variable esta en la que va a almacenar el máximo se suele inicializar a menos infinito pero vosotros sospecháis que no conocemos el menos infinito aquí en informática así que lo inicializamos al primer elemento de la matriz y a continuación al primer elemento de la columna y a continuación recorremos el resto de los elementos y aquí es donde nos encontramos con la instrucción selectiva la instrucción selectiva tipo if nos va a hacer llevar a cabo una acción en el caso de que se cumpla la condición que aparece en la evaluación aquí dice mira vamos si la variable maxv es menor es decir si el máximo que teníamos almacenado hasta el momento es menor que el valor de esta matriz pues el máximo actual el máximo de verdad pues va a ser reemplazado por esta que es mayor efectivamente pues esta es la razón por la que introducimos aquí esta instrucción selectiva vamos a actualizar el valor de maxv en el caso de que encontremos un valor que sea mayor al que tenemos actualizado en ese momento ¿cómo lo hacemos el máximo? pues exactamente igual como siempre en nuestro bloque definimos las variables locales y igual que antes la definimos como el máximo como el primer elemento de la columna y dependiendo del valor que tome el valor de la celda que estemos examinando pues actualizamos el valor de maxv aquí la condición parece diferente pero es exactamente la misma como podéis ver en una el maxv está a un lado y el otro el maxv está al otro es muy sencillo muy bien bueno pues ya hemos introducido las instrucciones iterativas de control iterativas y las selectivas aquí tenemos otro ejemplo en el cual fijaos lo que vamos a hacer es sumar sólo aquellos elementos que sean tengan un valor par dentro de nuestra bueno y aquí le damos una vuelta de rizo más en la submatriz triangular inferior sin contar la diagonal de una submatriz cuadrada ¿no? que pasemos en los valores m y n pues serán los mismos bien bueno pues vamos a ver aquí también debo haber hecho no aquí lo que pasa es que lo tengo en orden diferente bueno aquí empezamos por máxima como podéis ver aquí tenemos hay que tomar con cuidado los índices que le pongamos a las estructuras iterativas para recorrer los elementos que queremos exactamente y aquí tenemos la función la condicionada la función selectiva en el caso de que el módulo de la el módulo es el resto de la división de la celda con el 2 sea 0 o sea que el número sea par pues entonces se suma como os dije al principio esto no tiene ningún sentido sino ilustrar pues cómo funciona más o menos este tipo de instrucciones selectivas o iterativas aquí tenemos la versión exactamente igual que en el Scylla bueno pues utilizamos los dos bucles anidados con los índices elegidos de forma apropiada para recorrer la submatriz triangular inferior sin contar la diagonal y en el caso de que el elemento que estemos examinando sea par pues entonces lo añadimos al saco lo sumamos bien bueno aquí tenéis una bueno una lista de posibilidades que podemos tener con el como se llama con el Scilab para hacer las estructuras iterativas por ejemplo tenéis una sintaxis para especificarle el incremento si no queremos hacer un incremento de una unidad sino incremento de fraccionario es decir 0,01 o incremento en este caso negativo porque el primer elemento va a ser 4 y el último va a ser 1 o también tenemos por ejemplo aquí pues una estructura iterativa que nos permite recorrer los elementos de una lista por lo cual podríamos simular un conjunto seguimos por aquí y bueno lo mismo también tenemos un montón de variedad yo os recomiendo que echéis un vistazo al manual cuando tengáis cierto tipo de inquietud o de necesidad y podréis encontrar probablemente la variación de la estructura iterativa que se adecua perfectamente a vuestras necesidades en este caso como podéis ver aquí el incremento viene dado por el step 7 este que tenemos aquí vamos desde menos 3 hasta 26 saltando de 7 en 7 veis el resultado y aquí tenéis un incremento negativo por ejemplo y distintos tipos de condiciones distintos tipos de condiciones en el FORT que nos hace un poquito más flexibles que ya no son las condiciones que teníamos al principio fijas sino por ejemplo aquí en el LES hasta que llegue el valor P pues a 7 bueno pues aquí tenemos también si queréis echarle un vistazo a las distintas opciones de control digo de condiciones de evaluación de condiciones que tenemos para el SCILAB o también para el MAXIMA disculpad que haya ido un poquito rápido aquí al final pero quizá me he entretenido demasiado en algunos aspectos y se me va a pasar la hora de la videoconferencia que teníamos planificada por favor hacedme llegar si tenéis alguna duda y si no bueno os invito a que enriquezcáis los foros con vuestras consultas como estáis haciendo y también como habéis hecho muy bien a dar soluciones espero vuestras preguntas