HERRAMIENTAS INFORMÁTICAS PARA MATEMÁTICAS (Apuntes elaborados por el equipo docente para el curso 2011-12) Tema 1 INTRODUCCIÓN A LOS PROGRAMAS DE CÁLCULO MATEMÁTICO Los programas de cálculo matemático son programas de computador o de calculadora avanzada para el cálculo numérico y/o simbólico. Estos programas nos permiten, a diferencia de una calculadora tradicional no programable, automatizar manipulaciones repetitivas, tediosas o difíciles. Pero entre ellos también hay grandes diferencias, así la principal diferencia entre un programa de cálculo simbólico y uno de cálculo numérico es la habilidad del primero para trabajar con ecuaciones y fórmulas simbólicamente, en lugar de numéricamente. De ahí que una expresión como a + b pueda ser interpretada como “la suma de dos variables”, y no como “la suma de dos números” que ya tienen valores asignados. Aunque existen programas especializados en cálculo numérico y en cálculo simbólico, la mayoría de los programas son capaces de realizar cálculos matemáticos, tanto numéricos como simbólicos. A continuación se recoge una lista de programas de cálculo matemático, clasificados por el ámbito en el que son más conocidos. La lista no pretende ser exhaustiva pues además de estos existen muchos programas especializados en las distintas áreas de las Matemáticas. Tipo de cálculo Numérico Simbólico Programa Web oficial Tipo de software Matlab Octave Scilab Derive Maple Mathematica Maxima http://www.mathworks.es/ http://www.gnu.org/software/octave/index.html http://www.scilab.org/ http://www.derive.com/ http://www.maplesoft.com/ http://www.wolfram.com/ http://maxima.sourceforge.net/es/ Comercial Libre Libre Comercial Comercial Comercial Libre Los contenidos de la asignatura se van a cubrir en base a dos programas gratuitos, uno de cálculo numérico (Scilab) y otro de cálculo simbólico (Maxima), disponibles tanto para Windows como para Linux. Con la particularidad de que ambas herramientas también están muy documentadas por sus propios desarrolladores y usuarios bajo los Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 términos de la "GNU General Public License" tal como lo publica la "Free Software Foundation". Ambos programas se apoyan en un lenguaje interpretado, ofrecen grandes opciones para las representaciones gráficas, permiten programación estructurada y están preparados para manipular archivos de programas. 1.1 DIFERENCIAS ENTRE LOS PROGRAMAS DE CÁLCULO NUMÉRICO Y DE CÁLCULO SIMBÓLICO Con carácter introductorio, pues en otros temas se pondrán de manifiesto muchas más diferencias entre los programas de cálculo numérico y de cálculo simbólico, vamos a centrar las diferencias en los siguientes aspectos: el tratamiento de las expresiones numéricas, el tratamiento de las expresiones literales, la representación interna de la información y las características más representativas de ambos programas. 1.1.1 Tratamiento de las expresiones numéricas Las expresiones numéricas se forman con números o estructuras de números y operadores que especifican los cálculos a ser realizados. Pueden ser evaluadas por cualquier programa de cálculo numérico, y el resultado será siempre un número que se presentará con un formato decimal concreto, el seleccionado en ese momento. Por ejemplo, la expresión numérica 4/12+sqrt(2) provoca el resultado 1.7475469 en Scilab. El resultado puede haber sufrido algún tipo de truncamiento debido a la precisión del cálculo. En cambio los programas de cálculo simbólico, que también son capaces de evaluar las expresiones numéricas, devuelven los resultados numéricos de forma exacta, sin aproximaciones decimales, como fracción simplificada. Aunque también se les puede pedir que devuelvan el resultado numérico en formato decimal o que realicen el cálculo con una precisión concreta. Por ejemplo, la expresión numérica 4/12+sqrt(2); provoca 1 el resultado 2 + en Maxima. 3 1.1.2 Tratamiento de las expresiones literales Las expresiones literales se forman con letras, números, o estructuras de letras y números, y operadores que especifican los cálculos a ser realizados. Los programas de cálculo numérico sólo son capaces de evaluar expresiones literales en las que todas las variables ya tengan valores asignados. Mientras que los programas de cálculo simbólico operan con las variables de forma analítica, tal como lo haríamos nosotros. Por ejemplo, a la expresión literal a/b+sqrt(c); provoca el resultado c + en Maxima. Sin embargo b para que pueda ser evaluada por Scilab tiene que estar precedida de las correspondientes asignaciones para las tres variables, luego la siguiente expresión literal a=4,b=12,c=2,a/b+sqrt(c) donde a la variable a se le asigna el valor 4, a la variable b el valor 12 y a la variable c el valor 2 sí podría ser evaluada por Scilab, dando el mismo resultado 1.7475469 de la expresión numérica comentada anteriormente. Tema 1 2 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 La versatilidad del programa de cálculo simbólico queda aún más de manifiesto si en la expresión literal es posible algún tipo de simplificación. Por ejemplo, la expresión a en Maxima. Con la primera parte de literal c:b$ a/b*sqrt(c); provoca el resultado b la expresión le hemos comunicado a Maxima que la variable c es igual a la variable b, por tanto al evaluar la segunda parte de la expresión ha podido realizar la siguiente a a y llegar a ese resultado final. simplificación b= b b Los programas de cálculo simbólico están además preparados para realizar distintas representaciones de un mismo resultado, con especial atención a los formatos más empleados en la escritura habitual. De ahí que suelan contemplar, entre otras cosas, la simplificación de una expresión a la forma más simple o a una forma estándar y el cambio de formatos. 1.1.3 Representación interna de la información Para sacar el máximo provecho a un programa de cálculo matemático es conveniente saber qué tipo o tipos de representación interna de la información emplea. En Scilab todo se representa como una matriz (array en inglés) con excepción de las estructuras de datos más complejas como las listas que a su vez pueden contener matrices. La razón principal es que de esta forma el acceso a un dato cualquiera es directo, mientras que en las listas, al ser estructuras dinámicas, para acceder al n-ésimo dato, un puntero debe recorrer todos los elementos de la lista desde el que ocupa el primer lugar. Por tanto los tiempos de procesamiento de grandes cantidades de datos se reducen. Por el contrario, toda expresión de Maxima se representa internamente como una lista, lo que no es de extrañar habida cuenta de que Maxima está programado en Lisp (List Processing). No obstante también permite el almacenamiento matricial de datos siempre y cuando el tamaño de la matriz se haya declarado previamente. 1.1.4 Las características más importantes de los programas de cálculo numérico Entre las características comunes de los programas de cálculo numérico podemos destacar las siguientes: Emplean la notación científica o coma flotante, con mantisa (parte decimal con signo) y exponente, que facilita la representación tanto de números grandes como de pequeños pero que no es una representación exacta para todos los números. Los cálculos no son exactos, tienen inherentemente cierto error, de ahí que se hable de la precisión en el cálculo. Muchos de los cálculos involucran procesos de iteración, que pueden llegar a término (presentación de resultados) si han agotado el número de iteraciones previsto o si han alcanzado la precisión deseada (se habla entonces de convergencia de la solución). Tema 1 3 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Son capaces de encontrar soluciones aproximadas a ciertos problemas matemáticos que, por su complejidad o porque no tienen solución, son imposibles de abordar analíticamente. Están capacitados para el análisis y tratamiento masivo de datos. 1.1.5 Las características más importantes de los programas de cálculo simbólico Entre las características comunes de los programas de cálculo simbólico podemos destacar las siguientes: Emplean representación y manipulación exacta de la información. Están capacitados para los cálculos matemáticos básicos (límites, derivadas, integrales) sobre funciones de una y varias variables. Están capacitados para la resolución analítica de ciertos sistemas de ecuaciones y de ciertas ecuaciones diferenciales. 1.2 PRIMEROS PASOS CON SCILAB Consiga el archivo correspondiente a su sistema operativo para instalar la versión 5.3.0 de Scilab, lo puede descargar a través del curso virtual o en la página web oficial http://www.scilab.org/. El apartado 1.3 del documento Introduction to Scilab le puede ser de gran ayuda para ello. Durante el proceso de instalación de Scilab se recomienda elegir el idioma español y la instalación por defecto. Tendrá así la misma instalación que el equipo docente, la que se en ha utilizado al elaborar estos apuntes. La instalación le habrá creado el icono el escritorio y un grupo de programas. Mediante dicho icono o seleccionando scilab5.3.0 en el grupo de programas estará en condiciones de utilizar el entorno Scilab. scilab-5.3.0.lnk En la figura 1.1 puede observar el aspecto que presenta la Consola de Scilab al arrancar de cualquiera de esas dos formas. La consola muestra en primer lugar información sobre la versión instalada de Scilab, a continuación el mensaje de que está cargando el entorno inicial y por último presenta el indicador (prompt en inglés) --> característico de que el entorno está listo para su utilización. El cursor con el símbolo “|” parpadeando inmediatamente después de --> indica que el entorno está preparado para que el usuario teclee una expresión en la línea de comandos y para que ordene su evaluación. En la figura 1.2 se muestra la reacción de la Consola de Scilab después de que el usuario haya compuesto la expresión x=4;5+2*x-3 y haya pulsado la tecla (ENTER). Se trata de una expresión compuesta por dos expresiones, con la primera x=4 se consigue asignar a la variable x el valor 4 y con la segunda 5+2*x-3 se solicita el resultado de la operación 5+2x-3 para ese valor de x. Observe que es imprescindible teclear el carácter “*” entre el 2 y la x para indicar que queremos realizar el producto de ambos. El carácter “;” se ha empleado como separador de ambas expresiones pero además para indicar a Scilab que no muestre en ventana el valor asignado a la variable x. El resultado de la operación es el número decimal 10., que Scilab ha asignado a una variable por defecto llamada ans (del inglés answer, respuesta en español). Tema 1 4 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Figura 1.1 Aspecto inicial de la Consola de Scilab. Figura 1.2 Reacción de la Consola de Scilab después de componer la expresión x=4;5+2*x-3 y pulsar la tecla (ENTER). Esta forma de trabajar se conoce como el modo calculadora o el modo línea de comandos y es habitual en cualquiera de los lenguajes de programación intérpretes. El entorno está ejecutando el típico ciclo secuencial de tres estados (entrada de datos, cálculo, presentación de resultado). Durante la entrada de datos el entorno está analizando los caracteres que llegan desde el teclado y va componiendo la expresión, este estado se abandona en el caso de Scilab cuando el entorno recibe la tecla , momento que es interpretado como la orden de proceder al cálculo y a la posterior presentación del resultado. Finalizada esta presentación, el entorno muestra de nuevo el indicador --> y comienza un nuevo ciclo. En el estado de entrada de datos, el usuario también puede hacer uso de los cursores. Por ejemplo, tecleando una vez el cursor hacia arriba “” puede recuperar la línea tecleada anteriormente y en pulsaciones sucesivas o dejándolo pulsado podrá recuperar cualquiera de las líneas tecleadas durante una sesión. Ejercicio 1.1 a) Arranque Scilab y reproduzca el resultado de la figura 1.2. b) Pruebe a recuperar la línea ejecutada anteriormente, para modificar el “;” por una “,” y comparar por observación con lo ocurrido anteriormente. El modo línea de comandos no es la única forma de trabajar en Scilab, ni siquiera es la más conveniente, cuando el número de expresiones va en aumento es mucho mejor trabajar sobre el editor SciNotes. Se accede a él a través del primer icono (Ejecutar SciNotes) de la barra de herramientas. La figura 1.3 muestra el aspecto inicial (en blanco) de la ventana de edición. Este editor es algo más que un editor de texto, pues al mismo tiempo que vamos tecleando nos auxilia en la sintaxis, enumera las líneas y mediante un código de colores distingue los distintos tipos de elementos que contempla el lenguaje de programación de Scilab. En el apartado 2.2 del documento Introduction to Scilab puede consultar más información sobre el editor. Tema 1 5 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Figura 1.3 Aspecto inicial de la ventana de edición de Scilab. En la figura 1.4 se muestra las dos líneas editadas y guardadas en el archivo “Prueba1Tema1.sce”, este paso previo es necesario para poderlas ejecutar. La extensión sce no es necesario ponerla pues es la extensión reservada por Scilab para los archivos ejecutables, creados con el editor. La ejecución se solicita con el último icono (Ejecutar) de la barra de herramientas, y si aún no hemos guardado las líneas en el archivo, Scilab nos lo recordará con la siguiente mensajería Figura 1.4 Primeros pasos en la edición del archivo “Prueba1Tema1.sce”. Aparentemente no ha pasado nada pero sí ha pasado, la Consola de Scilab habrá mostrado el mensaje exec('G:\Docencia\Matematicas\Material\Prueba1Tema1.sce', -1). Y basta teclear x en la Consola de Scilab para comprobar que, como consecuencia de la ejecución del archivo “Prueba1Tema1.sce”, la variable x existe y tiene el valor 4. Luego x ha pasado a ser una variable del usuario y tiene en ese momento el valor 4. Pero lo que no existe es el resultado de la operación. Para que la Consola de Scilab muestre resultados numéricos es necesario incluir alguna instrucción como disp en el archivo. La figura 1.5 muestra una ampliación del primer archivo de prueba con estos fines el contenido. Las cuatro últimas líneas se utilizan para presentar los correspondientes mensajes y valores de las variables en la Consola de Scilab. Pero como además la línea de comandos en Scilab puede hacer la función de entrada de entrada de datos para un cálculo, se ha incluido una primera línea que hace uso de la instrucción input para provocar un diálogo con el usuario a través de la consola. En este caso concreto se le muestra el mensaje “introduzca el valor de x =”. La segunda instrucción realiza el cálculo y lo asigna a la variable y. En la figura 1.6 se puede observar el resultado que provoca en la Consola de Scilab la ejecución del mismo archivo pero con el nuevo contenido. Si volvemos a ejecutar el archivo no tenemos más que teclear otro valor de x Tema 1 6 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 para conseguir un nuevo resultado para y. Este archivo puede considerarse como un primer ejemplo de programación en Scilab. Figura 1.5 Contenido final del archivo “Prueba1Tema1.sce”. Figura 1.6 Estado de la Consola de Scilab como consecuencia de ejecutar el archivo de la figura 1.5. Ejercicio 1.2 a) Acceda al editor de Scilab y reproduzca el contenido final del archivo “Prueba1Tema1.sce”. b) Pruebe a ejecutarlo varias veces para distintos valores de x. En cualquier aplicación y sobre todo en estos programas matemáticos de tanto alcance es muy importante tener una buena documentación de ayuda e incluso el auxilio de otros usuarios. Al manual de ayuda de Scilab se puede acceder de varias formas; desde la opción Scilab Help creada durante la instalación, tecleando el comando help en la Consola de Scilab, o mediante el último icono (Navegador de ayuda) de la barra de herramientas. El manual se presenta en ventana aparte como un hipertexto sobre el que se puede navegar fácilmente y también se pueden realizar búsquedas. Los apartados 1.4 a 1.6 del documento Introduction to Scilab describe las distintas formas de solicitar ayuda y de conseguir documentación en Scilab. Explore también las opciones de ayuda que le ofrece el icono ? de la Consola de Scilab. Su aprendizaje sobre Scilab continuará en el apartado 1.4 de este primer tema y en el tema 2 pero si desea avanzar un poco más puede hacerlo consultando los apartados 2 y 3 del documento Introduction to Scilab. 1.3 PRIMEROS PASOS CON WXMAXIMA Consiga el archivo correspondiente a su sistema operativo para instalar la versión 5.23.0 de Maxima, lo puede descargar a través del curso virtual o en la página web oficial http://maxima.sourceforge.net/es/. El apartado 2.1 del documento Primeros pasos en Maxima le puede ser de gran ayuda para ello. Tema 1 7 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Durante el proceso de instalación de Maxima se recomienda marcar la opción para que instale el entorno gráfico wxMaxima. Tendrá así la misma instalación que el equipo en el escritorio y un grupo de docente. La instalación le habrá creado el icono programas. Mediante dicho icono o seleccionando wxMaxima en el grupo de programas estará en condiciones de utilizar el entorno wxMaxima. En la figura 1.7 puede observar el aspecto que presenta la ventana principal de wxMaxima al arrancar de cualquiera de esas dos formas. Se observa un mensaje de bienvenida y otro mensaje indicando que el entorno está preparado para que el usuario teclee una expresión y ordene su evaluación. También se observa una línea horizontal continua que actúa de cursor y servirá de separación entre las distintas expresiones. En la figura 1.8 se muestra la reacción de Maxima después de haber compuesto la expresión 5+2*x-3 y haber pulsado simultáneamente las teclas (SHIFT) y (ENTER). La sintaxis utilizada en esta expresión coincide con la empleada en Scilab, pero observe que ahora no ha sido necesario asignar valor numérico a la variable x. El resultado de la operación es otra expresión, la simplificada de la anterior. Pero además wxMaxima la presenta al usuario tal como él la escribiría, es decir como 2 x+2. Figura 1.7 Aspecto inicial de la ventana principal de wxMaxima. Figura 1.8 Reacción de wxMaxima después de componer la expresión 5+2*x-3 y pulsar simultáneamente las teclas (SHIFT) y (ENTER). El conjunto formato por la expresión de entrada, etiquetada por Maxima como %i1 por ser la primera entrada (del inglés input), y por la expresión resultado, etiquetada por Maxima como %o1 por ser la primera salida (del inglés output), pertenecen a una misma celda en el entorno de wxMaxima. Las líneas a la izquierda delimitan el contenido de esta primera celda. Además de la variable x tecleada por el usuario, wxMaxima considera a todas las entradas y resultados como variables, de manera que %i1 y %o1 están a partir de ese momento a disposición del usuario como variables. Por tanto se nos presentan ahora diversas opciones para hacer que este resultado sea una nueva variable, la variable y. Estas opciones están recogidas en la figura 1.9. Al ejecutar y:%i1 estamos asignando a la variable y la entrada %i1, es decir la expresión inicial tal como fue tecleada. Al Tema 1 8 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 ejecutar y:%o1 estamos asignando a la variable y la salida %o1, es decir la expresión simplificada de la expresión inicial. Y al ejecutar y:5+2*x-3 estamos asignando a la variable y la expresión inicial, tecleándola de nuevo. Figura 1.9 Formas alternativas de conseguir que la variable y tome el valor de la expresión 5+2x-3. Pero la mejor forma, observe la figura 1.10, es crear la variable y como una función de la variable x, con la siguiente sintaxis y(x):=5+2*x-3, pues en estas condiciones solicitar y(4) en wxMaxima nos ahorraría el tener que evaluar la expresión compuesta x:4;y:5+2*x-3. Además de esta forma podremos particularizar el cálculo de y para cualquier valor de x, por ejemplo y(0.5), etc… Figura 1.10 Definición de la variable y como función de x, dada por la expresión 5+2x-3. Y evaluación para de la función para x=4. El texto “no guardado*” en la ventana de wxMaxima nos está indicando que las expresiones tecleadas hasta ahora no se han guardado en ningún archivo. Es recomendable que procedamos a guardar estas seis entradas en un archivo, para ello se puede utilizar la opción Archivo o el segundo icono (Guardar documento) de la barra de herramientas. En la figura 1.11 puede comprobarse que ahora sí tenemos las seis entradas guardadas en el archivo “primerospasosconwxMaxima.wxm”. La extensión wxm no es necesaria ponerla pues es la extensión reservada por wxMaxima para los archivos de sesión. La figura 1.11 también nos sirve para poner de manifiesto que el concepto de celda es muy importante en wxMaxima. Tras teclear las seis entradas se han creado seis celdas, cada una tiene una expresión de entrada y una expresión de salida. Utilizando los cursores y/o el ratón el usuario se puede situar en cualquiera de las celdas para: modificarla y/o volverla a evaluar, eliminarla, ocultarla, etc … Por tanto la ventana principal de wxMaxima juega el doble papel, el de consola y el de ventana de edición. La figura 1.12 muestra el aspecto que presenta la ventana de wxMaxima si abrimos, con la opción Archivo o el primer icono (Abrir documento) de la barra de herramientas. Se pueden ver las seis expresiones previamente guardadas, pero sin numerar y sin evaluar. El símbolo --> es el indicativo empleado por wxMaxima para estos casos. En esta situación el usuario puede ir evaluando las celdas una a una, evaluar el conjunto de Tema 1 9 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 celdas seleccionadas, o evaluarlas todas. Dicha funcionalidad se consigue con el ratón, sus botones, y a través de la opción Celda. Tenga en cuenta que wxMaxima tiene memoria de las entradas y salidas previas, por lo que al ejecutar de nuevo las celdas se generarán nuevas entradas y salidas con la numeración que les corresponda. En la opción Maxima tiene posibilidad de Reiniciar el programa y de Limpiar la memoria para evitar que siga creciendo la información asociada a la sesión de wxMaxima. Figura 1.11 Aspecto de la ventana principal después de guardar las seis entradas en el archivo “primerospasosconwxMaxima.wxm”. Ejercicio 1.3 a) Arranque wxMaxima, teclee sucesivamente las mismas seis entradas de las figuras 1.8 a 1.10, y compruebe los resultados. B) Guarde las seis entradas en un archivo con el nombre que crea más oportuno y continúe la sesión en wxMaxima evaluando la función y para otros valores de x. Figura 1.12 Aspecto de la ventana principal después de abrir el archivo “primerospasosconwxMaxima.wxm”. Las seis expresiones de la figura 1.12 acaban con el carácter “;” para indicar a wxMaxima que muestre en ventana el resultado de evaluar la expresión. Si se desea que no muestre el resultado de una evaluación, la expresión debe ir terminada con el carácter $. Las seis expresiones de la figura 1.12 son expresiones simples, si la expresión es compuesta, wxMaxima habrá generado tantas salidas como expresiones haya evaludado, y las habrá enumerado correlativamente, pero sólo mostrará las que se le soliciten. Pruebe a evaluar la siguiente expresión compuesta y(x):=5+2*x-3$y(1);y(2);y(3)$y(4); Tema 1 10 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Al manual de ayuda de Maxima se puede acceder de varias formas; desde la opción Manual de Referencia (Español) creada durante la instalación o mediante el último icono (Mostrar la ayuda de Maxima) de la barra de herramientas. El manual se presenta en ventana aparte como un hipertexto sobre el que se puede navegar fácilmente y también se pueden realizar búsquedas. Explore también las distintas formas de solicitar ayuda y de conseguir documentación que le ofrece la opción Ayuda de la ventana principal de wxMaxima. Su aprendizaje sobre Maxima continuará en el apartado 1.4 de este primer tema y en el tema 2 pero si desea avanzar un poco más puede hacerlo consultando el apartado 2.2 del documento Primeros pasos en Maxima. 1.4 TRES EJEMPLOS REPRESENTATIVOS DEL ALCANCE DE LA ASIGNATURA Los tres ejemplos siguientes, que se pueden abordar con lápiz y papel (sin ayuda de herramienta informática ni calculadora), son representativos del alcance de la asignatura y pretenden motivar el uso de Scilab y Maxima en la resolución de problemas matemáticos. De ahí que se comenten las tres posibles aproximaciones a la solución: mediante lápiz y papel, la numérica con Scilab y la simbólica con Maxima. El estudiante encontrará en el curso virtual los correspondientes archivos Ejemplo*Tema1.sce y Ejemplo*Tema1.wxm para que pueda reproducir los ejemplos sin necesidad de programarlos, pues ya tendrá tiempo a lo largo de los temas 2 y 3 para familiarizarse con la sintaxis y las funciones de ambos programas. Ejemplo 1. Se quiere determinar el área comprendida entre la recta f(x) = 2 x + 2 y la parábola g(x) = (x-1)2+1. Ejemplo 2. Las siguientes funciones del tiempo describen respectivamente la posición instantánea horizontal y vertical que ocupa un proyectil lanzado con una velocidad inicial vo y un ángulo respecto al suelo. x(t) = vo cos t y(t) = v o sen t - (1.1) 1 g t2 2 (1.2) Se desea comparar gráficamente las trayectorias que describe el proyectil en el plano XY para dos situaciones concretas de tiro: el tiro rasante, con ángulo =1<45º, y el tiro por elevación, con ángulo =2>45º, tal que 1+2 =90º. En ambos casos se puede suponer que la velocidad inicial vo fue de 10m/s. Además para facilitar los cálculos se recomienda utilizar un valor de 10m/s2 para la aceleración g de la gravedad, 1=30º y 2=60º. Ejemplo 3: Se quiere descomponer el número 15 en tres sumandos naturales distintos cuyo producto sea máximo. Tema 1 11 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 1.4.1 Soluciones al ejemplo 1 Si abordamos el problema mediante lápiz y papel podremos optar por: 1º) Determinar si ambas funciones se cortan, para ello desarrollamos la segunda función g(x) = (x-1)2+1 = x2 – 2 x + 1 + 1 = x2 – 2 x + 2 e igualamos ambas expresiones f(x) = g(x) 2 x + 2 = x2 – 2 x + 2 x2 – 4 x = 0 x=0 , x=4 Las soluciones son los puntos de corte. 2º) Calcular el área solicitada como la integral definida siguiente Area solicitada = 4 4 0 0 2 f(x) - g(x) dx = 2 x + 2 - (x 4 4x -x 2 0 x3 dx = 2 x 3 - 2x + 2) dx = 4 2 = 2 42 0 43 96 - 64 32 = = 3 3 3 Observación: el cálculo anterior está presuponiendo que la primera función (la de la recta) toma un valor superior al de la segunda en todo el rango [0 4]. Hay muchas formas de comprobarlo, la más fácil es la comprobación gráfica, pero esto lo dejamos para cuando planteemos la solución con los programas matemáticos. A continuación trataremos de reproducir los pasos anteriores en Scilab. La forma más fácil de determinar si ambas funciones se cortan pasa por la representación gráfica de ambas funciones. Pero aún así no tenemos seguridad de qué rango hay que utilizar en la variable independiente. Tras varios intentos hemos decidido utilizar el rango [-2 5], en ese caso, tecleando las sentencias x=-2:.01:5; fx=2*x+2; gx=(x-1).^2+1; plot(x,fx,x,gx) habremos obtenido la representación gráfica de la figura 1.13, donde es fácil observar que los cortes de ambas funciones se producen en x=0 y x=4. También es fácil observar que la recta está por encima de la parábola en todo el rango [0 4]. Con la primera sentencia generamos un conjunto finito de valores para la variable independiente x, que van desde -2 a 5 y están separados por una centésima. Con la segunda y la tercera sentencia generamos un conjunto finito de valores para las variables dependientes fx y gx usando las expresiones que definen las dos funciones del ejemplo. Y con la cuarta sentencia solicitamos la representación gráfica de los dos conjuntos de valores dependientes respecto al conjunto de valores independientes. El área solicitada la calculamos como la integral definida entre los dos puntos de corte, haciendo uso de la función integrate tal como sigue. El resultado presentado por Scilab Tema 1 12 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 será el valor numérico 10.666667, que coincide con el resultado obtenido mediante lápiz y papel con un redondeo al entero más próximo en la sexta cifra decimal. integrate('2*x+2-((x-1)^2+1)','x',0,4) Figura 1.13 Representación gráfica en Scilab de las funciones f(x)=2x+2 y g(x)=(x-1)2+1 del ejemplo 1. A continuación se muestran las cuatro sentencias tecleadas y ejecutadas en Maxima para resolver el problema planteado en el ejemplo 1. Las sentencias se diferencian del resto porque están representadas con texto en color azul. La primera y la segunda sentencia sirven para asignar a las variables fx y gx respectivamente las expresiones que definen las dos funciones del ejemplo. En la tercera, que sirve para determinar los puntos de corte, se hace uso de la función solve. Y en la cuarta, que sirve para calcular el área como la integral definida, se hace uso de la función integrate. En Maxima también podemos generar una representación gráfica similar a la generada en Scilab. Por ejemplo, encadenando una quinta sentencia como la mostrada en la figura 1.14. Figura 1.14 Representación gráfica en wxMaxima de las funciones del ejemplo 1. Tema 1 13 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 El problema planteado en este ejemplo se ha podido resolver en los dos entornos. En Scilab hemos necesitado el apoyo gráfico, mientras que en Maxima ese apoyo no hubiera hecho falta y sólo hemos acudido a él para comprobar el resultado. 1.4.2 Soluciones al ejemplo 2 Este tipo de lanzamiento recibe el nombre de tiro parabólico porque el proyectil siempre describe una parábola de eje vertical en el plano XY. La demostración se puede hacer eliminando la variable t, el tiempo, de las ecuaciones (1.1) y (1.2) x(t) = v o cos t t = x v o cos x 1 x y = v o sen - g v o cos 2 v o cos y = tg x - 2 g x2 2 v cos 2 2 o (1.3) Pues se llega a una función y(x) de la forma y = a x2 + bx +c, que representa una parábola cuyo eje es vertical. Resolviendo (1.3) para y=0 se obtiene el punto del eje X donde el proyectil impacta sobre el suelo. Este valor, que nos da el alcance del tiro, se representa de la forma siguiente: 2 v o2 cos sen v o2 sen 2 d= = g g (1.4) Luego está claro que, para una velocidad inicial dada, el máximo alcance se obtiene con un ángulo =45º. Por tanto, para ángulos menores y para ángulos mayores a 45º se obtienen menores alcances y concretamente se demuestra que para ángulos complementarios se consigue el mismo alcance. El tiro rasante, el que se hace con un ángulo 1<45º, tendrá un alcance d1 dado por d1 = v o2 sen 21 g y el tiro por elevación, con ángulo 2=90º-1>45, tendrá un alcance d2 dado por vo2 sen 2 90-1 vo2 sen 180-21 vo2 sen 2 2 vo2 sen 2 2 d2 = = = = = d1 g g g g Por tanto si representamos las trayectorias descritas por los tiros rasantes y por elevación tendremos dos parábolas como las representadas en la figura 1.15. Se confirma que el proyectil impacta en la misma posición pero lógicamente tarda menos tiempo en hacerlo cuando el tiro es rasante. Para demostrarlo sustituimos el valor x por d en la expresión de t, y denominamos a ese valor el instante de impacto con el suelo: Tema 1 14 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 t impacto = 2 v o2 cos sen 2 vo sen d = = vo cos g vo cos g (1.5) Queda demostrado que el instante de impacto depende directamente del seno del ángulo de tiro, cuanto mayor es el ángulo más tarda el proyectil en impactar con el suelo. Otra característica del tiro parabólico es la altura máxima que alcanza el proyectil. Si aplicamos la propiedad de simetría de la trayectoria está claro que la altura máxima se presenta cuando x=d/2, o visto de otra forma cuando ha transcurrido la mitad del tiempo. Por tanto sustituyendo t por timpacto/2 en la expresión de y(t) se obtiene: y max = v o sen 2 v o sen 1 v o sen vo2 sen 2 = - g g 2g g 2 (1.6) Con esta expresión queda demostrado que la altura máxima que alcanza el proyectil depende cuadráticamente del seno del ángulo de tiro, cuanto mayor es el ángulo mayor es la altura máxima alcanzada por el proyectil. Figura 1.15 Trayectorias de los tiros parabólico rasante y por elevación del ejemplo 2. Para facilitar el estudio del tiro parabólico en Scilab hemos decidido utilizar el concepto de función. Tanto la x, que representa la distancia recorrida en la horizontal, como la y, que representa la altura instantánea, son variables dependientes. Con las dos primeras sentencias definimos las coordenadas del tiro parabólico. function x=distancia(vo, alfa, t),x=vo*cos(alfa)*t,endfunction function y=altura(vo, alfa, g, t),y=vo*sin(alfa)*t-g*t^2/2,endfunction A continuación asignamos valores concretos para tratar de reproducir las trayectorias del tiro rasante y del tiro por elevación. Pero aún así no tenemos seguridad de qué rango hay que utilizar en la otra variable independiente, el tiempo. vo=10; g=10; alfa1=%pi/6; alfa2=%pi/3; En primer lugar decidimos utilizar el rango [0 1.5], de manera que tecleando las sentencias conseguimos trazar las trayectorias de la figura 1.16. Tema 1 15 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 t=0:0.01:1.5; x1=distancia(vo,alfa1,t); y1=altura(vo,alfa1,g,t); x2=distancia(vo,alfa2,t); y2=altura(vo,alfa2,g,t); plot(x1,y1,x2,y2) Figura 1.16 Representación de los tiros parabólicos del ejemplo 2 utilizando los mismos valores entre 0 y 1.5 para la variable tiempo. El trazo azul nos indica que el proyectil por tiro rasante ya habría llegado en ese tiempo al suelo, y el trazo en verde nos indica que el proyectil por tiro en elevación no habría llegado todavía, de ahí que sea preferible generar una nueva gráfica con valores de tiempo distintos para cada trayectoria. Esto es lo que se ha hecho con las siguientes instrucciones, donde hemos aprovechado los conocimientos del desarrollo analítico para fijar el valor máximo de t1 y de t2 y donde hemos incorporado las etiquetas a los ejes y un título a la gráfica. La gráfica resultante ya se utilizó anteriormente en la figura 1.15 para complementar a la solución mediante lápiz y papel. t1=0:0.01:1; x1=distancia(vo,alfa1,t1); y1=altura(vo,alfa1,g,t1); t2=0:0.01:sqrt(3); x2=distancia(vo,alfa2,t2); y2=altura(vo,alfa2,g,t2); plot(x1,y1,x2,y2) title('Tiro parabólico rasante (en verde) y por elevación (en azul)') xlabel('x') ylabel('y') Respecto al uso de Maxima en este ejemplo, las dos primeras sentencias han servido para representar el tiro parabólico como una función y(x). La tercera sentencia nos permite determinar los valores de x en los que y=0. El resultado coincide con el obtenido en la solución analítica. Las siguientes sentencias se han utilizado para asignar valores concretos al tiro por rasante y al tiro por elevación. Y la última para representar ambas trayectorias en el mismo gráfico, como muestra la figura 1.17. Tema 1 16 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 4 x/sqrt(3)-x^2/15 sqrt(3)*x-x^2/5 3.5 3 2.5 2 1.5 1 0.5 0 0 1 2 3 4 5 6 7 8 x Figura 1.17 Trayectorias en wxMaxima de los tiros parabólicos rasante y por elevación del ejemplo 2. El problema planteado en este ejemplo obligaba a utilizar la representación gráfica. Pero mientras en Scilab hemos tenido que probar varios vectores de tiempo para las trayectorias, en Maxima teníamos desde el primer momento un conocimiento exacto del tiempo necesario en cada trayectoria. 1.4.3 Soluciones al ejemplo 3 El valor máximo del producto a b c de tres números naturales a, b, c se obtendrá cuando los tres números tengan sus valores máximos posibles. En este caso concreto los números no pueden ser cualesquiera sino que tienen que sumar 15, entonces podíamos pensar que la solución al problema es a=b=c=5, pero como además el enunciado nos dice que los números tienen que ser distintos entre sí. Podemos afirmar que el resultado es a=5+1=6, b=5 y c=5-1=4. Tema 1 17 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 La solución también se podría haber afrontado de otra forma, comenzando por la búsqueda exhaustiva de las ternas de números naturales distintos entre sí que suman 15, para luego seleccionar aquella que da lugar al producto máximo entre sus elementos. A continuación se indican las 12 posibles ternas y en el orden en el que se han determinado Ternas_naturales_que_suman_15 = {(1,2,12), (1,3,11), (1,4,10), (1,5,9), (1,6,8), (2,3,10), (2,4,9), (2,5,8), (2,6,7), (3,4,8), (3,5,7), (4,5,6)} Como era de esperar están ordenadas en orden creciente del producto de sus elementos, como muestran los siguientes valores Producto_elementos_ternas_naturales_que_suman_15 = {24, 33, 40, 45, 48, 60, 72, 80, 84, 96, 105, 120} Y por tanto, la solución como era de esperar es la terna (4,5,6). La solución más fácil en Scilab puede consistir en anidar tres bucles for para generar todas las posibles ternas de números naturales comprendidos entre 1 y 12, pero quedarse sólo con aquellas cuyos elementos sean distintos entre sí y sumen 15. Para luego elegir de entre ellas la terna cuyo producto de elementos sea máximo. Las siguientes sentencias valen para ello. i=0; for a=1:1:12 for b=1:1:12 for c=1:1:12 if (a+b+c)==15 then if a<>b & a<>c & b<>c then i=i+1; ternassuman15(i,:)=[a b c]; end end end end end y=prod(ternassuman15,2) [maxy,i]=max(y) resultado=ternassuman15(i,:) disp(resultado) En la búsqueda anterior de la solución se han generado 123=1728 posibles ternas, aunque únicamente se han asignado 72 ternas para evaluar el producto de sus elementos, aquellas que cumplen la condición de que sus elementos son distintos entre sí y suman 15, pero aún así estamos por encima de las únicas 12 ternas posibles. Ello se debe a que con esas sentencias hemos generado ternas que únicamente se diferencian de otras por la posición de los términos. Basta incorporar otras condiciones adicionales en los bucles para que se generen un menor número de ternas, por ejemplo podemos forzar a que todas las ternas cumplan que b>a y que c=15-a-b. Las sentencias que permiten ese tipo de búsqueda son las siguientes: i=0; for a=1:1:12 for b=a+1:1:13-a Tema 1 18 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 c=15-a-b if c<>a & c<>b i=i+1; ternassuman15(i,:)=[a b c]; end end end y=prod(ternassuman15,2) [maxy,i]=max(y) resultado=ternassuman15(i,:) disp(resultado) El número de ternas asignadas en este caso se reduce a 31, todavía por encima de las 12 posibles. Otra posible solución algo mejor que la anterior, porque se ejecutaría en menos tiempo y requeriría menos almacenamiento de variables, pasaría por no guardar memoria de todas las ternas que suman 15 sino únicamente de una terna, aquella cuyo producto sea mayor que el de la última terna generada. Esto se consigue con las siguientes sentencias, donde además comprobamos que únicamente se asignan 11 resultados intermedios hasta llegar al resultado definitivo. En definitiva únicamente se exploran las 12 ternas posibles y en el mismo orden en el que se determinaron para la solución mediante lápiz y papel. i=0; producto=1; for a=1:1:12 for b=a+1:1:13-a c=15-a-b if c<>a & c<>b & a*b*c>producto producto=a*b*c i=i+1; ternassuman15(i,:)=[a b c]; resultado=[a b c] end end end disp(ternassuman15) disp(producto) disp(resultado) Con el siguiente resultado en la consola 1. 1. 1. 1. 1. 2. 2. 2. 2. 3. 3. 4. 2. 3. 4. 5. 6. 3. 4. 5. 6. 4. 5. 5. 12. 11. 10. 9. 8. 10. 9. 8. 7. 8. 7. 6. 5. 6. 120. 4. Puesto que el problema planteado en este ejemplo se ha abordado de forma numérica por búsqueda exhaustiva, no hay gran diferencia entre utilizar Scilab o Maxima. En Maxima nos vamos a limitar a reproducir la última de las soluciones, presentando las Tema 1 19 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 ternas y el producto resultante según se van generando, con el siguiente resultado en la ventana principal de wxMaxima. 1.4 LECTURA COMPLEMENTARIA El estudiante debe complementar este tema con la lectura de: Apartados 1, 2 y 3 del documento Introduction to Scilab Apartados 1 y 2 del documento Primeros pasos en Maxima Sin olvidar la ayuda disponible en Scilab en wxMaxima. También es conveniente que consulte los términos “Sistema algebraico computacional” y “Análisis numérico o cálculo numérico” en la versión española de la enciclopedia libre Wikipedia donde encontrará referencias y enlaces que le permitirán ampliar sus conocimientos sobre el tema. Tema 1 20 HERRAMIENTAS INFORMÁTICAS PARA MATEMÁTICAS (Apuntes elaborados por el equipo docente para el curso 2011-12) Tema 2 ELEMENTOS BÁSICOS DE LOS LENGUAJES MATEMÁTICOS En este tema se presentan los elementos básicos que se emplearán en las herramientas matemáticas Scilab y Máxima para la solución de problemas. Estos elementos básicos se usarán tanto en la solución de los problemas matemáticos complejos como en los más sencillos. Por esta razón, el dominio de la sintaxis de estos elementos será un paso fundamental en el buen aprendizaje de estas herramientas. El tema está divido en los siguientes apartados: Operadores, variables y expresiones Estructuras de datos y matrices Operaciones y funciones elementales Representaciones gráficas 2.1 OPERADORES, VARIABLES Y EXPRESIONES En este apartado se mostrarán los operadores matemáticos básicos como son la multiplicación o la suma. Se mostrará como se definen variables y los distintos tipos de datos a emplear, que pueden ser desde números enteros a cadenas de caracteres, o variables simbólicas. Se dejará para desarrollar en apartados posteriores el uso y las operaciones de matrices y otras estructuras de datos como son las listas. 2.1.1 Operadores y expresiones Tanto Scilab como Maxima permiten realizar distintos tipos de operaciones. Se podrá clasificar las operaciones matemáticas en tres grandes grupos. Operaciones aritméticas Operaciones lógicas Operaciones de comparación Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Operaciones aritméticas Las operaciones aritméticas se realizan con operandos numéricos, ya sean entre valores numéricos definidos y/o variables simbólicas. Las operaciones aritméticas básicas empleadas en Scilab y en Maxima se muestran en la siguiente tabla: Operación Scilab y Maxima Suma + Resta Multiplicación * División / Potenciación ^ o ** Tabla 2.1 Operaciones aritméticas básicas. En primer lugar se muestra un ejemplo de Maxima realizando operaciones aritméticas simbólicas mezcladas con valores numéricos. Código 2.1 Ejemplo de operaciones aritméticas en Maxima mezclando valores numéricos con variables simbólicas. A continuación se muestra un ejemplo de como realizan las mismas operaciones numéricas las dos herramientas. Scilab Maxima Tabla 2.2 Ejemplo de operaciones aritméticas. Tema 2 2 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 A pesar del parecido en la sintaxis de las operaciones, se observan algunas diferencias. La llamada al valor de la última evaluación en Scilab se realiza empleando ans. Maxima emplea el símbolo %. Otra diferencia se refiere a la manera para no mostrar la salida de una evaluación. Scilab emplea el caracter ; y Maxima emplea el caracter $. Operaciones lógicas Las operaciones lógicas tienen como operandos elementos booleanos y dan como resultado un valor booleano (verdadero o falso). Este tipo de datos se analizará en los siguientes apartados junto con el resto de tipos. Operación Scilab Maxima & and y | or o ~ not no Tabla 2.3 Operaciones lógicas básicas. Operadores lógicos más complejos pueden ser construidos a partir de combinaciones de los operadores and, or y not. Operaciones relacionales Los operadores relacionales permiten comparar operandos numéricos dando como resultado un valor booleano. Este tipo de operaciones son especialmente interesantes para el control de flujo de programas. También tienen gran interés para el control de errores. Operación igualdad desigualdad menor menor o igual mayor mayor o igual Scilab Maxima == = ~= ó <> # < < <= <= > > >= >= Tabla 2.4 Operaciones relaciones. Existe una diferencia importante en el uso de estos operadores en las dos herramientas. Scilab realiza la sustitución numérica de los valores numéricos y comprueba si cumple el operador. Los operadores relacionales empleados en Maxima deben ser evaluados empleando las funciones is() o maybe(). Es posible realizar operaciones relacionales entre variables simbólicas con Maxima. A continuación se muestra un sencillo ejemplo que compara la igualdad o desigualdad de una misma variable. Código 2.2 Comparación de variable simbólica en Maxima. Tema 2 3 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 A continuación se muestra un ejemplo del empleo de algunos operadores relacionales. Se puede observar en el ejemplo que las expresiones de entrada %i13 y %i16 no evalúan la igualdad. Scilab Maxima Tabla 2.5 Ejemplo de operaciones relacionales. Existen otros muchos operadores que los mostrados anteriormente para ambas herramientas. Se recomienda consultar el apartado operadores de la ayuda de Maxima y el capítulo 3 del manual de Baudin para Scilab. En este apartado se han visto los operadores para elementos unitarios. En apartados posteriores veremos operadores para matrices. 2.1.2 Variables En el apartado anterior se han empleado las herramientas matemáticas como calculadoras. Tanto Scilab como Maxima permiten emplear variables para almacenar datos o bien emplear estas variables para realizar cálculos simbólicos. Las variables pueden ser nombradas con una combinación de los caracteres ASCII, siempre teniendo cuidado de no utilizar como nombre de variable un término reservado. La asignación de un valor a una variable se muestra en el siguiente ejemplo. Scilab Maxima Tabla 2.6 Ejemplo de asignación de valor a variables. Tema 2 4 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Constantes A diferencia de las variables, las constantes almacenan valores que no cambian. Habitualmente expresan constantes matemáticas conocidas. Tanto en Scilab como en Maxima se emplea en muchos casos % como prefijo para algunos nombres reservados para representar constantes. El nombre de estas constantes no deben ser empleadas como nombre para variables. En la siguiente tabla se muestran algunas de las constantes más importantes. Constante Scilab Maxima %pi %pi %e %e Constante de Euler %i %i Número imaginario %T ó %t true ó True Booleano verdadero %F ó %f false ó False Booleano falso inf Infinito positivo Tabla 2.7 Algunas constantes en Maxima y Scilab. 2.1.3 Tipos de datos Las herramientas matemáticas deben ser capaces de manipular distintos tipos de números como son los enteros, los de coma flotante de la precisión requerida, o números de tipo complejo, pero además cadenas de caracteres, tipos booleanos, o en el caso del cálculo simbólico expresiones polinómicas. Tanto Scilab como Maxima permiten el empleo de gran variedad de tipos, permitiendo una gran versatilidad en el desarrollo de programas de alto nivel. Tipos numéricos En Scilab las variables numéricas por defecto se definen como un tipo de coma flotante de doble precisión. Los tipos numéricos permiten la conversión entre sus distintos tipos, por ejemplo entre coma flotante y enteros de la precisión deseada. A continuación se puede ver un ejemplo de la conversión de tipos numéricos en Scilab. Tema 2 5 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 2.3 Conversión de tipos con Scilab. Tipo Código type() Real o complejo 1 Polinomio 2 Booleano 4 Enteros de cualquier precisión 8 Cadena de caracteres 10 Lista 15 Tabla 2.8 Código type() de tipos en Scilab. En el ejemplo mostrado en el código 2.3 se puede ver como al asignarle un valor de tipo real a una variable en Scilab se convierte en una variable de tipo real. Posteriormente, se convierte esta variable de tipo real a tipo entero de 8 bits con signo. Al consultar de nuevo a la función type(), devuelve el código correspondiente. Ahora se le asigna un valor complejo, donde el primer argumento de complex() es la parte real y el segundo la parte imaginaria. Algunos de los códigos que devuelve la función type() se muestran el la tabla adjunta. En Máxima existen distintos tipos numéricos: Enteros (73647). Racionales, representados por el cociente de números enteros ( Tema 2 7 ). 9 6 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Coma flotante o decimales y decimales de doble precisión (1.76235464). Números complejos, donde los coeficientes del número complejo deben ser del tipo decimal (6.23+3.56*%i). En el siguiente ejemplo se puede observar como se define la variable c como tipo racional, pudiendo evaluar su valor decimal (float). Código 2.4 Conversión de tipos en Maxima En el siguiente ejemplo se puede observar como la representación de los números decimales y enteros en formato decimal, llamada notación científica, donde las potencias de 10 se expresa en Maxima con el carácter b. En Scilab se emplea el carácter D. La precisión de la salida del número decimal en Scilab se define con la expresión format(), donde los parámetros de la expresión son el tipo de formato. En nuestro ejemplo, el formato científico es `e` seguido por el número de total de dígitos. En Maxima la precisión del tipo decimal se define empleando la expresión fpprec. Scilab Maxima Tabla 2.9 Precisión numérica. Tema 2 7 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Otros tipos Además de los tipos numéricos, las herramientas matemáticas pueden manipular otros tipos de datos. En Maxima, el tipo cadena de caracteres se define como una secuencia de caracteres entre comillas “cadena”. En Scilab, la definición de una cadena de caracteres se realiza de manera similar a Maxima, pero en este caso empleando comillas simples ‘cadena’. Maxima Scilab Tabla 2.10 Definición de cadenas de caracteres. Scilab permite la definición de tipo polinómico, dirigido a la manipulación simbólica. Sin embargo, debido a la potencia de Maxima para el cálculo simbólico, no se podrá de relieve las capacidades de cálculo simbólico que permite Scilab. 2.2 ESTRUCTURA DE DATOS Y MATRICES Las variables permiten almacenar, tanto en Scilab como en Maxima más de un dato y de distintos tipos en una misma variable. Para almacenar varios datos de un solo tipo se van a emplear las matrices. Para almacenar datos de distinto tipo, se pueden emplear otros tipos, como son las listas o estructuras, entre otros. 2.2.1 Estructuras de datos Hay varios tipos de estructuras de datos que se deben contemplar, los arrays, las listas y las estructuras. Tanto Scilab como Maxima tienen sus tipos equivalentes, ya que estos conceptos vienen heredados de lenguajes de programación de más bajo nivel. Arrays Tanto en Maxima como Scilab se pueden emplear arrays. Este tipo de estructura de datos permite almacenar datos de distintos tipos. En Scilab se llaman cell array, y en Maxima simplemente array. Un array en Scilab es un caso particular de lista. Sin embargo, en Maxima, el acceso a los datos del array es más rápido que si los datos hubieran sido almacenados en listas. Se muestra a continuación algunos ejemplos de cómo declarar un array, y acceder y definir los valores de un array. Tema 2 8 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 2.5 Declaración de un array con elementos de distintos tipos en Maxima. En este primer ejemplo se observa como se puede declarar un array en Maxima empleando la función array(). Esta función tiene como argumentos, el nombre que tendrá el array, y los siguientes definen la dimensión del array. Se puede observar que los índices del array comienzan por 0, por lo que el array del ejemplo, un_array_en_Maxima, tendrá una dimensión de 4x3. En las expresiones de entrada 2, 3 y 4 se introducen los valores de tres términos del array empleando la sintaxis de []. Se puede observar que los tipos empleados son distintos. En la expresión de entrada 6 se solicita la salida de un valor específico. Finalmente se podrán solicitar todos los valores del array almacenados empleando la función listarray(). Código 2.6 Declaración de un array con elementos de distintos tipos en Scilab. Tema 2 9 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 En este ejemplo para Scilab, se realizan las mismas operaciones que en el ejemplo anterior con Maxima. Se define un array empleando la función cell(), donde los argumentos son las dimensiones del array. Los índices del array comienzan por 1, por lo que la dimensión del array definido es de 3x2. Para introducir datos en el array se debe emplear la sintaxis siguiente, Nombre_el_array(dim a, dim b, …).entries=valor asignado. El acceso al contenido del array se realiza empleando la siguiente sintaxis, Nombre_el_array(dim a, dim b, …) Si se desea acceder a todo el contenido del array, se llamará simplemente al nombre del array. Estructuras Las estructuras son contenedores que almacenan la información de forma estructurada. La información de las estructuras se almacena en campos que describen las características de los datos que se almacenan en su nombre. Esta es la razón por la que en Scilab el título de los campos deben ser cadenas de caracteres. Se verá a continuación un ejemplo de una estructura que almacena información sobre satélites del sistema solar. Código 2.7 Declaración de una estructura de datos en Scilab. En este ejemplo se puede ver como se crea una estructura mediante la función struct(), donde se introducen los nombres de los campos y la asignación de su valor. Se puede acceder al contenido de cualquier campo de la estructura empleando la sintaxis, Nombre_estructura.campo. Ejemplo 2.1 Cálculo del número de minutos de rotación y de la estimación de la densidad del satélite Ganímedes accediendo a los datos de la estructura del código 2.7. Se accede a los datos del vector del campo del periodo de rotación, que tiene un formato de [días horas minutos], para calcular el número de minutos del periodo de rotación del satélite. Seguidamente, se hace una estimación de la densidad, a partir de la masa y del diámetro del satélite en [Kg/m3]. Tema 2 10 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 2.8 Operaciones empleando campos de una estructura en Scilab. Listas Este tipo de estructura de datos dinámica es considerado en Maxima y Scilab. En Maxima, todas las estructuras de datos son listas, ya que el leguaje Lisp que utiliza como lenguaje de base, está orientado a su manipulación. Comúnmente, este tipo de contenedor ofrece numerosas herramientas para manipular su contenido, como acceder a todos o partes de los datos u ordenarlos. En Scilab se consideran tres tipos de listas, las listas ordinarias list(), las listas de tipo typed, tlist(), y las listas de tipo typed orientadas a matrices, mlist(). La primera, la lista ordinaria tiene propiedades muy parecidas a los arrays. Las listas de tipo typed, son muy útiles para estructurar información. Se verá en el siguiente ejemplo el uso de una lista de tipo typed, donde se almacenan algunas propiedades de elementos químicos. Código 2.9 Declaración de una lista en Scilab. Tema 2 11 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Se puede observar que en las listas tlist(), el primer termino de la lista almacena los campos, y los siguientes términos los datos asociados a dichos campos con el mismo orden. El primer campo del primer término no se contabiliza como campo. En el ejemplo, se puede observar como acceder a la información de las lista empleando tanto el índice como el nombre del campo. Las listas de tipo typed orientada a matrices, es similar a las de tipo typed ordinario, pero tienen como peculiaridad que no permiten el acceso a datos empleando índices. Las listas en Maxima son parecidas a las listas ordinarias de Scilab. Se definen empleando [] en la definición de la variable. Código 2.10 Declaración de una lista en Maxima. Se han aprovechado los ejemplos anteriores para mostrar la salida de caracteres en consola combinando cadenas de caracteres y números. En el caso de Scilab se han empleado disp() y la función string(), que convierte una variable numérica en una cadena de caracteres. En Maxima se ha empleado la función concat(). 2.2.2 Matrices Este tipo de variable permite almacenar un conjunto de datos de manera ordenada. Las matrices pueden tener la dimensión deseada. El tipo de datos debe ser el mismo y el acceso a un dato de la matriz se suele realizar mediante los índices de la posición que ocupa. Una de las grandes utilidades matemáticas que tienen las herramientas de matemáticas de alto nivel es la manipulación matricial. En áreas de las matemáticas, de la física y de las ingenierías su uso es indispensable. Tanto Scilab como Maxima ofrecen una gran cantidad de funciones para manipular matrices. A continuación se muestra como se define una matriz y como se accede a los datos en ambos lenguajes. Tema 2 12 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 2.11 Definición de los componentes de una matriz en Scilab. Se puede observar en el ejemplo anterior de Scilab, que las matrices se definen introduciendo los datos entre corchetes[], donde los componentes de las filas están separados por espacios y las columnas por ; . El acceso a un término de la matriz se realiza mediante el índice que ocupa entre paréntesis (). Se puede emplear el término : para definir un rango de índices, si sólo se emplea : se rellena con todos los elementos de la fila. Si se emplea 1:3, únicamente se toman los términos 1, 2 y 3. En el ejemplo se puede observar que la construcción de matrices mediante otras matrices es inmediata, sin embargo debe cuidarse la concordancia entre las dimensiones de las matrices. Se verá a continuación como declarar una matriz con componentes simbólicas y como se accede a sus componentes en Maxima. Se emplea la función matrix()para asignar los valores a los componentes de la matriz. Para acceder a un término de la matriz se emplea el nombre de la matriz con los índices del término entre corchetes []. Código 2.12 Asignación de valores simbólicos a una matriz en Maxima. En el ejemplo siguiente se realizan las mismas operaciones de matriz que en el ejemplo anterior con Scilab. Se va a emplear la función submatrix(), que permite eliminar componentes de la matriz. Los dos primeros coeficientes numéricos de la función son las filas y las columnas a eliminar. La función addrow() permite concatenar matrices con la misma dimensión de filas. Tema 2 13 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 2.13 Definición de los componentes de una matriz en Maxima. Las operaciones más sencillas entre matrices y otros números, como las multiplicaciones y potenciación, por ejemplo, pueden interpretarse de dos maneras distintas. A B C Donde C, puede ser la operación elemento a elemento, cij aij bij o bien, el producto matricial, n cij aik bkj k 1 donde n es el número de columnas de A y el número de filas de B. Se puede observar esta diferencia en las operaciones en Scilab. Donde la operación * corresponde al producto matricial y el mismo símbolo precedido por un punto, . , la operación elemento a elemento. Tema 2 14 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 2.14 Operaciones de multiplicación con Scilab. Maxima también contempla esta posibilidad en el producto. En el siguiente ejemplo se observa como el operador * realiza el producto elemento a elemento y el operador . realiza el producto matricial. En el ejemplo se observa la multiplicación de un escalar por una matriz de elementos unidad, ones(dim_filas, dim_filas). En el caso de la multiplicación por un escalar el resultado de emplear un operador u otro nos dará el mismo resultado. Código 2.15 Operaciones de multiplicación con Maxima. Tema 2 15 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Se puede observar como las mismas operaciones matriciales realizadas de manera numérica por Maxima pueden ser realizadas de manera simbólica, incluyendo incluso valores numéricos. Código 2.16 Operaciones aritméticas de matrices con componentes simbólicas con Maxima. En la siguiente tabla se observa la diferencia entre los operadores básicos matriciales de Maxima y Scilab. Operaciones Scilab .* Producto elemento-elemento * Producto matricial ./ División elemento-elemento / División matricial .^ Potencia elemento-elemento ^ Potencia matricial Tabla 2.11 Operaciones entre matrices. Maxima * . / ^ ^^ Además de los operadores básicos mostrados sobre matrices, ambas herramientas pueden realizar gran número de operaciones, como la inversión, transposición, cálculo de autovalores y definición de matrices diagonales, de identidad y nulas de manera inmediata. Estas operaciones se mostrarán en el siguiente apartado. Tema 2 16 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Ejemplo 2.2 Realizar una transformación de rotación sobre una coordenada cartesiana (i,j,k), con origen en (0,0,0). Donde el ángulo de giro , corresponde al eje z. La rotación del sistema respecto a eje z corresponde a la siguiente operación, i ' cos j ' sin k ' 0 sin cos 0 0i 0 j 1 k Solución del ejemplo propuesto para Scilab para el punto (1,1,1) y . Código 2.17 Resolución de problema 2.2 con Scilab. La resolución simbólica del problema se puede realizar en Maxima de la siguiente manera, Tema 2 17 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 2.18 Resolución de problema 2.2 con Maxima. Observa como se pueden incluir valores en Maxima para calcular el valor del ejercicio propuesto. El formato para sustituir las variables simbólicas por los valores numéricos se puede realizar mediante la estructura variable,num. La diferencia que se obtiene entre el cálculo realizado entre Maxima y Scilab es que Maxima ha realizado el cálculo exacto de la solución, mientras que Scilab ha realizado el calculo numérico aproximado. Código 2.19 Resolución de problema 2.2 con Maxima, sustitución de valores de las variables. EJERCICIOS: a b Ejercicio 2.1 Suma a cada elemento de la matriz el valor correspondiente a la c d suma de sus índices en Maxima. Ejercicio 2.2 Comprueba que el producto matricial y la potencia matricial con exponente 2 son equivalentes, emplea la matriz numérica en Scilab. A A A2 1 2 A 3 4 Tema 2 18 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Ejercicio 2.3 Calcula una matriz donde sus elementos correspondan elemento a elemento con la raíz cuadrada de la siguiente matriz en Maxima. u v A w z u v B w z 2.3 OPERACIONES Y FUNCIONES ELEMENTALES En este aparatado se va a dividir el conjunto de operaciones y funciones elementales en 4 grandes grupos. Operaciones trigonométricas Operaciones entre polinomios Operaciones matriciales Otras operaciones elementales 2.3.1 Operaciones trigonométricas Las herramientas matemáticas Scilab y Maxima permiten realizar las operaciones trigonométricas más importantes. Desde las más básicas como son el seno, el coseno y la tangente, como las funciones inversas de estas, o las hiperbólicas, entre otras. Para obtener la información más detallada sobre el uso de cada una de ellas, consulte los manuales de ayuda de cada herramienta. Habitualmente, las funciones trigonométricas más sencillas tienen una sintaxis del tipo: función(argumento), como por ejemplo sin(%pi/2), expresión válida para ambas herramientas. En primer lugar se mostrará un ejemplo en Maxima sobre el uso simbólico de algunas funciones trigonométricas. Código 2.20 Operaciones trigonométricas simbólicas con Maxima Tema 2 19 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Las operaciones trigonométricas en Maxima pueden ser simplificadas, ofreciendo soluciones más comprensibles al usuario. Estas funciones de simplificación tienen especial importancia en el cálculo algebraico y la manipulación de funciones trigonométricas simbólicas, debido a que las soluciones no se muestran habitualmente de manera compacta. Las simplificaciones y la factorización se estudiarán en el tema 3. A continuación se muestra como se realizan algunos cálculos trigonométricos numéricos y simbólicos con Maxima y Scilab, Scilab Maxima Tabla 2.12 Algunas operaciones trigonométricas con Maxima y Scilab. Se puede observar que en la tabla anterior las operaciones trigonométricas realizadas en Scilab son evaluadas numéricamente. Sin embargo, en Maxima, algunas funciones se han calculado simbólicamente y otras de manera numérica. La razón, es que Maxima tiene un conjunto de soluciones simbólicas para determinados valores. Observa que las dos primeras expresiones se han calculado simbólicamente, mientras que la tercera se ha evaluado numéricamente. Se puede forzar que Maxima calcule numéricamente la solución, tal y como se puede ver en la quinta expresión, si en vez de emplear 2 como argumento se utiliza el valor 2.0. 2.3.2 Operaciones polinómicas Las operaciones polinómicas tienen sentido dentro de la manipulación simbólica de este tipo de expresiones. Los polinomios están compuestos por sumas y restas de potencias naturales de variables, multiplicadas por coeficientes simbólicos o numéricos. En el siguiente ejemplo para Maxima, se puede ver como se han definido varios polinomios en función de la variable x, y como se realizan varias operaciones básicas entre ellos, con resultado no simplificado. Tema 2 20 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 2.21 Operaciones polinómicas con Maxima. Las simplificaciones de expresiones polinómicas se explicarán con detalle en el tema 3. 2.3.3 Operaciones matriciales En las matemáticas, como en otras disciplinas científicas, gran número de operaciones matemáticas requieren del uso de matrices. Scilab y Maxima tienen gran número de funciones que permiten operar con matrices, además de las más sencillas ya vistas anteriormente como las sumas o multiplicaciones, se pueden realizar operaciones específicas como el cálculo de la inversa, la transpuesta o el determinante, entre otras. Cálculo de la inversa Maxima puede calcular la inversa de una matriz empleando la función invert(Matriz). También puede ser expresada mediante la potenciación no conmutativa de exponente -1, Matriz^^-1. En la siguiente figura se muestra el cálculo de la inversa de una matriz de 2x2 de manera simbólica, donde todos sus componentes son distintos. Código 2.22 Inversa de una matriz con Maxima. Tema 2 21 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Scilab realiza la misma función de manera numérica, en este caso sobre una matriz de 3x3. Código 2.23 Inversa de una matriz con Scilab. Cálculo del determinante Maxima calcula el determinante de una matriz empleando la función determinant(Matriz), empleando un método similar a la eliminación de Gauss. Código 2.24 Determinante de una matriz con Maxima. Seguidamente se muestra un ejemplo del cálculo del determinante con Scilab. Scilab emplea la función det(Matriz). Código 2.25 Determinante de una matriz con Scilab. Cálculo de la transpuesta La matriz transpuesta se realiza en Maxima mediante la función transpose(Matriz). Código 2.26 Transpuesta de una matriz con Maxima. Tema 2 22 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 En Scilab la transpuesta de una matriz se calcula mediante el operador ”‘”, Código 2.27 Transpuesta de una matriz con Scilab. Una vez analizadas algunas de las operaciones más básicas, se muestra como se pueden realizar otras operaciones de gran utilidad, Código 2.28 Algunas operaciones matriciales de utilidad con Maxima. En el ejemplo anterior se calcula el rango de la matriz, rank(Matriz). Se declara matrices unidad de orden N, ident(N), y matrices nulas de dimensión NxM, zeromatrix(N,M). Numéricamente, Scilab tiene el mismo juego de funciones que las mostradas en el ejemplo anterior. Tema 2 23 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 2.29 Algunas operaciones matriciales de utilidad con Scilab. Donde el rango de la matriz se calcula empleando la función rank(Matriz). La matriz unidad de orden N, eye(N), y la matriz nula de dimensión N, zeros(N). Se ilustrará el uso de las operaciones matriciales mediante unos sencillos ejemplos. Ejemplo 2.3 Demostración de ortogonalidad de una matriz de 2x2. De manera resumida, una matriz ortogonal debe cumplir que su matriz inversa y su matriz transpuesta sean iguales, por lo tanto: A At I Se resuelve la ecuación dada de manera simbólica para una matriz de 2x2 con Maxima. Código 2.30 Ejercicio 2.3 con Maxima. Las ecuaciones obtenidas son las siguientes: Tema 2 24 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 b c d a a ; c ; b ; d M M M M sólo puede cumplirse cuando el determinante de la matriz sea ad bc 1 y (d a) y ( b c) En el tema 4 se verá como resolver sistemas de ecuaciones no lineales. Ejemplo 2.4 Cálculo de los autovalores de una matriz de 2x2. Los autovalores son las soluciones del polinomio de , q ( ) M I Se resuelve este problema para una expresión general simbólica con Maxima, Código 2.31 Ejercicio 2.4 con Maxima. Una vez obtenido el polinomio en función de l, se resuelve la ecuación mediante la función solve(ecuación, variable). Se puede observar que hay una función específica para calcular los autovalores de una matriz, eigenvalues(Matriz). 2.3.4 Otras operaciones elementales Tanto en el cálculo simbólico de Maxima, como en el cálculo numérico de Scilab, hay otras operaciones, como el cálculo del factorial de un número natural, el cálculo de logaritmos y exponenciales, tanto para cualquier base, como para matrices. También existe la función de raíz cuadrada. A continuación se muestra una tabla con algunas funciones importantes para las dos herramientas. Tema 2 25 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Función Scilab Maxima factorial() factorial() Factorial log() log() Logaritmo natural exp() exp() Exponencial natural sqrt() sqrt() Raíz cuadrada Tabla 2.13 Otras operaciones con Maxima y Scilab. Seguidamente se muestran algunos ejemplos de estas funciones para Maxima y Scilab. Scilab Maxima Tabla 2.14 Ejemplo de otras operaciones con Maxima y Scilab. EJERCICIOS: Ejercicio 2.4 Define las siguientes expresiones en Maxima. a) sin( x 2 e xy y 2 ) log( xy ) b) f1 ( x) x , f 2 ( x, y ) x sin( y ), f3 ( x, y ) e 2 f1 f2 Ejercicio 2.5 Calcula el valor de las expresiones del problema anterior con los valores x 1 e y 0.5 empleando Scilab. Tema 2 26 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Ejercicio 2.6 Calcula las siguientes expresiones con Maxima, N x 2 ax c M bx 3 dx 1 N P M Q eP R sin(Q) 2.4 REPRESENTACIONES GRÁFICAS La representación gráfica es una herramienta fundamental en todas las disciplinas científicas, ya que permite mostrar resultados que pueden se analizados de manera más rápida e intuitiva. Maxima y Scilab cuentan con unas potentes funciones para la representación gráfica. En este apartado se mostrarán algunas de estas funciones. Las funciones gráficas cuentan con numerosos parámetros para mejorar el aspecto de sus representaciones, sin embargo no se hará hincapié en estas características, y se dará mayor importancia a la muestra de los resultados. 2.4.1 Graficas en 2 dimensiones En los ejemplos 1 y 2 del tema 1 ya se mostró como emplear algunas sentencias para generar gráficas en 2 dimensiones con Scilab y Maxima. Una manera sencilla de obtener una representación gráfica en 2 dimensiones, realizando una sustitución numérica de la función sin(x), con x=[0,2] en Scilab se podría realizar de la siguiente manera, Código 2.32 Empleo de la función plot() con Scilab. El resultado se muestra en la siguiente gráfica. La gráfica está formada por 629 puntos equidistantes (0.01) y evaluadas en y. La función empleada es plot(). Tema 2 27 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Figura 2.1 Representación gráfica de 2D con la función plot() en Scilab. De manera similar, Maxima permite realizar este mismo tipo de representación de puntos de una función. En este caso también se representan 8 puntos de la función sin(x), x=[0,3.5]. Es común el uso de la función plot2d() para las representaciones de funciones de 2D. Para la representación de puntos definidos se emplea el parámetro de la función discrete. Código 2.33 Representación de puntos definidos en Maxima. Dando como resultado la siguiente gráfica, donde cada punto discreto se une mediante una línea. Figura 2.2 Representación gráfica de puntos discretos en 2D mediante la función plot2d() en Maxima. Tema 2 28 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Puede ser de interés mostrar en la misma gráfica valores discretos y funciones simbólicas. En Scilab, todos los valores son discretos, por lo tanto, esta tarea se realiza representando graficas con más de una función. En Maxima se puede hacer dentro de una sola llamada a la función plot2d(). En el siguiente ejemplo, se desea representar simultáneamente los valores experimentales y los valores teóricos calculados. Código 2.34 Representación en la misma gráfica de puntos discretos y de una función simbólica en Maxima. En el ejemplo anterior, en primer lugar se declaran los pares de puntos del experimento. Dentro de la función, se definen los puntos discretos que se desean representar gráficamente y la función. Se aprovecha este ejemplo del uso de esta función para ilustrar el manejo de algunos parámetros para definir el aspecto de la función plot2d(). El parámetro style, define el aspecto de points y lines de las gráficas. Estos parámetros corresponden con el formato de los puntos y de las líneas que los unen. El parámetro leyend, define los nombres de las leyendas para cada gráfica. Los parámetros xlabel e ylabel definen los nombres de los ejes. Puede observar que las definiciones siguen el orden en que se han declarado las funciones. El resultado del uso del código de Maxima es el siguiente, Figura 2.3 Representación gráfica de puntos discretos y función en Maxima. Tema 2 29 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Sin embargo, debe decirse que Maxima está orientada a la representación gráfica de la función simbólica. La función plot2d(), también puede realizar esta tarea. En este caso, la sintaxis de la función será: plot2d(función, [variable, min_var, max_var]), Código 2.35 Uso simple de la función plot2d(). Esta expresión da como resultado la siguiente gráfica, Figura 2.4 Representación gráfica de una función simbólica en 2D (plot2d()) con Maxima. Una de las propiedades de la ventana gráfica de Maxima es que muestra la posición del cursor en el borde inferior izquierdo. Maxima permite la representación gráfica desde la propia ventana de wxMaxima, accediendo desde el menú Gráfico, se pueden hacer representaciones en 2 y 3 dimensiones. En la siguiente figura se ilustra el ejemplo anterior empleando el interface gráfico que ofrece wxMaxima para la función en 2 dimensiones. Figura 2.5 Ventana de wxMaxima para la representación gráfica de funciones. Tema 2 30 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Se puede representar funciones paramétricas con Maxima, empleando el parámetro de plot2d(), parametric. Ejemplo 2.5 Representación gráfica de una elipse. En este caso se representa una elipse mediante ecuaciones paramétricas: x a cos(t ) y b sin(t ) Para obtener la representación grafica de estas ecuaciones paramétricas se emplea el código mostrado a continuación, Código 2.36 Representación gráfica de funciones paramétricas del ejercicio 2.5. En este caso, después de emplear el parámetro parametric, se introduce las dos funciones. El siguiente vector de parámetros corresponde a la variable y los valores mínimo y máximo de esta. Finalmente, se indica el número de puntos que debe componer la gráfica. En este caso, se dibuja la elipse entre [0,2], empleando 20 puntos. Se puede mejorar la precisión de la gráfica aumentando el número de puntos. Como resultado se obtiene la siguiente representación, Figura 2.6 Representación gráfica de una función paramétrica del ejercicio 2.5. Tema 2 31 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Ejemplo 2.6 Dibujar una espiral representada por las siguientes ecuaciones, donde la espiral da 5 vueltas completas. x t cos(t ) y t sin(t ) Para representar esta función, se emplea la representación gráfica paramétrica de Maxima. Código 2.37 Representación gráfica de funciones paramétricas del ejercicio 2.6. La gráfica obtenida se muestra a continuación, Figura 2.7 Representación gráfica de una espiral con Maxima. Ejemplo 2.7 Representación grafica de la función 3x 2 y 2 6 y de las asíntotas, y y 6 x 2 6 x 2 La función planteada es una hipérbola. En su forma canónica se puede expresar como, x2 y2 1 2 6 Tema 2 32 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Las funciones hipérbola no está evaluadas para algunos valores de x. Se puede representar esta función en forma paramétrica mediante las siguientes ecuaciones, x 2 sec(t ) y 6 tan(t ) Empleando la siguiente sentencia para Maxima, se obtiene la representación mostrada a continuación. Código 2.38 Representación gráfica de una hipérbola en forma paramétrica. Figura 2.8 Representación gráfica de una hipérbola con Maxima. Maxima permite representar en la misma gráfica funciones y curvas paramétricas. Se emplea la siguiente sentencia en Maxima, Código 2.38 Representación gráfica de una hipérbola en forma paramétrica y sus asíntotas. Se puede observar que las funciones se han descrito en primer lugar y como las curvas paramétricas emplean internamente las variables x e y. También se definen simultáneamente los límites de la gráfica para los dos grupos de funciones. El resultado de esta expresión se muestra a continuación, Tema 2 33 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Figura 2.9 Representación gráfica de una hipérbola y sus asíntotas con Maxima. En Maxima se puede usar indistintamente la función plot2d() o wxplot2d(). La diferencia es que la primera produce una salida independientemente de wxMaxima y la segunda incluye como salida del propio programa la representación gráfica. Se verá a continuación como representar varias funciones en la misma gráfica. Scilab puede representar funciones de manera más compacta que como ha sido mostrado anteriormente. Ejemplo 2.8 Representa una familia de funciones en la misma gráfica. f1 ( x) x cos( x) f 2 ( x) x cos 2 ( x) f3 ( x) x 2 cos( x) El código de Scilab empleado para representar simultáneamente esta familia de funciones se muestra a continuación. Código 2.39 Representación gráfica de una familia de funciones con Scilab. Observa que a diferencia del ejemplo anterior del empleo de la función plot(), esta función obliga a introducir un vector de la variable x con el formato adecuado. El resultado se muestra a continuación. Tema 2 34 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Figura 2.10 Representación de varias funciones en la misma gráfica con Scilab. Para dibujar más de una gráfica en Maxima se debe emplear el siguiente formato de plot2d(). Figura 2.11 Código y representación de varias funciones en la misma gráfica con Maxima. En este caso se definen las funciones f1, f2, f3 previamente. 2.4.2 Graficas en 3 dimensiones En este apartado se mostrarán algunas de las representaciones gráficas en tres dimensiones que ofrecen Scilab y Maxima. Las capacidades de representación gráfica se van a ilustrar mediante varios ejemplos. Tema 2 35 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Ejemplo 2.9 Representación gráfica de la siguiente función, f ( x, y ) e x sin 2 ( y ) x [0, 2], y [0, 2] A continuación se muestra el código de Scilab empleado, observa que las matrices de datos de la cuadrícula y de la función deben tener el formato adecuado. Código 2.40 Representación gráfica mediante la función plot3d() en Scilab. El resultado de ejecutar el código anterior se muestra en la siguiente figura, Figura 2.12 Representación gráfica empleando la función plot3d(). En este caso se ha empleado la función plot3d()de Scilab, el uso es muy parecido a la función fplot3d(), que se muestra en el siguiente ejemplo. La figura ha sido girada manualmente mediante la herramienta de giro de la ventana gráfica. En el siguiente ejemplo se muestra como se puede configurar el ángulo de la vista. Ejemplo 2.10 Representación grafica de la función de Rosenbrock, f ( x, y ) (1 x) 2 100( y x 2 ) 2 x [2, 2], y [1,3] Tema 2 36 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 La función de Rosenbrock es una función muy empleada para la evaluación de algoritmos de optimización. Esta función tiene la peculiaridad de no tener un único mínimo, como se podrá ver a continuación. Se va a obtener una representación gráfica en 3D de la función de Rosenbrock empleando el siguiente código de Scilab. Código 2.41 Representación gráfica de la función de Rosenbrock en Scilab. En primer lugar se definen los puntos de las variables que se desean representar, definiendo un vector para cada variable. Posteriormente se define una función z ( x, y ) , que representa la función de Rosenbrock. En la función fplot3d(), se definen las variables y la función a representar. En este caso se han añadido dos parámetros, que representan los ángulos de visualización de la gráfica. En resultado obtenido es el siguiente, Figura 2.13 Función de Rosenbrock con Scilab. Tema 2 37 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Ejemplo 2.11 Obtener estimativamente el mínimo de la siguiente función a partir de su representación gráfica, V V S ( x, y ) 2 xy x y V 1 En este ejercicio será adecuado el uso de la representación gráfica mediante contornos. Este tipo de gráfica consiste en una representación de 2 dimensiones donde los ejes son las variables y mediante curvas se representan los valores de la función que tienen el mismo valor. Se representa la gráfica del contorno de la función S ( x, y ) empleando Maxima. En primer lugar se define la función a representar. Posteriormente se emplea la función contour_plot() para obtener una gráfica de contorno. La sintaxis de esta función sin parámetros especiales es, contour_plot(función,[v1,lim_inf_v1,lim_sup_v1], [v2,lim_inf_v2,lim_sup_v2]). Para controlar los valores de las curvas del contorno se asignan valores discretos empleando el parámetro de gnuplot_preamble, cntrparam levels discrete. Código 2.42 Empleo de contornos en Maxima. En la siguiente figura se muestra el resultado de ejecutar este código, donde se puede observar que al posicionar el cursor sobre la posición aproximada correspondiente al mínimo, el valor de las coordenadas están cercanas a los valores x 1 e y 1 . Por lo tanto el valor mínimo de la función estaría en torno a este valor S (1,1) 6 . Figura 2.14 Contorno de la función S ( x, y ) para determinados valores discretos en Maxima. Tema 2 38 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Ejemplo 2.12 Representación gráfica del contorno y 3D de la función Griewank, para dos variables y x1 , x2 6, 6 . f ( x1 , x2 ,..., xn ) 1 1 n 2 n x xi cos i 4000 i 1 i i 1 Esta función es empleada habitualmente para la evaluación de algoritmos de optimización global. La función Griewank es una función multimodal y admite el número de dimensiones deseadas. La ecuación que se empleará para la representación de 3D será, z ( x, y ) 1 1 y x 2 y 2 cos x cos 4000 2 Un rango típico para este sistema es x, y 20, 20 . Un ejemplo de código en Scilab para obtener este resultado se muestra a continuación, Código 2.43 Representación grafica de la función de Griewank mediante contornos en Scilab. En este caso para visualizar mejor el resultado se ha seleccionado el rango x, y 6, 6 , En este código se ha empleado la función linspace(), para conseguir 100 elementos equiespaciados en el rango deseado. El manejo de esta función es más cómoda que definir la distancia entre los puntos. Después se ha creado la función z. En apartados posteriores se mostrará las características de estas estructuras. El resultado obtenido es el siguiente, Tema 2 39 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Figura 2.15 Contorno de la función Griewank con Scilab. A continuación se muestra como realizar esta misma tarea con Maxima. Código 2.44 Representación grafica de la función de Griewank mediante contornos en Maxima. En primer lugar se define z como función de x e y. Las funciones gráficas de Maxima admiten multitud de opciones. La manera de introducirlas es mediante la función set_plot_option(). En este caso se define el número de niveles equiespaciados que se desea representar en la gráfica de contorno. Esta es una propiedad de gnuplot, cntrparam levels. Finalmente se llama a la función contour_plot(), que tiene como argumentos la función a representar, y en los vectores, la variable y el rango correspondiente. El resultado obtenido es el siguiente, Tema 2 40 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Figura 2.16 Código y representación grafica de la función de Griewank mediante contornos en Maxima mediante la función wxcontour_plot(). Seguidamente se muestra como realizar la representación en 3D de esta misma función. Código 2.45 Representación grafica de la función de Griewank en 3D con Scilab. Como se puede ver, el código comienza de la misma manera que en el caso de graficar el contorno. La diferencia entre el contorno y una superficie en 3D, es que se debe definir todos los puntos de la superficie. En primer lugar se realiza un mallado de las variables x e y, empleando la función ndgrid(), en la que se introduce el vector en el rango de cada variable y se obtiene una matriz de todos los puntos de la superficie espaciados como se definió con la función linspace(). Se evalúan los puntos del mallado en la función z y finalmente se emplea la función surf() para obtener una gráfica de la superficie. El resultado obtenido es el siguiente, Tema 2 41 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Figura 2.16 Representación grafica de la función de Griewank mediante una superficie en Scilab. A continuación se realizará la misma tarea en Maxima. La manera de graficar en Maxima una superficie es muy sencilla. Se puede observar como se ha resuelto el problema de igual modo a como se hizo con el contorno, pero empleando la función plot3d(). Figura 2.17 Código y representación grafica de la función de Griewank mediante una superficie en Maxima. EJERCICIOS: Ejercicio 2.7 Representa las siguientes funciones en la misma gráfica, empleando Maxima y Scilab, Tema 2 42 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 y1 x 2 1 y2 3 x 2 y3 e x x 0,3 Ejercicio 2.8 Representa gráficamente la conocida curva paramétrica de mariposa empleando Maxima y Scilab. t x sin(t ) ecos( t ) 2 cos(4t ) sin 5 12 t y cos(t ) ecos(t ) 2 cos(4t ) sin 5 12 Ejercicio 2.9 Representa gráficamente la superficie de una esfera de radio 1, centrada en el punto (1,1,1). Tema 2 43 HERRAMIENTAS INFORMÁTICAS PARA MATEMÁTICAS (Apuntes elaborados por el equipo docente para el curso 2015-16) Tema 3 CÁLCULOS MATEMÁTICOS BÁSICOS En este tema se propone algunos elementos necesarios para la solución de muchos problemas matemáticos básicos. Algunos de estos cálculos, como los límites de funciones, o la diferenciación y la integración, son necesarios en pasos para la resolución de problemas matemáticos más complejos. La factorización o las simplificaciones trigonométricas pueden ser herramientas de gran utilidad para el análisis de soluciones. El tema estará dividido en los siguientes apartados: Límites, diferenciación e integración. Factorización, simplificaciones y desarrollos en serie. Simplificaciones trigonométricas 3.1 LÍMITES, DIFERENCIACIÓN E INTEGRACIÓN 3.1.1 Límites La diferencia esencial entre el cálculo del límite de funciones empleando Maxima y Scilab es el empleo de cálculo simbólico para realizar las operaciones. Se puede observar que Maxima tiene una función dedicada al cálculo de límites, dando como resultado el valor exacto y Scilab nos permitirá realizar cálculos numéricos, dando un valor aproximado, desarrollando los conceptos de la definición de límite,-. Sin llegar a realizar una definición detallada y formal de límite de una función. El límite de una función f(x) cuando x tiende a un valor c es L, lim f ( x) L x c se puede aproximar al valor de f(x), L, tanto como se desee, ya que siempre se podrá encontrar un valor de x cercano a c que lo permita. Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 0 0 : x(0 x p f ( x) L Para ilustrar el problema de los límites, se desarrollan algunos ejemplos típicos. Ejemplo 3.1 Calcular el siguiente límite, lim x 2 2sin( x) 3cos( x) Para solucionar este problema con Scilab, se puede crear la siguiente rutina, Código 3.1 Cálculo de límite en Scilab. En este caso se estaría cometiendo un error, ya que el problema presenta distintos valores si se realiza el límite de la función por la derecha o por la izquierda de 2 . Es recomendable, sobre todo si no se conoce la función, que en Scilab se calcule el límite a la derecha y a la izquierda. Una rutina más adecuada se muestra a continuación, Código 3.2 Cálculo de límite en Scilab. El resultado obtenido muestra un valor que se puede considerar infinito numéricamente. Obteniendo el resultado infinito positivo por la izquierda e infinito negativo por la derecha. Según la definición de límite se puede obtener valores más cercanos al límite de la función si se aproxima al valor de la variable, haciendo más pequeño. Se realiza esta misma operación con Maxima. Tema 3 2 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 3.3 Cálculo de límite con Maxima. Se puede ver que para el cálculo de límites con Maxima, se emplea la función limit(). La sintaxis de esta función es la siguiente: limit(función, variable, límite, sentido de aproximación) En el ejemplo se observa que el resultado es distinto si se añade el parámetro minus o plus, realizando la aproximación al límite por la izquierda o por la derecha respectivamente, ya que la función tangente es discontinua. Si no se emplea este argumento, Maxima muestra como salida el valor de infinito complejo, infinity. También se puede considerar el límite de una función tendente a infinito. Se ilustra este tipo de límites con un ejemplo. Ejemplo 3.2 Calcular el siguiente límite, x2 1 x 2 x 2 x 5 lim El planteamiento numérico del problema con Scilab sería el siguiente, Código 3.4 Calculo de límite y representación gráfica en Scilab. La utilidad de visualizar numéricamente el límite de la función es útil. La gráfica resultante se muestra a continuación. Se puede observar que el límite de la función cuando se aumenta el valor de x, tiende al valor 0.5. Tema 3 3 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Figura 3.1 Valor del límite de la función frente al valor límite de la variable. Se procede a calcular el límite de esta función empleando Maxima. Código 3.5 Cálculo de límite infinito en Maxima. El resultado obtenido del cálculo del límite es exacto, el valor de la variable se declara como inf, infinito positivo, pero también se puede declarar infinito negativo mediante minf. Código 3.6 Cálculo de límites infinitos en Maxima. Maxima ofrece también una herramienta útil, como la detección de límites acotados indeterminados. Se muestra a continuación un ejemplo de este tipo de límites. Ejemplo 3.3 Calcular del límite, 1 lim sin x 0 x La evaluación de esta interesante función produce en Scilab los siguientes resultados, Tema 3 4 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 3.7 Aproximación numérica del límite en Scilab. A la vista de los resultados se podría decir que la función es simétrica respecto al valor 0, pero aparentemente no muestra convergencia a un valor determinado. Se genera una representación gráfica para comprender mejor la función, Código 3.8 Representación gráfica en Scilab de una función con límite indeterminado. El resultado es el siguiente, Tema 3 5 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Figura 3.2 Función con límite indeterminado en Scilab. En la gráfica se puede observar que la función tiene un límite indeterminado, estando acotada entre -1 y 1. Los valores negativos de la función tienen un comportamiento simétrico. En Maxima, el resultado de calcular el límite de la función es ind, esta salida informa al usuario que el límite es indeterminado y acotado, pero no informa cual es el rango en el que está acotado. Código 3.9 Función con límite indeterminado en Maxima. 3.1.2 Diferenciación En este apartado se muestra como se realiza el cálculo de las derivadas. Se emplean dos enfoques distintos, obtención de la derivada de manera simbólica y obtención de su aproximación numérica. Se muestra en primer lugar la potencia de Maxima para el cálculo de la derivada de una función con una sola variable independiente. Se propone como ejemplo sencillo la función, f ( x) x 2 sin( x) Se calcula df ( x) , dx Código 3.10 Diferenciación en Maxima. Tema 3 6 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Se puede observar en el ejemplo como se emplea la función diff(), donde en este caso, la sintaxis tiene la forma, diff(función, variable independiente) Se puede observar un ejemplo similar, pero empleando 2 variables independientes, f ( x, y ) x 2 sin( yx) Se calcula df ( x, y ) df ( x, y ) , dx dy Código 3.11 Diferenciación en Maxima. La función diff(), también permite realizar la derivada n de la función deseada. En este caso, se pretende calcular la derivada décima de la función, f ( x) e ax Código 3.12 Diferenciación en Maxima. Maxima permite definir la dependencia de funciones a variables y realizar sus derivadas sin tener que declararlas. A continuación se muestra un ejemplo. Sea f (u , v), g (u , v) , calcular la derivada de la función, h(u, v) f (u , v) g (u, v) Código 3.13 Diferenciación en Maxima. Se puede observar en el ejemplo que se ha empleado la función depends() para definir la dependencia de unas variables con otras variables. Tema 3 7 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Se mostrará ahora como resolver el cálculo de la derivada de manera numérica con Scilab. Una definición de derivada de una función para un valor determinado de la variable independiente, df ( x) f ( x h) f ( x ) f ( x h) f ( x ) lim lim h 0 h 0 dx ( x h) x h Desde el punto de vista numérico, se puede conseguir un valor numérico preciso de la derivada en un punto de una función si se puede calcular el valor de la función lo suficientemente cerca del punto de evaluación. Se propone la siguiente función como ejemplo, Ejemplo 3.4 Calcular numéricamente la derivada de la función entre [0,3], f ( x) sin( x 2 ) Se propone en siguiente código de Scilab para calcular la aproximación numérica de la derivada como se ha mostrada previamente. Código 3.14 Diferenciación numérica con Scilab*. En este caso, se destaca el error producido al no emplear un valor de h, paso, suficientemente pequeño. Este error se puede aproximar tanto a 0 como se desee. (*) NOTA: Como en este caso el código empleado es más largo que en algunos de los problemas anteriores, se ha decido realizar la secuencia del programa en Scinotes, que permite guardar un programa y ejecutarlo de una sola vez. Los colores que emplea Scinotes se deben a que cuenta con un analizador sintáctico. En apartados posteriores se insistirá en el uso esta herramienta. Tema 3 8 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Figura 3.3 Solución gráfica exacta de la derivada y su aproximación numérica en Scilab. La línea negra corresponde a la solución exacta y la azul a la aproximada numéricamente. Scilab ofrece el uso de una función para simplificar el proceso de la diferenciación numérica. La función diff() calcula la diferencia entre dos valores consecutivos en la función. La función diff() permite calcular la diferencia de manera iterativa, pudiendo obtener la derivada numérica enésima. A continuación se muestra el ejemplo anterior empleando esta función. En este caso solo se emplea la evaluación de los puntos de la función definidos por x, siendo el paso la distancia entre dichos puntos (3/49). Para calcular la segunda derivada se emplearía la sentencia, dfx=diff(fx,2)/h, y así sucesivamente. Código 3.15 Diferenciación numérica con Scilab. Las gráficas obtenidas son similares a las obtenidas con el código anterior. 3.1.3 Integración Las herramientas matemáticas que se emplean en este curso permiten realizar cálculos simbólicos y numéricos de integración. En primer lugar se muestran algunas de las capacidades de cálculo simbólico de Maxima. Una de las funciones más potentes de Maxima es integrate(). Considera dos tipos de integrales, las integrales indefinidas y las integrales definidas. La sintaxis de la función es la siguiente, integrate(funcion,variable), para las integrales indefinidas. integrate(funcion, variable, superior), para las integrales definidas. limite inferior, limite Se muestra a continuación algunos ejemplos, Tema 3 9 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Integral indefinida con Maxima A continuación se muestra algunos ejemplos para ilustrar el cálculo simbólico de las integrales indefinidas con Maxima. Ejemplo 3.5 Calcular las siguientes integrales indefinidas, f ( x) b x dx f ( x) 1 1 x2 dx f ( x) 1 tan 2 ( x)dx Código 3.16 Integración indefinida en Maxima. Maxima permite resolver integrales de forma exponencial, trigonométrica y trigonométrica inversa. Integral definida con Maxima También resuelve integrales definidas. Código 3.17 Integración definida en Maxima. Se puede observar como se pueden resolver numéricamente o simbólicamente los ejemplos propuestos. En el último ejemplo se puede ver el cálculo de la integral de revolución de una esfera parametrizando los límites de la integral. Integral definida con Scilab El cálculo numérico de las integrales definidas se pueden realizar en Scilab mediante la función intg(). La sintaxis de la función intg()es la siguiente, intg(limite inferior, limite superior, función) Tema 3 10 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Esta función, admite además otros parámetros para definir el umbral de error de cálculo. Otra función de similares características a la mostrada anteriormente es la función intergrate(). Admite los mismos parámetros que la función intg(). A continuación se muestra un sencillo ejemplo de su uso. En el ejemplo se puede observar como se declara como parámetro el nombre de la variable a integrar. Código 3.18 Integración definida en Scilab con integrate(). Ejemplo 3.6 Calcular el volumen de una esfera de radio unidad, Se propone el siguiente código de Scilab para solucionar el problema, Código 3.19 Integración definida en Scilab. Las funciones mostradas anteriormente que realizan integrales definidas resueltas numéricamente con Scilab calculan los valores realizando una aproximación rectangular. La función inttrap() realiza una aproximación trapezoidal, mejorando la precisión de cálculo. Una mejor aproximación es la realizada mediante una interpolación de splin, mediante la función intsplin(). A continuación se muestra un ejemplo de integración con dichas funciones. Código 3.20 Integración definida en Scilab, otras aproximaciones. Tema 3 11 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Cambio de variable Maxima permite definir cambios de variable que facilitan la resolución simbólica de las integrales. Para hacer un cambio de variable se emplea la función changevar(). La sintaxis de la función es la siguiente, chagevar(función, variable antigua) función a sustituir, nueva variable, En el siguiente ejemplo se observa como se puede realizar un cambio de variable. Código 3.21 Cambio de variable en Maxima. La primera sentencia define la integral sin evaluarla. x2 dx 3 1 2x La segunda sentencia realiza la sustitución, f ( x, t ) 0 1 2x t3 0 y define que la nueva variable independiente es t. Finalmente se realiza la evaluación de la nueva integral. Funciones especiales Tanto Maxima como Scilab admiten algunas funciones especiales, como las funciones de Bessel, la función Gamma y Beta entre muchas otras. En el ejemplo que se muestra a continuación Maxima resuelve la integral de gamma y de beta. Cuando es capaz de calcular el resultado exacto, lo devuelve como salida. En el último caso, como no es capaz de hacerlo, la salida es la función beta con los parámetros seleccionados, que puede ser manipulada simbólicamente. Tema 3 12 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 3.22 Función Beta y Gamma en Maxima. Scilab también es capaz de calcular numéricamente estas funciones, en el siguiente ejemplo, se muestran las mismas operaciones que se han realizado con Maxima. Código 3.23 Función Beta y Gamma en Scilab. Integrales múltiples Scilab resuelve integrales dobles y triples. Se ilustra estas capacidades con el ejemplo mostrado a continuación. De manera similar a uno de los ejemplos anteriores, se calcula el volumen de una sección de una esfera empleando una integral doble. Ejemplo 3.7 Calcular el volumen de una porción de la esfera correspondiente a x=[0,cos], y=[0,sen], =[0,/2]. Para calcular el 1/8 del volumen de la esfera se debe calcular la siguiente integral doble. r 2 x 2 y 2 dxdy S Tema 3 13 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 La manera de representar esta función no es la más adecuada para representar los límites de la integral, sería más recomendable usar coordenadas polares. Sin embargo para emplear la función int2d() de Scilab es mejor el uso de coordenadas cartesianas. La razón es que se debe realizar un mallado triangular del espacio a integrar. En nuestro problema se divide la superficie en triángulos tal y como se puede ver en la siguiente figura. Figura 3.4 Aproximación geométrica a la solución. Se observa como el cálculo será más preciso cuando el número de triángulos sea mayor. La sintaxis de la función int2d()es la siguiente, [Resultado integral, error]= int2d(X, Y, función a integrar) donde X e Y son las matrices de puntos de los triángulos que conforman la superficie a integrar. El formato de X e Y es el siguiente X x11 , x12 ,..., x1N ; x12 , x22 ,..., x2N ; x31 , x32 ,..., x3N Y y11 , y12 ,..., y1N ; y12 , y22 ,..., y2N ; y31 , y32 ,..., y3N donde xij es la coordenada x del punto i del triangulo j. En el problema propuesto, se calcula el error que supone la aproximación del sector de círculo a integral por medio de triángulos, viendo como afecta al error el número de triángulos que van a ser empleados. Tema 3 14 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 3.24 Solución del ejemplo en Scilab. Para realizar los cálculos propuestos se emplea el código anterior. Se define el número de triángulos mínimo y el máximo (3 y 10). Un bucle for recorre los distintos casos de número de triángulos. Se declara el radio de la esfera r=1. Se asigna las coordenadas del primer punto, común a todos los triángulos, correspondiente a la coordenada (0,0). Se construye otro bucle for que calcula los puntos de triángulos de la misma superficie. Una vez calculados los puntos, se almacenan los puntos en matrices con el formato adecuado. Se define la función a integrar mediante la función deff(). Se aplica la función de integración doble int2d(). Finalmente se crea una representación gráfica que muestra el error entre las distintas aproximaciones por el número de triángulos y el valor exacto de la integral. La gráfica obtenida se muestra a continuación. Se puede observar que la abscisa de la gráfica muestra la posición del dato en la matriz, el valor 1 corresponde al cálculo con 3 triángulos y así sucesivamente. Figura 3.5 Representación gráfica del error de la solución en función del número de triángulos. Tema 3 15 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 De manera similar, Scilab permite resolver integrales triples empleando la función int3d(), esta función precisa la definición del mallado por tetraedros del espacio a integrar. Integrales de variable complejas Scilab permite calcular integrales de variable compleja de Cauchy. La sintaxis de la función intc()que realiza esta tarea se muestra a continuación, intc(límite inferior, limite superior, función a integrar) Esta función realiza la integración de la función de variable compleja recorrido en línea recta en el plano complejo del punto inferior del límite al superior. Ejemplo 3.8 Calcular la siguiente integral definida, 4 0 eit dt Para calcular esta integral se emplea la función intc(), Código 3.25 Integral de Cauchy en Scilab. EJERCICIOS: Ejercicio 3.1 Demostrar las siguientes identidades, 1 x lim(1 x) e x 0 tan( x ) 1 x 0 x Ejercicio 3.2 Calcular las derivadas de las siguientes funciones, lim 2 3 f ( x) (2 x tan( x))(1 e x ) 3ax 2bx 4 8x4 6 x2 1 f ( x) 2 x=1 3 Ejercicio 3.3 Calcular las ecuaciones de las rectas tangentes a la función en los puntos x=2 x=2.5, f ( x) x 2 e x sin( x) Ejercicio 3.4 Calcular el valor de x donde la función alcanza el valor máximo, f ( x) 4 ( x 2) 2 Tema 3 16 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Ejercicio 3.5 Determinar las dimensiones del cono de volumen mínimo circunscrito a una semiesfera de radio R, y donde el plano de la base del cono coincida con la base de la semiesfera. Figura 3.7 Perfil del cono y de una semiesfera circunscrita a este. Ejercicio 3.6 La posición de un objeto en el eje x en función del tiempo está definida mediante función, x(t ) 7 cos(t )t 2 t [0, 4] Calcular la expresión de la velocidad v(t) y de la aceleración a(t) y mostrar su representación gráfica. dx(t ) v(t ) dt dv(t ) a (t ) dt Ejercicio 3.7 Calcular las siguientes integrales, (1 x)e 2 sin( x)dx x2 3 x 7 x a x b 1 dx x 2 1 2 x dx 1 cos 2 ( x)dx 0 Ejercicio 3.8 Obtener una expresión general de la superficie comprendida entre una parábola que corta en la abscisa en 0 y 2 y la rectas tangentes a la parábola en esos puntos, Tema 3 17 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Figura 3.6 Superficie comprendida entre parábola y rectas. 3.2 FACTORIZACIÓN, SIMPLIFICACIONES Y DESARROLLOS EN SERIE 3.2.1 Factorización y simplificaciones Factorización La factorización de una expresión consiste en la construcción de otras expresiones equivalentes formadas mediante el producto de expresiones más pequeñas. La factorización puede ser realizada sobre números, polinomios u otras expresiones simbólicas. Por ejemplo, un caso particular de factorización es el cálculo de las raíces de un polinomio, en cuyo caso se calculan los factores del producto que aportan información sobre los valores que hacen 0 dicho polinomio. En este apartado se mostrará la factorización y las simplificaciones, ya que en su conjunto, estas funciones permiten obtener distintas expresiones de una misma solución. Este apartado se centrará especialmente en el cálculo simbólico para la factorización y las simplificaciones. Por esta razón en este apartado se empleará especialmente Maxima. La función principal de Maxima para la factorización es factor(). En el siguiente ejemplo se muestra la factorización de número natural, entero, decimal de coma flotante y racional. Código 3.26 Factorización en Maxima. Tema 3 18 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Los factores obtenidos con esta función serán irreductibles mediante enteros. Maxima puede realizar la factorización de polinomios empleando la función factor(). A continuación se factoriza el polinomio y ( x) x 4 1 . Código 3.27 Factorización de polinomios en Maxima. La función factor() admite el uso de más de una variable simbólica. En el siguiente ejemplo se ilustra la factorización de los siguientes polinomios, y ( x, a ) x 2 a 2 z ( x, y, a, b) yx 2 x 2b a 2 y ba 2 Código 3.28 Factorización de polinomios en Maxima. Como ya se ha comentado anteriormente, la factorización puede ser empleada para calcular las raíces de un polinomio. Sin embargo, la función factor() está orientada a la factorización de números enteros. Se muestra a continuación el empleo de la función factor()para factorizar el polinomio y ( x) x 2 0.75 x 0.125 . Código 3.29 Cálculo de las raíces de un polinomio en Maxima. En el ejemplo anterior se observa que al aplicar la función factor() sobre polinomios con coeficientes reales, se realiza de manera automática una conversión numérica previa a la operación de factorización para así poder operar con números enteros. En el caso particular del ejemplo, multiplica todo el polinomio por el valor 8, de esta manera se puede obtener las mismas raíces del polinomio que al emplear la función allroots(), x 0.25 y x 0.5 , lo que significa que el resultado de la factorización del polinomio es, y ( x) ( x 0.25)( x 0.5) Tema 3 19 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 A continuación se estudia la factorización del polinomio de segundo grado y ( x) x 2 3 x 7 . En este caso los coeficientes son enteros, por lo que la función factor() no realiza ninguna modificación del polinomio. Tampoco es capaz de encontrar ninguna solución. En este caso, la mejor manera de realizar la factorización con números reales o complejos es empleando la función allroots(), Código 3.30 Raíces de un polinomio en Maxima. La factorización del polinomio del ejemplo sería por lo tanto, y ( x) ( x 1.54138126514911)( x 4.54138126514911) Ejemplo 3.9 Calcular de los autovalores de la matriz. 2 1 7 5 2 4 2 4 3 Se pudo ver en el ejemplo del tema 2, donde se calcularon los autovalores de una matriz de 2x2 se emplea la función solve(), y mediante la función específica eigenvalues(). En este ejemplo, se obtienen los autovalores calculando las raíces del polinomio característico, que puede ser calculado realizando la factorización del polinomio. Las operaciones que a realizar serán las mismas, Tema 3 20 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 3.31 Cálculo de autovalores de una matriz en Maxima. Se obtiene finalmente el polinomio característico q_l, donde se emplea la función factor() para factorizar en el caso de que el polinomio tenga raíces enteras. Se puede observar que no se obtiene resultado. Se emplea la función allroots() sobre la función q_l. Se obtienen dos raíces imaginarias conjugadas y una raíz real. La factorización expandida del polinomio característico, con los coeficientes truncados a 3 decimales sería el siguiente, y ( x) x (0.436 3.960i) x (0.436 3.960i) ( x 7.873) Se puede realizar una factorización dirigida a la agrupación de variables de un polinomio. La función factorout()permite realizar esta factorización por variables agrupadas. La sintaxis de la función es la siguiente, factorout(expresión, var1,var2,…,varN) A continuación se propone un ejemplo. Se pretende la factorización del siguiente polinomio, agrupando las variables x e y. z ( x, y, a, b, c) ac( y x) 2 bxy 2by ax 2 bx 2ax 2b a Código 3.32 Agrupación de variables en Maxima. Se obtiene la siguiente factorización, z ( x, y, a, b, c) ac( y x) 2 b( x 2)( y 1) a ( x 1) 2 Tema 3 21 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 En algunas ocasiones, puede ser de interés obtener la factorización de un polinomio a partir de un determinado factor. Para realizar esta tarea se puede emplear la función de Maxima gdc(). Esta función puede tener como argumentos dos polinomios, donde la salida es el máximo común divisor. La salida 1 se produce cuando no se encuentra un máximo común divisor distinto de 1. Esta función, unida a la función divide(), permite realizar una factorización dirigida. La función divide() tiene como argumentos los polinomios dividendo y divisor. La salida es el cociente y el resto de la división. Por lo tanto, la función divide() también ofrece información sobre si un polinomio es factor de otro polinomio, pudiendo evaluar que el resto sea igual a 0. Ejemplo 3.10 Buscar en los siguientes polinomios el factor común ( x 1) . y x3 3x 2 3x 1 y x 4 bx 3 3 x 3 3bx 2 3 x 2 3bx x b y x2 4x 4 Código 3.33 Búsqueda de factores comunes en Maxima. Se puede observar como los dos primeros polinomios del ejemplo, empleando la función gcd(),tienen como factor ( x 1) . Con la función divide() se puede conocer que es factor, y además muestra como salida el valor del otro factor. A continuación se muestran los polinomios de los ejemplos factorizados. y x 3 3 x 2 3 x 1 ( x 1)( x 2 2 x 1) y x 4 bx 3 3 x 3 3bx 2 3 x 2 3bx x b ( x 1)( x3 (b 2) x 2 (2b 1) x b) Simplicación En este apartado se muestra la capacidad de Maxima para representar de distintos modos una misma expresión. No todas las funciones mostradas a continuación obtienen expresiones más compactas que las originales, a veces puede ser útil expandir las expresiones. Tema 3 22 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 La función expand(), como indica el nombre, expande una expresión en sumandos. Permite la expansión de polinomios y de expresiones racionales tal y como se ve en el ejemplo. Código 3.34 Empleo de la función expand() en Maxima. La función rat() convierte una expresión racional a la forma canónica. Para ilustrar el uso de esta función, en el siguiente ejemplo se define una función con 2 variables. Se aplica la función rat() primero sobre la variable a y en la siguiente sentencia sobre la variable x. Código 3.35 de la función rat() en Maxima. Otra función que puede resultar de utilidad en el proceso de la simplificación es la función partfrac(). Esta función descompone una función racional en suma de formas racionales mediante la expansión en fracciones parciales. Tema 3 23 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 3.36 Descomposición de función racional en fracciones parciales en Maxima. La función partfrac() permite definir la variable principal sobre la que realizar la simplificación, permitiendo que pueda ser empleada en expresiones con más de una variable. El uso de las funciones de simplificación y las funciones de factorización mostradas en los apartados anteriores, y de otras funciones con estas características, pueden consultarse en el manual de ayuda de Maxima, especialmente en los apartados 7:Simplificación y 12:Polinomios. 3.2.1 Desarrollos en serie Los desarrollos en serie, al igual que la factorización de funciones y la simplificación, mostradas en apartados anteriores, están en el contexto del cálculo simbólico. Por esta razón, se emplea Maxima como herramienta para realizar este tipo de cálculos. En primer lugar se mostrará como se definen los sumatorios y los productorios. En Maxima se emplea la función sum() para representar fácilmente los sumatorios. La sintaxis de la función es la siguiente, sum(expresión(contador),contador,valor_min_contador,valor_m ax_contador), A continuación se muestra un ejemplo de su uso para series geométricas con un número finito de elementos. En el primer caso, donde la razón es 1 6 , se puede observar que se ha obtenido un resultado numérico. En el segundo caso, empleando coeficientes simbólicos, Maxima muestra como salida la suma de manera expandida, Tema 3 24 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 3.37 Sumatorio con un número finito de términos. Seguidamente se muestra un ejemplo de un sumatorio de infinitos términos de una serie geométrica. Código 3.38 Sumatorio con un número infinito de términos. Maxima obtiene una simplificación del resultado siempre que sea posible mediante la expresión simpsum. Es posible realizar operaciones entre sumatorios, como multiplicación o sumas. A continuación se muestra un ejemplo, Código 3.39 Operaciones básicas entre sumatorios. Maxima es capaz de expandir expresiones en series de Taylor. Una expansión en serie de Taylor de una función f ( x) alrededor de un punto x0 , se puede expresar, f ( x) n 0 f n ( x0 ) ( x x0 ) n n! La función que realiza esta tarea tiene la siguiente sintaxis, Tema 3 25 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 taylor(expresión, variable, x_0, nivel_de_truncamiento) Se va a ilustrar el uso de esta función mediante un ejemplo. Ejemplo 3.11 Obtener la expansión de la serie de Taylor para la función, f ( x) x sin( x) x0 0.5 En este caso se desea obtener hasta el tercer grado de la serie. Por lo tanto n debe ser 3. Código 3.40 Serie de Taylor sobre un valor fijo. En el ejemplo anterior se ha planteado la obtención numérica de la serie de Taylor. La función taylor() permite obtener un resultado simbólico de la serie. Ejemplo 3.12 Obtener la expansión de la serie de Taylor para la función, f ( x) x sin( x) En este ejemplo se ha empleado una variable simbólica para representar el punto sobre el que es evaluada la serie, obteniendo una expresión general de los 4 primeros términos de la serie. Código 3.41 Serie de Taylor simbólica. Tema 3 26 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Se puede observar que Maxima representa el truncamiento de la serie mediante la expresión “…”. Se pueden generar expresiones que representan un truncamiento de una serie de Taylor, empleando la función trunc(). El uso de esta función se ilustra a través del ejemplo mostrado a continuación. Código 3.42 Expresión truncada. Una potente capacidad que ofrece Maxima es la obtención de las funciones que comparten un truncamiento de su serie de Taylor empleando la función pade(). Podría entenderse como la función inversa al desarrollo de Taylor de la función. La función resuelve las funciones racionales. La sintaxis de la función pade() es la siguiente. pade(expresión, grado_numerador, grado_denominador) En el siguiente ejemplo el grado del numerador es 0 y el del denominador es 2. Puede observar que al seleccionar como tercer argumento el valor 1 no se obtiene ninguna salida. Código 3.43 Primitiva de un desarrollo de Taylor. Maxima permite obtener una serie de potencias de una expresión alrededor de un punto x0 , con la forma, f ( x) ai ( x x0 )i i 0 La función que lleva a cabo esta tarea es powerseries(), la sintaxis a emplear es la siguiente, powerseries(expresión, variable, x_0) A continuación se muestran unos ejemplos del uso de esta función. Tema 3 27 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Ejemplo 3.13 Calcular el desarrollo en serie de potencias de las siguientes expresiones, 1 x3 x0 1 f ( x) e x x0 0 f ( x) 2 f ( x) sin 2 ( x) x0 0 Código 3.44 Desarrollo en serie de potencias. EJERCICIOS: Ejercicio 3.9 Calcular el error en la aproximación del polinomio de Taylor de la función f ( x) x 3 , en función del número de términos del polinomio. Ejercicio 3.10 Calcular el error en la aproximación por series de potencias de la función f ( x) a sin( x)ebx , en función del número de términos de la serie. 3.3 SIMPLIFICACIONES TRIGONOMÉTRICAS Maxima permite realizar manipulación de expresiones trigonométricas con el objetivo de obtener otras expresiones más compactas o que permitan una mejor comprensión. El título del apartado se refiere a la simplificación de expresiones, pero también se incluye algunas funciones que permiten expandir expresiones. La función trigreduce() obtiene una expresión compuesta de productos de funciones senos y cosenos en sumas de funciones de senos y cosenos. A continuación se muestran algunos ejemplos. Tema 3 28 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Ejemplo 3.14 Convertir las siguientes funciones en sumas de senos y cosenos, sin 3 ( x) sin( x) cos 2 ( x) Código 3.45 Ejemplo de uso de la función trigreduce(). Otra transformación trigonométrica que ofrece Maxima, es la posibilidad de convertir una expresión con funciones trigonométricas de sumas de ángulos en otra expresión expandida de funciones trigonométricas de dichos ángulos. La función empleada para realizar esta tarea es trigexpand(). Para ilustrar las capacidades de esta función, a continuación se muestran algunos ejemplos de su uso, Código 3.46 Ejemplos del uso de la función trigexpand(). La función trigsimp(), realiza la simplificación de funciones trigonométricas como sec(), tan(), cot() o csc(), entre otras, en expresiones de senos y cosenos. A Tema 3 29 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 continuación se muestran algunos ejemplos de la capacidad de simplificación de esta función. Código 3.47 Ejemplos del uso de la función trigsimp(). Maxima cuenta con la función trigrat() que expande funciones trigonométricas en otra expresión trigonométrica con argumentos que son combinaciones lineales de sus argumentos. A continuación se muestran algunos ejemplos. Código 3.48 Ejemplos del uso de la función trigrat(). Se puede observar en los ejemplos que se puede emplear más de una variable para aplicar la función trigrat(). Puede ser de gran utilidad convertir expresiones trigonométricas en funciones exponenciales. Maxima ofrece una función que realiza esta tarea, exponentialize(). Tema 3 30 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 3.49 Ejemplos del uso de la función exponentialize(). Ejemplo 3.15 Demuestre la siguiente identidad, sen(2 x) tan( x) 1 cos(2 x) Para demostrar la identidad propuesta se han encadenado dos funciones de simplificación, en primer lugar se obtiene una expresión con funciones trigonométricas con argumentos de las variables sin coeficiente, trigrat(), y posteriormente se obtiene una expresión más compacta con la función trigreduce(). Código 3.50 Resolución de ejemplo de simplificación trigonométrica Ejemplo 3.16 Demuestre la siguiente identidad, sin(a b) tan(a ) tan(b) cos(a ) cos(b) El ejemplo propuesto se resuelve de manera similar al ejemplo anterior, en este caso en concreto, como la parte derecha de la ecuación está expresada en función de las dos variables separadas, se aplica la función trigexpand() para separar la suma de ángulos. Como la solución es simplificable, se emplea la función expand(). Finalmente se aplica la función trigreduce() para obtener una forma más compacta. Tema 3 31 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2011-12 Código 3.51 Resolución de ejemplo de simplificación trigonométrica Tema 3 32 HERRAMIENTAS INFORMÁTICAS PARA MATEMÁTICAS (Apuntes elaborados por el equipo docente para el curso 2014-15) Tema 4 PROGRAMACIÓN ORIENTADA A LA RESOLUCIÓN DE PROBLEMAS Como se ha visto en temas anteriores, tanto Scilab como Maxima tienen gran potencialidad para el cálculo matemático. Pero los problemas matemáticos de cierta complejidad no se pueden resolver con una simple orden, sino que requieren el encadenamiento de varias órdenes, el uso de funciones o el uso de programas. Tanto Scilab como Maxima admiten programación estructurada y facilitan todo lo necesario para que sus usuarios puedan generar sus propias funciones y programas, almacenarlos en archivos y compartirlos con otros usuarios. En este cuarto tema exploraremos estas capacidades y las pondremos en práctica con varios ejemplos representativos. También tendrá oportunidad de conocer algo más sobre los algoritmos empleados en los programas de cálculo matemático. Concretamente Scilab considera los archivos con extensión “sci” como contenedores de funciones definidas por el usuario, y los archivos con extensión “sce” como contenedores tanto de funciones como de programas. Mientras que las funciones de un archivo con extensión “sci” están concebidas para ofrecer la funcionalidad completa sobre algún tema concreto, de ahí que un conjunto de archivos “sci” puedan conformar una librería en Scilab. Las funciones de un archivo con extensión “sce” tienen un objetivo más específico, el de dar funcionalidad al programa concreto que acompañan. Maxima contempla los archivos con extensión “mac” como contenedores de funciones definidas por el usuario, mientras que los archivos con extensión “wxm” pueden contener tanto funciones como programas. En este tema también tendremos ocasión de crear estos tipos de archivos. 4.1 CONCEPTOS DE ALGORITMO, FUNCIÓN, PROGRAMA Y LIBRERÍA En las funciones y en los programas tienen gran importancia la inclusión de comentarios, pues éstos nos ayudarán a recordar lo que quisimos programar, nos ayudarán a depurarlos y también ayudarán a que otros usuarios puedan comprenderlos y en su caso modificarlos. Además, para que la programación del usuario sea más efectiva tanto Scilab como Maxima contemplan: El uso de elementos de programación estructurada: bucles y condicionales. La llamada de funciones dentro de otra función e incluso a la misma función. Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 4.1.1 Funciones En el ejemplo 1 del tema 1 se emplearon dos variables fx y gx como expresiones de la variable x. Una forma más general y más eficiente de hacer esto mismo pasa por utilizar el concepto de función en Scilab. Así en lugar de hacer fx=2*x+2 y gx=(x-1)^2+1 se pueden definir dos funciones de la siguiente forma function y=f(x),y=2*x+2,endfunction function y=g(x),y=(x-1)^2+1,endfunction Las funciones así definidas, con nombres distintos, f y g respectivamente, tienen una característica común; reciben un único argumento o variable de entrada (x) y generan una sola variable de salida (y). Para Scilab estas variables tienen un significado local, de forma que nunca interferirán entre sí y se puedan solicitar tantas evaluaciones numéricas como se quiera de las funciones. Por ejemplo, tras la definición de la función f en la consola de Scilab, véase figura 4.1, podremos teclear f(1) obteniendo como resultado el valor 4 y también podemos comprobar que la variable y sigue sin estar definida en el espacio de trabajo. Figura 4.1 Ejemplo de definición de una función a través de la consola de Scilab. Podremos asignar a y1 el valor f(1) sin más que teclear y1=f(1), etc…. Si además definimos la función g, podremos teclear g(f(1)) obteniendo el valor 10. Y también podemos comprobar que ambas funciones se cortan en x=4 pues al teclear f(4)-g(4) obtenemos el valor 0. Estas mismas funciones se pueden definir en Maxima de la siguiente forma f(x):=2*x+2; g(x):=(x-1)^2+1; Con la ventaja que, además de las evaluaciones numéricas, se pueden solicitar evaluaciones algebraicas. Por ejemplo al teclear g(f(a)) obtendremos la expresión (2 a + 1)2 + 1, véase la figura 4.2. Tema 4 2 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Figura 4.2 Ejemplo de definición de funciones en wxMaxima. En el ejemplo 2 del tema 1 se definieron otras dos funciones en Scilab, con los nombres distancia y altura. function x=distancia(vo,alfa,t),x=vo*cos(alfa)*t,endfunction function y=altura(vo,alfa,g,t),y=vo*sin(alfa)*t-g*t^2/2,endfunction Ambas funciones generan una variable de salida, que está definida con distinto nombre x e y respectivamente, y requieren varios argumentos de entrada. La función distancia necesita tres argumentos de entrada (vo,alfa,t) y la función altura necesita cuatro (vo,alfa,g,t). El significado de estas variables ya se comentó en el tema 1. Sin embargo en la resolución del ejemplo 2 del tema 1 con Maxima no se empleó ninguna función. Se podría haber utilizado la siguiente función y(x,vo,alfa,g):=(sin(alfa)*x)/cos(alfa)-(g*x^2)/(2*cos(alfa)^2*vo^2); Que relaciona a la altura instantánea (y) con la distancia (x) recorrida por el proyectil, la velocidad inicial vo, el ángulo de disparo () respecto al suelo y la aceleración de la gravedad (g). Y también se podría haber definido la correspondiente al alcance máximo (d), dada por: d(vo,alfa,g):=(2*cos(alfa)*sin(alfa)*vo^2)/g; En definitiva una función definida por el usuario incluirá una instrucción o conjunto de instrucciones, que se espera utilizar varias veces, y tendrá: Un nombre, obligatoriamente distinto al de las funciones básicas del correspondiente entorno. Uno o varios argumentos de entrada separados por comas. Los argumentos pueden ser de cualquiera de los tipos admitidos (literal, valor numérico, matriz, vector, etc ….) por el correspondiente entorno. Uno o varios argumentos de salida en el caso de Scilab. Un argumento de salida en el caso de Maxima. En este mismo tema hablaremos mucho más de las funciones, pero también se remite al lector a que consulte el apartado “Functions” del documento Introduction to Scilab y el apartado “Programación a nivel de Maxima” del documento Primeros Pasos en Maxima para conocer las diferencias entre el uso de funciones en Scilab y en Maxima. Ejercicio 4.1 En el documento Primeros Pasos en Maxima encontrará la siguiente función loga(x,a):= float(log(x) / log(a)) $ Tema 4 3 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Definida para calcular el logaritmo de un número x en cualquier base a (Maxima sólo tiene definidos los naturales). Se pide comprobar dicha función en wxMaxima y programar una función similar en Scilab. En ambos entornos puede utilizar el mismo ejemplo loga(7,4) cuyo resultado es aproximadamente 1.4037. Ejercicio 4.2 Reproducir en wxMaxima los tiros parabólicos rasante y por elevación del ejemplo 2 del tema 1 haciendo uso de las funciones d(vo,alfa,g) e y(x,vo,alfa,g) comentadas anteriormente. 4.1.2 Elementos de programación estructurada A continuación se abordan los elementos de programación estructurada tanto con Scilab como con Maxima. No obstante, se recomienda al lector a que consulte el apartado “Looping and branching” del documento Introduction to Scilab y el apartado “Programación a nivel de Maxima” del documento Primeros Pasos en Maxima para conocer algo más sobre las diferencias entre el uso de estos elementos en Scilab y en Maxima. 4.1.2.1 Bucles En la resolución del ejemplo 1 del tema 1 con Scilab se empleó un tipo de sentencia que llevaba implícito un bucle de cálculo. Nos referimos concretamente a la siguiente asignación, utilizada para generar un vector de 701 componentes equiespaciados, con valor -2 en la primera componente y valor 5 en la última componente. x=-2:.01:5; Si Scilab no hubiera admitido este tipo de asignaciones se hubiera podido generar con el siguiente conjunto de instrucciones, donde se hace un uso explícito de un bucle del tipo while xmin=-2; xmax=5; deltax=0.01; nvalores=(xmax-xmin)/deltax+1; x(1)=xmin; i=1; while i<nvalores i=i+1; x(i)=x(i-1)+deltax; end Código 4.1 Ejemplo de bucle while en Scilab. La primera componente del vector se asigna al valor mínimo y el resto de componentes se asignan de forma incremental respecto al componente anterior dentro de un bucle condicional. Otra solución más efectiva, haciendo uso de un bucle de tipo for, podría haber sido xmin=-2; xmax=5; deltax=0.01; nvalores=(xmax-xmin)/deltax+1; x(1)=xmin; for i=2:nvalores x(i)=x(i-1)+deltax; end Código 4.2 Ejemplo de bucle for en Scilab. Tema 4 4 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Pero algo aún más práctico hubiera sido crear una función que sirva para cualquier otra asignación de estas características. Dicha función podría venir definida por el siguiente conjunto de expresiones (código 4.3) en Scilab, donde hemos tenido la precaución de redondear la variable nvalores al entero más próximo del cociente, por tanto no hay garantías de que la última componente del vector sea exactamente el valormaximo function vector=generavector(valorminimo,incremento,valormaximo); nvalores=round((valormaximo-valorminimo)/incremento+1); vector(1)=valorminimo for i=2:nvalores vector(i)=vector(i-1)+incremento end endfunction Código 4.3 Programación de la función generavector en Scilab. En ese caso, el mismo vector x se podría generar de la siguiente forma x=generavector(-2,0.01,5); Pero además, como en el ejemplo 2 del tema 1 se asignaron otros tres vectores, t=0:0.01:1.5; t1=0:0.01:1; t2=0:0.01:sqrt(3); Con la nueva función se podrían haber hecho de la siguiente forma t=generavector(0,0.01,5); t1=generavector(0,0.01,1); t2=generavector(0,0.01,sqrt(3)); Se propone al estudiante que compruebe las tres formas descritas anteriormente para generar el vector x en el entorno de Scilab. 1ª) De forma específica con el bucle while. 2ª) De forma específica con el bucle for. 3ª) Haciendo uso de la función generavector, previamente programada. No olvide que es preferible hacerlo desde la ventana de edición. Ejercicio 4.3 Definir una función en Scilab similar a la anterior generavector, donde los argumentos de entrada sean el valor mínimo, el incremento y el número de componentes. Utilizarla para generar un vector de 20 valores desde el valor 5 en incrementos de 0.2. Aunque hemos presentado un ejemplo bastante simple de bucle, éste es suficiente para poner de manifiesto que los bucles en Scilab comienzan con un for y acaban con un end. Entre ambos se sitúan todas las expresiones de cálculo que se deben repetir tantas veces como indique el índice (por defecto en incrementos de 1) pero también se puede utilizar cualquier otro incremento, incluso negativo. Además un bucle puede estar dentro de otro bucle, es decir, se pueden anidar varios bucles for. Recuerde las dos soluciones del ejemplo 3 en el tema 1, la primera con tres bucles for anidados y la segunda con dos. La sintaxis general del bucle for en Scilab es la siguiente: for <var>=<val1>:<val2>:<val3> <expr> end También hemos visto un tipo de bucle condicional, el bucle while, que permite repetir las expresiones de cálculo hasta que deje de cumplirse una condición. La sintaxis general del bucle while en Scilab es la siguiente: Tema 4 5 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 while <cond> <expr> end En Maxima no disponemos de las ventajas para generar vectores que tiene Scilab, por ello se hace aún más necesaria la programación para ese fin. Por ejemplo encadenando las siguientes instrucciones y el bucle for podemos generar el mismo vector x xmin:-2;xmax:5;deltax:0.01;nvalores:round((xmax-xmin)/deltax+1); array(x,nvalores-1);x[0]:xmin; for i:1 thru nvalores-1 do x[i]:x[i-1]+deltax; Código 4.4 Ejemplo de bucle for en Maxima. Observe las diferencias respecto a lo realizado en Scilab. La primera diferencia es que el primer elemento se referencia en Maxima con el índice 0, la segunda diferencia es que antes de realizar asignaciones de las componentes hay que definir la variable x como una matriz mediante la función “array”, y las otras diferencias son de tipo sintáctico en el bucle. Este bucle en Maxima comienza con un for, incorpora un thru y un do. Por delante y por detrás del thru se sitúan respectivamente el valor inicial y el valor final del contador del bucle. Mientras que las expresiones a evaluar se sitúan después del do. Una vez que hayamos generado el vector, tecleando x[20] podremos ver el valor que ocupa la vigésima primera componente, que resulta ser -1.8. Y si queremos consultar todas las componentes del vector generado habría que teclear listarray(x). Por otro lado, de forma similar a lo realizado en Scilab, podemos ganar generalidad definiendo la siguiente función generavector(valorminimo,incremento,valormaximo):=block([vector,nvalores],nvalores:r ound((valormaximo-valorminimo)/incremento+1), array(vector,nvalores1),vector[0]:valorminimo, for i:1 thru nvalores-1 do vector[i]:vector[i1]+incremento,vector); Código 4.5 Programación de la función generavector en Maxima. Se observa que en esta función hemos decidido proteger las variables auxiliares de la función dentro de un bloque. Así las variables vector y nvalores tendrán un carácter local al estar encerradas entre corchetes y también lo tendrá la variable i por ser el índice del bucle, que siempre es local. La función devuelve el último resultado que es un array (vector). Entonces, se puede generar el mismo vector que antes tecleando x:generavector(-2,0.1,5); La función anterior también se puede modificar, cambiando únicamente la última sentencia, para que en lugar de devolver un array, devuelva una lista. No obstante, como Maxima dispone de una función específica como es makelist para la generación de listas, hemos preferido hacer uso de esta función en el código 4.6 generalista(valorminimo,incremento,valormaximo):=block(nvalores:round((valormaximo -valorminimo)/incremento+1),makelist(valorminimo+i*incremento,i,0,nvalores-1)); Código 4.6 Programación de la función generalista en Maxima. Se propone al estudiante que compruebe las tres formas descritas anteriormente para generar el vector x en el entorno de wxMaxima. 1ª) De forma específica con el bucle for. 2ª) Tema 4 6 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Como un array, haciendo uso de la función generavector, previamente programada. 3ª) Como una lista, haciendo uso de la función generalista. No olvide que lo tiene que hacer en la ventana principal pero que puede ir guardando resultados intermedios en un archivo del tipo “wxm”. El ejemplo anterior muestra un uso simple del bucle for en Maxima, ya que este entorno ofrece las siguientes variantes: for <var>:<val1> step <val2> thru <val3> do <expr> for <var>:<val1> step <val2> while <cond> do <expr> for <var>:<val1> step <val2> unless <cond> do <expr> En definitiva las expresiones se pueden repetir un número determinado de veces (thru), mientras se cumpla una condición (while) o salvo que se cumpla una condición (unless). Cuando el incremento de la variable es la unidad, se puede obviar la parte de la sentencia relativa a step, dando lugar a los esquemas for <var>:<val1> thru <val3> do <expr> for <var>:<val1> while <cond> do <expr> for <var>:<val1> unless <cond> do <expr> Cuando no sea necesaria la presencia de una variable de recuento de iteraciones, también se podría prescindir de los for, como en while <cond> do <expr> unless <cond> do <expr> Ejercicio 4.4 En el documento Primeros Pasos en Maxima encontrará la siguiente función fact(n):=block([prod:1], for k:1 thru n do prod:prod*k, prod )$ Definida para calcular el factorial de un número n (que no sería necesaria en Maxima, pues se dispone del operador !). Se pide programar y comprobar una función similar en Scilab (que tampoco sería necesaria, pues en Scilab disponemos de la función factorial). Le puede servir saber que al teclear 45! en Maxima se obtiene el siguiente valor: 119622220865480194561963161495657715064383733760000000000 Ejercicio 4.5 Utilizar la estructura bucle para programar tanto en Scilab como en Maxima una función capaz de mostrar la clásica tabla de multiplicar de cualquiera de los números naturales, del 1 al 10. 4.1.2.2 Ejecución condicional de expresiones En la presentación de los bucles hemos considerado dos formas condicionales de permanecer en el bucle, a continuación nos vamos a preocupar de la ejecución condicional de expresiones de cálculo. Con independencia de que estas expresiones también pueden formar parte de un bucle. La estructura de control de flujo más habitual en programación es la denominada if - then - else, que se emplea para condicionar el cálculo tanto si cumple la condición como si no se Tema 4 7 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 cumple. Pero a veces es suficiente con emplear la estructura if - then, en ese caso el cálculo sólo se realiza si se cumple la condición pues cuando no se cumple no es necesario. En la solución con Scilab del ejemplo 3 en el tema 1, tal como puede comprobarse a continuación, se emplearon dos condicionales del tipo if – then anidados para condicionar una asignación. if (a+b+c)==15 then if a<>b & a<>c & b<>c then i=i+1; ternassuman15(i,:)=[a b c]; end end La primera condición se satisfacía si los elementos de la terna sumaban 15 y la segunda condición era una condición triple que se satisfacía si los tres elementos eran distintos entre sí. La anidación de ambos condicionales no era estrictamente necesaria, se prefirió hacerlo así para ganar claridad. Se hubiera conseguido lo mismo con el siguiente conjunto de sentencias, donde sólo empleamos una condición cuádruple if (a+b+c)==15 & a<>b & a<>c & b<>c then i=i+1; ternassuman15(i,:)=[a b c]; end En la ejecución condicional de expresiones juega un papel muy importante la evaluación de la condición, que ya hemos visto que puede ser simple o múltiple, y el papel que en ella juegan los operadores relacionales vistos en el tema 2. Se recuerda que Scilab y Maxima presentan grandes diferencias en ese sentido, pero además la estructura de control de flujo if – then – else necesariamente necesita acabar con end en Scilab y sin embargo en Maxima no es necesario. En el tema 1 se puede ver cómo se afrontó la resolución del ejemplo 3 con Maxima. Por ejemplo con Maxima, la generación de las 72 ternas de números naturales cuyos elementos son distintos entre sí y suman 15, y su almacenamiento en la matriz ternassuman15 (primera parte de la resolución con Scilab del ejemplo 3 del tema 1), se podría conseguir como sigue (código 4.7). Donde se ha hecho de un condición if - then else, de tal forma que la primera terna encontrada sirve para crear la primera fila de la matriz y el resto de ternas se añaden en filas sucesivas. Se propone al estudiante que lo compruebe. i:0; for a:1 thru 12 do ( for b:1 thru 12 do ( for c:1 thru 12 do (if (a+b+c)=15 and a#b and a#c and b#c then (i:i+1, if i=1 then ternassuman15:matrix([a,b,c]) else ternassuman15:addrow(ternassuman15,[a,b,c]))))); ternassuman15; Código 4.7 Generación en Maxima de las 72 ternas de números naturales cuyos elementos son distintos entre sí y suman 15. Otra forma de combinar condiciones pasa por hacer uso de tantos elseif como sean necesarios (esto es posible en Scilab pero no en Maxima) en estructuras del tipo if – then – elseif – then – elseif – then – else – end Tema 4 8 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 No obstante, en ciertos casos quizás sea más recomendable acudir a la estructura select de Scilab (que tampoco está disponible en Maxima). Ejercicio 4.6 En el documento Primeros Pasos en Maxima se comenta la siguiente función fact2(n):= if n=1 then 1 else n*fact2(n-1) $ Definida, como alternativa a la del ejercicio 4.4, para calcular el factorial de un número n haciendo uso de la recursividad (la función se llama a si mismo tantas veces como sea necesario). Se pide programar y comprobar una función similar en Scilab. Puede utilizar el mismo ejemplo 45! que en el ejercicio 4.4. Ejercicio 4.7 Defina una función tanto en Scilab como en Maxima que valga 1 para x<-1, x2 para -1x<2 y x-2 para x2. Utilícela para hacer la representación gráfica de la función en el rango [-2 4]. 4.1.2.3 Algoritmos Un algoritmo en programación es cualquier procedimiento diseñado y automatizado para conseguir algo. Por ejemplo en la resolución del ejemplo 3 del tema 1 seguimos distintos procedimientos. Se planteó un procedimiento (algoritmo) inicial y las otras propuestas no son más que refinamientos del algoritmo a fin de hacerlo más efectivo. En problemas más complejos un objetivo podría ser la reducción del tiempo de cálculo. La tabla 4.1 muestra tres posibles algoritmos para calcular la suma de los números naturales comprendidos entre a y b. Donde damos por supuesto que se cumple la condición a<b. En la columna de la izquierda el algoritmo está expresado en lenguaje natural. Mientras que en la columna central y en la columna de la derecha se muestran las respectivas implementaciones en Scilab y en Maxima. Lenguaje natural Asignamos a la suma el valor cero. Asignamos a una variable auxiliar el valor a. Mientras la variable auxiliar sea menor o igual que el valor b, cambiamos el valor de suma, asignándole el valor que tenía anteriormente más el valor actual de la variable auxiliar, e incrementamos en una unidad la variable auxiliar. Lenguaje natural Asignamos a la suma el valor cero. Entramos en un bucle desde a hasta b en incrementos de uno en uno, y en cada iteración del bucle cambiamos el valor de suma, asignándole el valor que tenía anteriormente más el índice actual del bucle. Lenguaje natural Presentamos el valor de la suma como la suma de los componentes de un vector con valores entre a y b equiespaciados una unidad. Algoritmo 1 Scilab suma=0 auxiliar=a while auxiliar<=b suma=suma+auxiliar auxiliar=auxiliar+1 end Algoritmo 2 Scilab suma=0 for i=a:b suma=suma+i end Algoritmo 3 Scilab suma=sum(a:b) Maxima suma:0;auxiliar:a; while auxiliar<=b do (suma:suma+auxiliar,auxiliar:a uxiliar+1); Maxima suma:0;for i:a thru b do suma:suma+i; Maxima suma:sum(i,i,5,15); Tabla 4.1 Tres posibles algoritmos para sumar los números naturales comprendidos entre a y b. Tema 4 9 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Se propone al estudiante que programe estos algoritmos para comprobar que la suma de los números naturales comprendidos entre 5 y 15 suman 110. También puede comprobar que el mismo algoritmo, pero con un incremento igual a 2 serviría para calcular todos la suma de los números pares o impares entre a y b siempre y cuando éstos fueran pares o impares a la vez y por tanto deban ser considerados en la suma. Le valdría para comprobar que los números impares entre 5 y 15 suman 60 y que los números pares entre 2 y 10 suman 30. Ejercicio 4.8 Diseñar y programar un algoritmo capaz de ordenar de mayor a menor un conjunto de valores dados. En el caso de Scilab este conjunto tendrá la estructura de vector fila y el caso de Maxima tendrá la estructura de lista. Comprobar el algoritmo ordenando el siguiente conjunto desordenado de siete valores [0.1, 1.2, -0.32, 4.5, 1.89, -0.05, 2.4]. Trate de hacer lo mismo utilizando la función gsort de Scilab y la función sort de Maxima. Ejercicio 4.9 Diseñar y programar un algoritmo en Maxima capaz de encontrar y comunicar el valor máximo en un conjunto de valores dados, así como la posición que ocupa. Comprobar el algoritmo utilizando el mismo conjunto desordenado del ejercicio 4.8. En Scilab ya existe la función max que implementa esta funcionalidad, compare el resultado. Recuerde que, como una función en Maxima no puede devolver varios argumentos de salida, lo puede hacer a través de una lista. Compare la funcionalidad que ha programado con la de la función smax del paquete descriptive de Maxima. Ejercicio 4.10 Diseñar y programar un algoritmo en Maxima capaz de encontrar y comunicar el valor máximo de los elementos de una matriz 3x3, así como la posición (fila y columna) que ocupa. Se recomienda hacer uso de la función programada en el ejercicio 4.9. Compruebe el algoritmo utilizando la siguiente matriz y compare con el resultado obtenido con la función max de Scilab. ¿Le serviría esta misma función para encontrar el mínimo, indique cómo y aplíquelo a la misma matriz? Compare la funcionalidad que ha programado con la de la función smax del paquete descriptive de Maxima. 1 1 5 3 2 6 4 4 3 4.2 EJEMPLOS DE RESOLUCIÓN DE SISTEMAS DE ECUACIONES LINEALES Supongamos que queremos determinar los valores de x, y, z que son solución del siguiente sistema lineal de ecuaciones 4x+2y–z=3 3x+2z=0 2x+y–z=2 (4.1) Para ello podríamos hacer uso de la opción Resolver sistema lineal del menú Ecuaciones de la ventana principal de wxMaxima. Tal como se muestra en la figura 4.3, primero indicamos que el sistema tiene 3 ecuaciones y luego tecleamos las ecuaciones y las variables incógnitas. Tema 4 10 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Figura 4.3 Pasos previos a la resolución de un sistema lineal de 3 ecuaciones en wxMaxima. Pero realmente los pasos anteriores no son más que una ayuda para componer la sentencia linsolve([4*x+2*y-z=3,3*x+2*z=0,2*x+y-z=2],[x,y,z]), donde se hace uso de la función linsolve. Cuya ejecución en Maxima da como resultado la única solución de este sistema de ecuaciones lineales: x=2/3, y=-1/3, z=-1. A continuación nos proponemos analizar qué tipo de algoritmo puede estar empleando Maxima cuando se le solicita la resolución de un sistema lineal de estas características. Para ello nos preguntamos ¿qué otras opciones tenemos en los entornos de cálculo automático para afrontar la resolución de sistemas de ecuaciones lineales? Un posible algoritmo, que iremos perfilando a lo largo de este apartado, pasa por considerar que cualquier sistema de m ecuaciones lineales con n incógnitas admite la siguiente representación matricial Aw=b Siendo: A, la matriz m x n de coeficientes del sistema b, un vector columna de m componentes conocidos como los segundos miembros w, el vector columna formado por las n incógnitas Y por tanto, su solución se puede obtener mediante una simple operación matricial, siempre y cuando exista la inversa de la matriz A w = A-1 b Lo comprobamos con el sistema de ecuaciones (4.1), donde 4 2 -1 A = 3 0 2 2 1 -1 3 b = 0 2 x w = y z Y por tanto le corresponde la siguiente solución Tema 4 11 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 4 2 -1 w = 3 0 2 2 1 -1 -1 4 2 1 2 - 3 3 3 3 3 3 0 = 7 - 2 - 11 0 = - 1 3 3 3 3 2 2 0 -2 -1 1 Las figuras 4.4 y 4.5 muestran las sentencias empleadas en Scilab y en Maxima, respectivamente, así como los resultados obtenidos. En Maxima no hubiera sido necesario utilizar la estructura matriz en la variable b, se podría haber usado la estructura lista. En ese caso hubiéramos asignado b:[3, 0, 2]. Figura 4.4 Resolución matricial del sistema lineal de 3 ecuaciones (4.1) en Scilab. Figura 4.5 Resolución matricial del sistema lineal de 3 ecuaciones (4.1) en wxMaxima. Ejercicio 4.11 Comprobar que estos otros tres sistemas lineales de ecuaciones también se pueden resolver por inversión matricial. Tema 4 12 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Sistema lineal Ecuaciones 3x+6y+9z=3 2 y - 2 z = -2 -4z=2 Solución en Scilab y en Maxima 5.5 , -1.5 , -0.5 2x+3y+4z=2 3x+6y+7z=4 4 x + 7 y + 10 z = 8 -2.5 , -1 , 2.5 (4.3) 3x+6y+9z=3 2x+5y+2z=4 - 3 x - 4 y - 11 z = 5 - 10.333333, 4.6666667, 0.6666667 (4.4) (4.2) ¿Pero qué ocurre si intentamos resolver matricialmente este otro sistema de ecuaciones? x+2y+3z=1 -4 x + 2 y - 3 z = 3 1 2 3 A= 4 2 3 (4.5) 1 b= 3 x w = y z Pues que no podemos debido a que A no es una matriz cuadrada, la consola de Scilab nos genera el siguiente mensaje !--error 20 Tipo incorrecto del primer argumento: Se esperaba una matriz cuadrada. Y Maxima genera el siguiente mensaje determinant: matrix must be square; found 1 rows, 2 columns. -- an error. To debug this try: debugmode(true); Pero esto no quiere decir que el sistema no tenga solución, realmente tiene infinitas soluciones, sino que el procedimiento utilizado no es capaz de encontrarlas. Para tratar de mejorar el algoritmo acudimos a la clasificación de los sistemas de ecuaciones lineales recogida en la tabla 4.2. Dicha clasificación se basa en: ra El rango de la matriz A rab El rango de la matriz ampliada del sistema, el que se obtiene al ampliar la matriz del sistema A con el vector de los segundos miembros m El número de ecuaciones n El número de incógnitas ra#rab Sistema Incompatible m=n ra=m Determinado1 m=n ra<m Indeterminado3 4 ra=rab Sistema Compatible m<n Indeterminado m>n ra=n Determinado2 m>n ra<n Indeterminado5 Tabla 4.2 Clasificación de los sistemas de ecuaciones lineales. Tema 4 13 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Lo que está ocurriendo es que la resolución por inversión matricial sólo contempla uno de los casos de la tabla 4.2, concretamente el caso de sistema compatible y determinado con igual número de ecuaciones que incógnitas. Es decir, el caso determinado que hemos marcado con el superíndice 1. En este caso tienen cabida los sistemas (4.1), (4.2), (4.3) y (4.4). Mientras que el sistema (4.5) se enmarca en el caso de sistema compatible indeterminado con menor número de ecuaciones que incógnitas; en el caso Indeterminado que hemos marcado con el superíndice 4. Un buen algoritmo de resolución de sistemas de ecuaciones lineales debería contemplar todos los casos de la tabla 4.2. De ahí que dirijamos nuestra atención a definir y programar funciones que analicen la compatibilidad, que analicen la indeterminación y que calculen la solución o presenten el correspondiente mensaje. 4.2.1 Funciones para la resolución de sistemas de ecuaciones lineales Definimos la función compatibilidad_sle(A,b) como aquella función que determina si el sistema es compatible o incompatible. Sus argumentos de entrada son la matriz A de coeficientes y el vector b de segundos miembros, pues ambos son necesarios para calcular ra y rab. Su argumento de salida sólo tomará dos posibles valores, uno para indicar que el sistema es compatible y otro para indicar que no lo es. Definimos la función indeterminacion_sle(A) como aquella función que determina si un sistema compatible es indeterminado o determinado. El único argumento de entrada es la matriz A de coeficientes pues en este análisis intervienen ra, m y n, y los tres están disponibles en la matriz A. Su argumento de salida tomará cinco posibles valores, los dos primeros para indicar los dos tipos de determinación, superíndices 1 y 2 de la tabla 4.2, y los otros tres para indicar los tres tipos de indeterminación, superíndices 3, 4 y 5 de la tabla 4.2. Definimos la función resuelve_sle(A,b) como aquella función que efectúa la clasificación de la tabla 4.2 apoyándose en las dos funciones anteriores y calcula la solución o presenta el correspondiente mensaje. En Scilab, la función compatibilidad_sle podría ser algo así: function ac=compatibilidad_sle(A, b) if rank(A)==rank([A b]) then ac=1 // Sistema compatible else ac=0 // Sistema incompatible end endfunction Código 4.8 Programación de la función compatibilidad_sle en Scilab. Donde la salida ac de la función igual a 1 nos indica que el correspondiente sistema de ecuaciones es compatible y el valor 0 nos indica que es incompatible. Observe que al programar la función se ha optado por utilizar una estructura if – then – else, y se han incluido dos comentarios (texto resaltado en verde por Scilab) que no dejan lugar a dudas sobre la funcionalidad de la función. En Maxima, la función compatibilidad_sle podría ser algo así: compatibilidad_sle(A,b):=is(rank(A)=rank(addcol(A,b)))$ Tema 4 14 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Tal que, la función genera un valor true si el correspondiente sistema de ecuaciones es compatible y un valor false si es incompatible. En comparación con la programación realizada en Scilab, el uso de la función is (consultar la ayuda de wxMaxima) nos ha permitido compactar nuestra función de análisis de la compatibilidad en una sola instrucción. Pero esto mismo se podría haber hecho en Scilab, sustituyendo la estructura if – then – else por la instrucción ac=rank(A)==rank([A b]) que genera un valor lógico T o F. En definitiva esto es una prueba más de que el contenido de una función puede ser cualquiera, lo importante es que cumpla su funcionalidad. En Scilab, la función indeterminacion_sle se podría programar como sigue: function ai=indeterminacion_sle(A) [m,n]=size(A) ra=rank(A) if m<n then ai=4 // Sistema compatible indeterminado con menor número else // de ecuaciones que incógnitas if m==n then if ra<m then ai=3 // Sistema compatible indeterminado con igual número // de ecuaciones que incógnitas else ai=1 // Sistema compatible determinado con igual número // de ecuaciones que incógnitas end else if ra<n then ai=5 // Sistema compatible indeterminado con mayor número // de ecuaciones que incógnitas else ai=2 // Sistema compatible determinado con mayor número end end endfunction end // de ecuaciones que incógnitas Código 4.9 Programación de la función indeterminacion_sle en Scilab. Donde la salida ai de la función toma un valor de 1 a 5 indicando el correspondiente caso de sistema compatible de la tabla 4.2. De nuevo en la programación de la función se ha optado por utilizar la estructura if – then – else, y se han incluido cinco comentarios, uno por cada uno de los casos. Se ha conseguido así una reproducción casi literal de los cinco tipos de sistema compatible contemplados en la tabla 4.2. En Maxima, la función indeterminacion _sle podría estructurarse de esta forma: indeterminacion_sle(A):=([m,n]:matrix_size(A), ra:rank(A), if m<n then caso:4 else if m=n then (if ra<m then caso:3 else caso:1) else (if ra<n then caso:5 else caso:2))$ Código 4.10 Programación de la función indeterminacion_sle en Maxima. En esta ocasión se ha replicado casi exactamente la estructura utilizada en Scilab, salvo que la notación ha sido más compacta y está exenta de comentarios. Tema 4 15 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Ejercicio 4.12 Programar las funciones compatibilidad_sle e indeterminacion_sle tanto en Scilab como en Maxima. Puede optar por reproducir exactamente los códigos comentados anteriormente o por incluir pequeñas variantes, pero en cualquier caso se recomienda guardarlas en un archivo con extensión sci para Scilab y en un archivo con extensión mac para Maxima. Utilizarlas para comprobar que el sistema (4.1) es compatible determinado caso 1 y que el sistema (4.5) es compatible indeterminado caso 4. Ejercicio 4.13 Proponer al menos un ejemplo de sistema incompatible, otro de sistema compatible determinado caso 2, así como de sistemas compatibles indeterminados caso 3 y 5. Y utilizarlos para completar la comprobación de las funciones programas en el ejercicio 4.12. Nos queda por programar la otra función. En Scilab, la función resuelve_sle se podría programar así: function w=resuelve_sle(A, b), if compatibilidad_sle(A,b)==1 then caso=indeterminacion_sle(A) select caso case 1 w=inv(A)*b; disp('El sistema es compatible determinado,la solución es ') case 2 [m,n]=size(A) w=inv(A(1:n,:))*b(1:n); disp('El sistema es compatible determinado con mayor número de ecuaciones que incógnitas, habría que reducir el número de ecuaciones. La solución es ') case 3 w=pinv(A)*b; disp('El sistema es compatible indeterminado, con igual número de ecuaciones que incógnitas, una posible solución es ') case 4 w=pinv(A)*b; disp('El sistema es compatible indeterminado con menor número de ecuaciones que incógnitas, una posible solución es ') case 5 w=pinv(A)*b; disp('El sistema es compatible indeterminado con mayor número de ecuaciones que incógnitas, una posible solución es ') end else w=pinv(A)*b; disp('El sistema es incompatible, una solución de compromiso es ') end disp(w) endfunction Código 4.11 Programación de la función resuelve_sle en Scilab. Donde la salida w de la función representa la solución (en el caso de que ésta sea única), una de las posibles soluciones o una solución de compromiso. Esta salida se presenta en pantalla junto con un mensaje representativo. En la programación de la función se ha optado por utilizar la estructura select, por ser la más apropiada cuando existen casos bien diferenciados. Recordemos que la inversión matricial valía únicamente para resolver un sistema lineal de ecuaciones compatible determinado, de ahí que la instrucción w=inv(A)*b sólo se haya empleado en el caso 1. Para resolver el sistema compatible determinado con más ecuaciones que incógnitas, caso 2, hemos optado por resolver el subsistema resultante de eliminar las ecuaciones redundantes, lo justificaremos con un ejemplo. En el resto de los casos, incluida la situación de incompatibilidad hemos optado por recurrir a la función pinv Tema 4 16 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 de Scilab que utiliza un algoritmo de inversión basado en la descomposición SVD (consulte el manual de ayuda de Scilab). En Maxima, podríamos programar una función resuelve_sle similar a la programada en Scilab pero no tiene mucho sentido hacerlo porque no disponemos de la función que calcule la pseudo-inversa de una matriz. Se ha optado entonces por informar de la situación y presentar la solución únicamente en el caso 1. resuelve_sle(A,b):=(if compatibilidad_sle(A,b)=true then (caso:indeterminacion_sle(A), if caso>=3 then disp("El sistema es compatible indeterminado") else ( if caso=1 then invert(A).b else ( disp("El sistema es compatible determinado y para determinar la solución se debería eliminar"),disp(m-n),disp("ecuaciones") ) ) ) else disp("El sistema es incompatible"))$ Código 4.12 Programación de la función resuelve_sle en Maxima. Como ejemplo de sistema compatible determinado con mayor número de ecuaciones que incógnitas (caso 2) elegimos el siguiente sistema lineal de ecuaciones (4.6). Algo que se puede comprobar a simple vista, analíticamente o utilizando las funciones programadas en el ejercicio 4.12. x+y=2 2x-y=1 3x+y=4 1 1 A = 2 1 3 1 (4.6) 2 b = 1 4 x w= y Por otro lado es fácil comprobar, sustituyendo valores, que la solución de este sistema es x=1, y=1. Algo que también se puede poner de manifiesto gráficamente en el entorno de Maxima, vea la figura 4.6, representando las tres funciones y(x) que resultan de despejar la variable y en las tres ecuaciones. Figura 4.6 Representación gráfica del sistema lineal de 3 ecuaciones (4.6) en Maxima. Esta es la misma solución que obtenemos en Maxima tecleando linsolve([x+y=2,2*xy=1,3*x+y=4], [x,y]); Pero el entorno además nos informa que lo ha resuelto eliminando la tercera ecuación, que es redundante por tratarse de una combinación lineal de las otras dos ecuaciones. En Scilab también se puede obtener la solución, tecleando w=pinv([1 1;2 -1;3 1])*[2 1 4]' Tema 4 17 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 A diferencia de la función linsolve en Maxima, la función pinv se ha limitado a presentar el resultado numérico de la operación. Pero a la solución también se podría haber llegado por inversión matricial, pero en ese caso hay tres opciones posibles, compruébelo tecleando w1=inv([1 1;2 -1])*[2 1]' w2=inv([1 1;3 1])*[2 4]' w3=inv([2 -1;3 1])*[1 4]' Las tres opciones tienen en común que corresponden a la resolución del subsistema lineal de dos ecuaciones que resulta de eliminar una de las ecuaciones del sistema (4.6). Los tres subsistemas resultantes sí son compatibles determinados y por tanto se han podido resolver por inversión matricial. De ahí que, como solución general en el caso 2, se haya propuesto elegir el subsistema formado por la n primeras ecuaciones y resolverlo por inversión matricial. Retomamos ahora el sistema (4.5) que tenía infinitas soluciones, por tratarse de un caso 4 (sistema compatible indeterminado con menor número de ecuaciones que incógnitas), y que no se podía resolver por inversión matricial. Las posibles soluciones, parametrizadas en función de z, se pueden obtener en Maxima, si en lugar de resolverlo por inversión matricial utilizamos la función linsolve. En ese caso, Maxima nos muestra las variables x e y como funciones de z, respectivamente: x=-(6z+2)/5, y=-(9z-7)/10. Mientras que si utilizamos la función pinv en Scilab, lo que obtenemos es sólo una de las posibles soluciones, concretamente la siguiente: -->w=pinv([1 2 3;-4 2 -3])*[1 3]' w = - 0.4553846 0.6584615 0.0461538 Como ejemplo de sistema compatible indeterminado con igual número de ecuaciones que incógnitas (caso 3) elegimos el siguiente sistema lineal de ecuaciones (4.7). Algo que se puede observar a simple vista, sin más que comprobar que la segunda ecuación es igual que la primera pero dividida por 2. Pero también se puede comprobar utilizando las funciones programadas en el ejercicio 4.12. 4x+2y–z=3 2 x + y – 0.5 z = 1.5 2x+y–z=2 4 2 -1 A = 2 1 -0.5 2 1 -1 (4.7) 3 b = 1.5 2 x w = y z El sistema no se puede resolver por inversión matricial pues el determinante de la matriz de coeficientes es nulo. Si utilizamos la función linsolve en Maxima, podemos comprobar que se obtienen un conjunto de soluciones parametrizadas en función de y, concretamente x=(y-1)/2, z=-1. Tema 4 18 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Como en el caso anterior, el conjunto de soluciones determinado por Maxima contiene todas las posibles. Mientras que en Scilab, haciendo uso de la función pinv, obtenemos una de las posibles soluciones, concretamente la siguiente: -->w=pinv([4 2 -1;2 1 -0.5;2 1 -1])*[3 1.5 2]' w = 0.4 0.2 - 1. Ejercicio 4.14 Ampliar los correspondientes archivos, sci de Scilab y mac de Maxima, del ejercicio 4.12 con la función resuelve_sle y comprobarla con los sistemas anteriores y/o con los ejemplos que hayan propuestos en el ejercicio 4.13. 4.2.2 Diferencias en la resolución con Scilab y con Maxima En los ejemplos anteriores ya hemos visto que existen diferencias entre la resolución de un sistema lineal de ecuaciones con Scilab y con Maxima, ahora nos vamos a centrar en tres diferencias fundamentales. 1ª) Scilab sólo se puede utilizar para resolver sistemas donde los coeficientes toman valores numéricos, en cambio Maxima permite resolver sistemas con coeficientes literales. Incluso podemos utilizar las funciones que hemos programado, por ejemplo trate de resolver en Maxima el siguiente sistema utilizando linsolve o sus propias funciones a11 x + a12 y = 0 x + y = b2 (4.8) 2ª) Scilab es capaz de determinar una solución de un sistema compatible indeterminado, mientras que Maxima es capaz de determinar un conjunto parcial o total de soluciones. Se ha puesto de manifiesto en los casos 3 y 4 analizados anteriormente. 3ª) Cuando el sistema es incompatible, Maxima devuelve el resultado [ ] para indicar que el sistema no tiene solución. Sin embargo Scilab es capaz de determinar una solución de compromiso. Esta última alternativa tiene importancia cuando el sistema es incompatible por el error que se ha cometido en la estimación de sus coeficientes, sea por ejemplo el sistema x+y=2 2x-y=1 (4.9) 3.05 x + y = 3.95 Obtenido de (4.6) por modificación de un coeficiente y el término independiente de la tercera ecuación. La solución facilitada por Scilab es: -->w=pinv([1 1;2 -1;3.05 1])*[2 1 3.95]' w = Tema 4 19 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 0.9816561 0.9792017 Como se puede ver en la gráfica de la figura 4.7, esta solución de compromiso está muy próxima a la solución que tenía el sistema original representado en la figura 4.6. Un ligero error en los coeficientes o en los términos independientes puede provocar que el sistema no tenga solución (por haberse hecho incompatible) y sin embargo la solución de compromiso proporcionada por Scilab sí nos puede venir bien. Figura 4.7 Representación gráfica del sistema lineal de 3 ecuaciones (4.9) en wxMaxima y del punto determinado como solución de compromiso por Scilab. 4.2.3 Otros métodos en la resolución de sistemas de ecuaciones lineales Lo tratado en este apartado no es más que una mínima cantidad de los posibles métodos que existen para afrontar la resolución de sistemas de ecuaciones lineales. Pero profundizar algo más alargaría excesivamente el tema. Uno de los métodos más efectivos es el de eliminación de Gauss-Jordan, mientras que otras alternativas pasan por la descomposición triangular de matrices. Las funciones linsolve de Maxima, pinv de Scilab y las de otros programas de cálculo matemático están basadas en esos métodos. 4.3 EJEMPLOS DE RESOLUCIÓN DE SISTEMAS DE ECUACIONES NO LINEALES Para la resolución de sistemas de ecuaciones no lineales podríamos hacer uso de la opción Resolver sistema algebraico del menú Ecuaciones de la ventana principal de wxMaxima. De forma similar a como hicimos en la figura 4.4 para el sistema de ecuaciones lineales, primero indicamos el número de ecuaciones y luego tecleamos las ecuaciones y las variables incógnitas. En esta ocasión, los pasos anteriores ayudan a hacer uso de la función algsys. Elegimos un primer ejemplo de sistema no lineal compuesto de una ecuación lineal y una ecuación cuadrática tal como sigue ax+by=c x2 + y2 = 1 (4.10) Cuya resolución provoca el siguiente resultado Tema 4 20 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 La interpretación gráfica de este sistema es que nos encontramos ante una circunferencia de radio la unidad centrada en el origen (representada por la segunda ecuación) y una recta genérica que puede, si suponemos que sus coeficientes son valores reales: 1) Ser secante a la circunferencia (la corta en dos puntos), 2) Ser tangente a la circunferencia (la corta en un punto) ó 3) No cortar a la circunferencia en ningún punto. En la figura 4.8 se muestran tres posibles casos, un ejemplo de cada una de las situaciones. Figura 4.8 Representación gráfica del sistema no lineal de 2 ecuaciones (4.10) en wxMaxima para tres situaciones distintas; 1) a=1, b=1, c=0.5 (recta secante a la circunferencia). 2) a=0, b=0, c=1 (recta tangente a la circunferencia). 3) a=-1, b=1, c=1.5 (recta que no corta a la circunferencia). Este ejemplo nos vale para poner de manifiesto que la resolución analítica de sistemas de ecuaciones no lineales es aún más difícil que la resolución de sistemas de ecuaciones lineales. Dificultades que se suelen salvar acudiendo a métodos gráficos aproximados, o a métodos numéricos por búsqueda en una zona acotada. La gran mayoría de sistemas de ecuaciones no lineales podremos acabar resolviéndolos a través de ecuaciones polinómicas, es decir, determinando las raíces de una ecuación o los ceros de una función de una variable. Pero en otras ocasiones nos encontraremos con funciones transcendentes. La resolución del sistema (4.10) se podría haber abordado en Maxima sin necesidad de acudir a la función algsys, mediante manipulación algebraica. Por ejemplo con la siguiente secuencia de instrucciones; solve(a*x+b*y=c,y); y:rhs(part(%,1)); expand(x^2+y^2-1); solve(%,x); Tema 4 21 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Código 4.13 Resolución del sistema de ecuaciones (4.10) en Maxima. En la primera instrucción nos hemos ayudado de la función solve para despejar la incógnita y de la primera ecuación, y para expresarla como una función de la otra incógnita x. Con la segunda y tercera instrucción hemos expresado la segunda ecuación como una ecuación de segundo grado en x. Y con la cuarta instrucción nos hemos ayudado de la función solve para obtener las dos posibles soluciones de la ecuación de grado dos. En definitiva la manipulación algebraica del sistema (4.10) nos ha llevado a tener que determinar las raíces de un polinomio de grado dos en una de las incógnitas, cuya fórmula es bien conocida. No es la primera vez que hacemos uso de la función solve, pues ya se utilizó en los ejemplos 1 y 2 del tema 1 para resolver dos ecuaciones de segundo grado, concretamente fx-gx = x2 – 4 x = 0 en el ejemplo 1 y una ecuación del tipo a x – b x2 = 0 en el ejemplo 2. Maxima también dispone de la función eliminate para la eliminación de una incógnita en un sistema de ecuaciones. Está accesible en la ventana principal de wxMaxima al seleccionar la opción Eliminar variable del menú Ecuaciones. En el caso concreto del sistema (4.10) se podría haber llegado a la ecuación de segundo grado mediante una sola instrucción: eliminate([a*x+b*y=c,x^2+y^2=1],[y]);. La función solve de Maxima ha sido de gran ayuda en la anterior manipulación algebraica. Pero basta acudir al menú de ayuda para comprobar que la función solve de Maxima es la función general para la resolución de sistemas de ecuaciones algebraicas, tanto lineales como no lineales, mientras que linsolve y algsys son casos particulares. Está accesible en la ventana principal de wxMaxima al seleccionar la opción Resolver del menú Ecuaciones. Ejercicio 4.15 a) Analizar y resolver el siguiente sistema de ecuaciones no lineales, extraído del documento “Primeros pasos en Maxima”. b) Justificar gráficamente el resultado que se obtiene cuando a=2. 3 x2 – y2 = 6 ; x=y+a (4.11) Ejercicio 4.16 Analizar, resolver e interpretar gráficamente este otro sistema (4.12) de ecuaciones no lineales. (4.12) x2 + y2 = 4 ; x y = 1 Hemos comentado anteriormente y se ha podido comprobar tanto en el ejemplo como en los dos ejercicios que la gran mayoría de sistemas de ecuaciones no lineales se acaban resolviéndolos a través de ecuaciones polinómicas, utilizando fórmulas bien conocidas. Pero también se sabe, por el Teorema de Rufini, que no puede haber fórmulas generales para los polinomios de quinto grado o mayores. A continuación retomamos uno de los problemas básicos, no por ello el más fácil, de la resolución de un sistema de ecuaciones no Tema 4 22 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 lineales que consiste en encontrar las raíces (o ceros de funciones) de una ecuación no lineal con una incógnita en un rango concreto. La ecuación será polinómica de grado mayor que dos o contendrá funciones transcendentes. Sea por ejemplo el siguiente polinomio de tercer grado, x3 − 8 x2 + 25 x − 26, que tiene dos raíces complejas conjugadas (x=23i) y una raíz real (x=2). Lo podemos comprobar en Maxima usando la función allroots e incluso la función solve tal como se muestra a continuación Y también lo podemos comprobar en Scilab, mediante la siguiente instrucción -->roots([1 -8 25 -26]) ans = 2. 3. + 2.i 3. - 2.i Si analizamos el polinomio como función de x, véase figura 4.9, veremos que corta al eje x para x=2, que es la única raíz real que tiene este polinomio de tercer grado. Figura 4.9 Representación gráfica del polinomio x3 − 8 x2 + 25 x − 26 como función de x en el rango de 0 a 4 para mostrar que el polinomio tiene una raíz real en x=2. Para tratar de determinar la raíz real x=2 podemos utilizar cualquiera de los métodos iterativos basados en el teorema de Bolzano, también denominados métodos de intervalo. El teorema de Bolzano dice que: dada una función continua definida en el intervalo [a b], con f(a) y f(b) de signos distintos, existe un valor x2, a < x2 < b, tal que f(x2)=0. Por tanto x2 es una raíz real de la ecuación f(x)=0. Los métodos de intervalo nos facilitan los procedimientos (algoritmos) para encontrar ese valor. A continuación centramos nuestra atención en el método de la bisección y en el método de la regla falsa o la falsa posición. 4.3.1 Método de la bisección El método de la bisección propone ir partiendo el intervalo en dos partes iguales hasta encontrar la solución. Para ponerlo en práctica optamos por programar el siguiente algoritmo: Tema 4 23 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 1) Elegir los puntos x0=a y x1=b, es decir los extremos del intervalo de búsqueda inicial. 2) Si el intervalo [x0 x1] no se ha reducido lo suficiente, elegir como solución el punto medio del intervalo de búsqueda actual, x2=(x0+x1)/2, y evaluar la función en los puntos x0 y x2, es decir en los extremos del semi intervalo inferior. Pero si el intervalo se ha reducido lo suficiente es porque ya tenemos la solución, o porque ésta se encuentra en las proximidades de x2, luego no hace falta seguir. 3) Comprobar si f(x2) es igual a cero, si no lo es hay que seguir reduciendo el intervalo en (4). Pero si lo es ya hemos encontrado la solución exacta. 4) Comprobar si el producto f(x2) f(x0) es negativo. Si lo es quiere decir que la solución está en este semi intervalo. Por tanto, podemos acortar el intervalo de búsqueda, reasignando el extremo superior del intervalo de búsqueda haciendo x1=x2 y volver a (2). En caso contrario, la solución está en el semi intervalo superior, por tanto, debemos reasignar el extremo inferior del intervalo de búsqueda haciendo x0=x2 y volver a (2). El algoritmo anterior, con estructura de bucle en los pasos (2), (3) y (4), presenta como inconveniente que puede dar lugar a un número excesivo de iteraciones. Para evitarlo incluimos una condición adicional de parada cuando haya empleado un número de iteraciones sin encontrar la solución. El otro inconveniente, que no hemos tratado de evitarlo, es que el algoritmo presupone que el intervalo inicial está bien elegido, es decir, que se cumple que f(a) y f(b) son de distintos signos. En Scilab el método de la bisección se puede programar mediante la siguiente función (código 4.14), de nombre biseccion con cinco argumentos de entrada: f (la ecuación nolineal), a y b los extremos del intervalo de búsqueda, el número máximo de iteraciones y la precisión deseada. function x2=biseccion(f, a, b, niteraciones, precision) n=0,x0=a,x1=b while n<niteraciones & abs(x1-x0)>precision n=n+1 x2=(x0+x1)/2 disp([x0,x1]) x=x0 f0=evstr(f) x=x2 f2=evstr(f) if f2==0 then disp("Tras"),disp(n),disp("iteraciones"),disp("la solución exacta es") disp(x2) return elseif f2*f0<0 then x1=x2 else x0=x2 end end if n==niteraciones then disp("No alcanzamos la solución con la precisión deseada, la aproximación es") else disp("Tras"),disp(n),disp("iteraciones"),disp ("la solución encontrada con la precisión deseada es") end disp(x2); endfunction Código 4.14 Programación de la función biseccion en Scilab. Tema 4 24 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Y en Maxima mediante esta otra función (código 4.15). A diferencia de la función en Scilab, donde la ecuación nolineal tiene que estar expresada como una cadena de caracteres (entre los correspondientes delimitadores), en Maxima la función recibirá directamente a través de f la expresión matemática de la ecuación no lineal. De ahí también la principal diferencia entre las dos funciones; para evaluar el valor de la función f en un punto utilizamos la función evstr en Scilab tras haber asignado previamente el valor concreto a la variable x, mientras que en Maxima utilizamos la función ev pasándole la función y el punto donde se quiere evaluar. biseccion(f,a,b,niteraciones,precision):=block(n:0,x0:a,x1:b, while (n<niteraciones and abs(x1-x0)>precision) do (n:n+1,x2:(x0+x1)/2,disp([x0,x1]), if ev(f,x=x2)=0 then (disp("Hemos encontrado la solución exacta"),return(float(x2))) else if(ev(f,x=x2)*ev(f,x=x0)<0) then x1:x2 else x0:x2), if n=niteraciones then disp("No alcanzamos la solución con la precisión deseada, la aproximación es") else (disp("tras"), disp(n),disp("iteraciones"), disp ("La solución encontrada con la precisión deseada es")), float(x2)); Código 4.15 Programación de la función biseccion en Maxima. En la programación de este algoritmo tanto en Scilab como en Maxima hemos decidido incluir información en pantalla sobre el intervalo utilizado en cada momento. Esta información nos facilita la depuración del algoritmo, pero también nos vale para cualquier análisis posterior sobre cómo y por qué se ha llegado a una determinada solución. En la tabla 4.3 se muestran los resultados al tratar de encontrar la raíz real del polinomio de tercer grado x3 − 8 x2 + 25 x − 26, eligiendo el [0 3] y la precisión 0.1. Como era de esperar, ambas funciones facilitan el mismo resultado, 1.96875 que dista menos de una décima de la solución exacta x=2. Además podemos observar que el algoritmo hace la segunda búsqueda en el semi intervalo superior, la tercera en el semi intervalo inferior, la cuarta en el semi intervalo superior, y la quinta en el semi intervalo inferior. Resultados en Scilab -->biseccion('x^3-8*x^2+25*x-26',0,3,50,0.1); Resultados en Maxima 0. 3. 1.5 3. 1.5 2.25 1.875 2.25 1.875 2.0625 Tras 5. iteraciones la solución encontrada con la precisión deseada es 1.96875 Tabla 4.3 Resultados al tratar de encontrar la raíz real del polinomio de tercer grado x3 − 8 x2 + 25 x − 26, eligiendo el [0 3] y la precisión 0.1. En el ejemplo anterior se puede observar la diferencia anteriormente comentada sobre la forma de pasar la ecuación en Scilab y en Maxima. También se pueden observar ciertas diferencias en los resultados intermedios, consecuencia de que Scilab es un entorno numérico y Maxima es un entorno simbólico. Esa diferencia se ha tratado de eliminar en la presentación del resultado final haciendo uso en Maxima de la función float para forzar que el resultado se presente en formato decimal. También se podría haber utilizado la representación decimal en los resultados intermedios. Tema 4 25 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Ejercicio 4.17 Programar la función biseccion tanto en Scilab como en Maxima. Se recomienda reproducir exactamente las comentadas anteriormente, aunque puede optar por incluir pequeñas variantes, y guardarlas en un archivo con extensión sci para Scilab y en un archivo con extensión mac para Maxima. Utilizarlas para reproducir el ejemplo anterior. Está claro que el número de iteraciones que necesita el método de la bisección para encontrar la solución exacta o aproximada depende del rango elegido. En el ejemplo anterior hemos necesitado de cinco iteraciones por haber elegido el rango [0 3]. En cambio si elegimos el rango [0 4] la solución se encuentra en la primera iteración y es exacta, ya que casualmente el punto medio del intervalo elegido es el valor 2 que coincide con la solución. Pero el número de iteraciones también depende de la precisión deseada, por ejemplo la solución con la precisión deseada de una centésima tiene un valor de 1.998046875 y se alcanza en la novena iteración. Las tablas 4.4 y 4.5 muestran respectivamente las soluciones obtenidas por el método de la bisección y el número de iteraciones empleadas para el mismo polinomio para varios intervalos y varias precisiones. Se observa como la solución exacta x=2 sólo se obtiene para determinadas elecciones del rango de búsqueda, aquellos en los que al subdividirlos en partes iguales dan lugar la incluyen como extremo, en un número concreto de iteraciones con independencia de la precisión elegida. Ejercicio 4.18 Utilizar las funciones del ejercicio 4.17 para reproducir los resultados de las tablas 4.4 y 4.5. Solución [1 3] [1 4] [1 5] [1 6] [1 7] [1 8] [1 9] 0.1 2.03125 2.015625 2.03125 2.0390625 0.01 2.0019531 2.0058594 2.0019531 2.0048828 2 2 2 0.001 1.9997559 2.0003662 1.9997559 2.0006104 0.0001 2.0000305 1.9999847 2.0000305 2.0000229 Tabla 4.4 Soluciones determinadas mediante el método de la bisección para la raíz real del polinomio x3 − 8 x2 + 25 x − 26 al utilizar un intervalo concreto (por columna) y una precisión concreta (por fila). Iteraciones [1 3] [1 4] [1 5] [1 6] [1 7] [1 8] [1 9] 0.1 5 6 6 7 0.01 9 9 10 10 3 1 2 0.001 12 13 13 13 0.0001 15 16 16 17 Tabla 4.5 Número de iteraciones empleadas por el método de la bisección para encontrar la solución real al polinomio x3 − 8 x2 + 25 x − 26 utilizando un intervalo concreto (por columna) y una precisión concreta (por fila). 4.3.2 Método de la regla falsa El método de la regla falsa también propone ir generando una sucesión de intervalos que contienen a la solución, pero en lugar de reducirlos por la mitad los divide en el punto de corte con el eje x de la recta que une los puntos (a,f(a)) y (b,f(b)). La figura 4.10 justifica dicha elección y la expresión que determina el punto de división x2 del intervalo [xo x1]. Para poner en práctica el método de la regla falsa optamos por programar el siguiente algoritmo: 1) Elegir los puntos x0=a y x1=b, es decir los extremos del intervalo de búsqueda inicial. 2) Elegir el nuevo punto x2 como el punto de corte con el eje x de la recta que une los puntos (x0,f(x0)) y (x1,f(x1)). Comprobar si f(x2) está dentro de la tolerancia deseada, Tema 4 26 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 si no lo está hay que reducir el intervalo en (3). Pero si lo es ya hemos encontrado la solución. 3) Comprobar si el producto f(x2) f(x0) es negativo. Si lo es quiere decir que la solución está en este semi intervalo. Por tanto, podemos acortar el intervalo de búsqueda, reasignando el extremo superior del intervalo de búsqueda haciendo x1=x2 y volver a (2). En caso contrario, la solución está en el semi intervalo superior, por tanto, debemos reasignar el extremo inferior del intervalo de búsqueda haciendo x0=x2 y volver a (2). f(x) xo x2 x2 = x1 x o f(x1 ) - x1 f(x o ) f(x1 ) - f(x o ) Figura 4.10 Justificación de la regla falsa. En Scilab el método de la regla falsa se puede programar mediante la siguiente función (código 4.16), de nombre reglafalsa con cinco argumentos de entrada: f (la ecuación nolineal), a y b los extremos del intervalo de búsqueda, el número máximo de iteraciones y la tolerancia deseada. function x2=reglafalsa(f, a, b, niteraciones, tolerancia) n=0,x0=a,x1=b f2=2*tolerancia while n<niteraciones & abs(f2)>tolerancia n=n+1 disp([x0,x1]) x=x0 f0=evstr(f) x=x1 f1=evstr(f) x2=(x0*f1-x1*f0)/(f1-f0) x=x2 f2=evstr(f) if f2*f0<0 then x1=x2 else x0=x2 end end if n==niteraciones then disp("No alcanzamos la solución con aproximación es") else Tema 4 la tolerancia deseada, la 27 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 disp("Tras"), disp(n),disp("iteraciones"),disp encontrada con la tolerancia deseada es") end disp(x2); ("la solución endfunction Código 4.16 Programación de la función reglafalsa en Scilab. Y en Maxima mediante esta otra función (código 4.17). Además de las diferencias comentadas en la bisección, se puede observar otras ligeras diferencias entre las funciones pero que no afecta a la funcionalidad. En la función de Scilab hemos forzado la primera iteración haciendo que el valor de la función en x2 inicial sea el doble de la tolerancia. Y en la función de Maxima se ha conseguido eligiendo como x2 inicial el extremo inferior del intervalo. En este caso sí se ha preferido hacer una presentación decimal de los resultados intermedios en Maxima, pues de no hacerlo así la expresión numérica que se va generando en las sucesivas iteraciones es excesivamente compleja y no facilita la depuración del algoritmo. reglafalsa(f,a,b,niteraciones,tolerancia):=block(n:0,x0:a,x1:b,x2:x0, while (n<niteraciones and abs(ev(f,x=x2))>tolerancia) do (n:n+1,disp(float([x0,x1])),x2:(x0*ev(f,x=x1)-x1*ev(f,x=x0))/(ev(f,x=x1)-ev(f,x=x0)), if(ev(f,x=x2)*ev(f,x=x0)<0) then x1:x2 else x0:x2), if n=niteraciones then disp("no alcanzamos la solución con la tolerancia deseada, la aproximación es") else (disp("tras"), disp(n),disp("iteraciones"), disp ("la solución encontrada con la tolerancia deseada es")), float(x2)); Código 4.17 Programación de la función reglafalsa en Maxima. En este algoritmo, con estructura de bucle en los pasos (2) y (3), también es necesario incluir la condición de parada por número de iteraciones sin encontrar la solución. A diferencia del método de la bisección, la condición principal de parada en el método de la regla falsa no está en la precisión a la solución (tamaño del intervalo de búsqueda) sino en la tolerancia con la que el valor de la función en ese punto, candidato a la solución, se aproxima al cero. Por tanto los dos algoritmos tal como están programados hasta ahora no son directamente comparables, pero se puede hacer una modificación en el algoritmo de la bisección para que sí lo sean. En la tabla 4.6 se muestran los resultados al tratar de encontrar la raíz real del polinomio de tercer grado x3 − 8 x2 + 25 x − 26, eligiendo el intervalo [0 3] y la tolerancia 0.1. Como era de esperar y salvo el redondeo en la presentación, ambas funciones facilitan el mismo resultado, 2.0129439. El algoritmo ha necesitado nueve iteraciones y se puede observar que en las sucesivas iteraciones la búsqueda siempre se ha dirigido al semi intervalo inferior. Tema 4 28 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Resultados en Scilab -->reglafalsa('x^3-8*x^2+25*x-26',0,3,50,0.1); 0. 0. 0. 0. 0. 0. 0. 0. 0. Resultados en Maxima 3. 2.6 2.3722628 2.23185 2.1440904 2.0892931 2.0552059 2.0340748 2.0210089 9. iteraciones la solución encontrada Tras con la tolerancia deseada es 2.0129439 Tabla 4.6 Resultados al tratar de encontrar la raíz real del polinomio de tercer grado x3 − 8 x2 + 25 x − 26, eligiendo el [0 3] y la tolerancia 0.1. Aunque ya hemos comentado que los dos algoritmos, el de la bisección y el de la regla falsa, no son directamente comparables. En el ejemplo anterior se observa que la solución encontrada por la regla falsa tiene una precisión de casi una centésima, tras necesitar un número de iteraciones similar al que hubiera necesitado el de la bisección para esa precisión, observe alguno de los ejemplos de la tabla 4.5 aunque los rangos elegidos son diferentes. En cambio la regla falsa presenta una ventaja importante respecto a la bisección, la solución buscada puede estar fuera del intervalo de búsqueda inicial. El siguiente ejemplo, ejecutado sólo en Scilab, muestra que a pesar de elegir el intervalo de búsqueda inicial [3 5] que no contiene la solución x=2, la regla falsa es capaz de encontrar una solución con la precisión solicitada en seis iteraciones. -->reglafalsa('x^3-8*x^2+25*x-26',3,5,50,0.1); 3. 5. 2.6 5. 2.3214286 5. 2.1512491 5. 2.063906 5. 2.0252814 5. Tras 6. iteraciones la solución encontrada con la tolerancia deseada es 2.0096888 Ejercicio 4.19 Programar la función reglafalsa tanto en Scilab como en Maxima. Se recomienda reproducir exactamente las comentadas anteriormente, aunque puede optar por incluir pequeñas variantes, e incorporarlas junto con la funcion biseccion en el correspondiente archivo con extensión sci para Scilab y con extensión mac para Maxima. Utilizarlas para reproducir los ejemplos anteriores. Y también las puede utilizar para generar unas tablas similares a las 4.4 y 4.5. Ejercicio 4.20 Dado el siguiente polinomio de quinto grado, x5 − 5 x4 + 40 x2 − x − 195. a) Comprobar que tiene cuatro raíces complejas conjugadas y una raíz real. b) Utilizar las funciones biseccion y reglafalsa para determinar el valor de la raíz real con una precisión y una tolerancia de 0.1 respectivamente. 4.3.3 Soluciones de ecuaciones trascendentes El método de la bisección y el de la regla falsa no presuponen nada sobre la naturaleza de la ecuación a resolver, por tanto las funciones que hemos programado también se pueden Tema 4 29 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 utilizar para determinar soluciones reales de ecuaciones trascendentes. Por ejemplo si 3 queremos encontrar el valor de x que verifica la igualdad e-x = 2 x - 1 , el único problema que nos podemos encontrar es que tengamos que probar varios intervalos hasta encontrar la solución o bien ayudarnos de la representación gráfica. A continuación, por la ejecución realizada en Scilab con la regla falsa, se observa que la solución está próxima a x=0.8, y la hemos podido localizar con la precisión de una milésima en tan solo dos iteraciones en el rango [-1 1]. -->reglafalsa('exp(-x^3)-2*x+1',-1,1,15,0.001); - 1. 1. - 1. 0.8009195 2. iteraciones la solución encontrada con la tolerancia deseada es Tras 0.7997860 Este caso no se podría haber resuelto en Maxima con la función solve, que sólo resuelve ecuaciones algebraicas, pero sí con la función find_root que es la opción numérica ofrecida por Maxima para buscar la raíz de una expresión genérica en un intervalo cerrado. La búsqueda se basa en el método de la bisección pero incorpora ciertas mejoras como puede consultar en el manual de ayuda. La llamada a la función find_root también se puede realizar a través de la opción Calcular raíz del menú Ecuaciones de la ventana principal de wxMaxima Tecleando find_root(exp(-x^3)=2*x-1,x,-1,1); se obtiene 0.79977648126306 como resultado. En Scilab el cálculo de raíces reales, pero no sólo de una ecuación no lineal sino de un sistema de ecuaciones no lineales, está contemplado a través de la función fsolve. Se recomienda consultar el manual de ayuda. A continuación se muestra como ejemplo la resolución con fsolve del sistema (4.10) para el caso particular a=1, b=1, c=0.5. Recordemos que según la figura 4.10 este sistema de ecuaciones tenía dos soluciones, los puntos de corte de la recta secante con la circunferencia. Observe que: a) Hemos definido una función snle1 que devuelve los residuos (restos) de las dos ecuaciones que constituyen el sistema (4.10). b) La función recibe las variables x e y del sistema de ecuaciones, a través de un vector que hemos denominado xy, y los parámetros a, b, c. c) Se ha fijado el valor de los parámetros a=1, b=1 y c=0.5, y se ha llamado dos veces a la función fsolve con dos valores distintos de búsqueda inicial para determinar los dos puntos de corte. Éstos resultan ser (-0.4114, 0.9114) y (0.9114, -0.4114) como se podía esperar por inspección de la figura 4.8. // función y resolución del sistema de ecuaciones a*x+b*y=c, x^2+y^2=1 function residuo=snle1(xy, a, b, c) x=xy(1); y=xy(2); residuo(1)=a*x+b*y-c residuo(2)=x^2+y^2-1 endfunction a=1;b=1;c=0.5 // determinación de las dos iniciales solucion1=fsolve([0;1],snle1) disp(solucion1) soluciones eligiendo distintos valores solucion2=fsolve([1;0],snle1) disp(solucion2) Código 4.18 Resolución del sistema (4.10) con la función fsolve de Scilab. Tema 4 30 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Ejercicio 4.21 a) Utilizar las funciones biseccion y reglafalsa programadas en Scilab o Maxima para encontrar la raíz real de la ecuación x3 + ex - 10 = 0 con una precisión y una tolerancia de 0.001 respectivamente sabiendo que la raíz está en el rango [-2 2]. b) Comprobar el resultado de forma gráfica y compararlo con el obtenido haciendo uso de la función find_root en Maxima o de la función fsolve en Scilab. Todos los ejemplos que hemos resuelto hasta ahora con las funciones biseccion y reglafalsa tienen en común que únicamente tenían una solución real. En el siguiente ejemplo analizamos una ecuación trascendente que para x0 puede llegar a tener tres, dos, una o ninguna solución según sea el valor del parámetro c. Se trata de la ecuación ex = xe + c Si c=0.5 se puede comprobar gráficamente, véase la figura 4.11, que la ecuación tiene dos soluciones reales para x0. La primera solución está próxima a 2.20 y la segunda está próxima a 3.09. La búsqueda de estas soluciones con las funciones biseccion y reglafalsa ya no es tan fácil como en los ejemplos anteriores, es preciso tener bien delimitados los intervalos de búsqueda. Así la primera solución la podremos buscar en el intervalo [1.5 2.5] con biseccion con una precisión de una milésima en 10 iteraciones, y con reglafalsa con una tolerancia de una milésima en 3 iteraciones. Y la segunda solución la podremos buscar en el intervalo [2.5 3.5] con biseccion con una precisión de una milésima en 10 iteraciones, y con reglafalsa con una precisión de una milésima en 13 iteraciones. Las soluciones también se pueden encontrar con la función find_root de Maxima. Figura 4.11 Representación gráfica de las funciones ex y xe + 0.5 en el rango de 0 a 3.5 para mostrar que la ecuación ex = xe + 0.5 tiene dos raíces reales. Si c=1 se puede comprobar gráficamente, véase la figura 4.12, que la ecuación tiene tres soluciones reales para x0. La primera solución está en 0, la segunda está próxima a 1.87 y la tercera está próxima a 3.22. Con la reglafalsa o con find_root podremos encontrar las tres soluciones utilizando por ejemplo los intervalos de búsqueda [0 0.5], [1.5 2.5] y [2.5 3.5]. Pero con la biseccion no podremos encontrar la solución x=0 debido a la imposibilidad de seleccionar un intervalo de búsqueda [a b], con f(a) y f(b) de signos distintos. Ejercicio 4.22 La selección del intervalo de búsqueda es aún más difícil si en la ecuación intervienen funciones periódicas. Ayúdese de la representación gráfica para acotar el intervalo o intervalos de búsqueda y para resolver las tres ecuaciones trascendentes siguientes: a) x = cos (x) Tema 4 b) sen (x) = 0 c) x 2 1 tg ( x) 31 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Figura 4.12 Representación gráfica de las funciones ex y xe + 1 en el rango de 0 a 3.5 para mostrar que la ecuación ex = xe + 1 tiene tres raíces reales. 4.3.4 Otros métodos en la resolución de ecuaciones no lineales En este apartado hemos centrado la atención en la bisección y la regla falsa para conocer algo de los métodos de intervalo, pero existen algoritmos y/o variantes mucho más efectivos. Entre ellos el método de Newton, que sólo necesita de un valor inicial y hace uso de la derivada de la función para optimizar la búsqueda de la solución. Este método es el que emplea la función fsolve de Scilab, a la que opcionalmente se le puede facilitar la derivada de la ecuación o el jacobiano del sistema de ecuaciones. Si no se le facilita, como ha ocurrido al resolver el sistema (4.10), la función provocará una evaluación numérica de la derivada o del jacobiano según corresponda. En el entorno de Maxima es posible utilizar el método de Newton si se carga el paquete mnewton. Así por ejemplo las siguientes instrucciones nos permiten resolver el sistema (4.10) para el caso particular a=1, b=1, c=0.5. load(mnewton); mnewton([x+y=0.5,x^2+y^2=1],[x,y],[0,1]); mnewton([x+y=0.5,x^2+y^2=1],[x,y],[1,0]); Código 4.19 Resolución del sistema (4.10) con la función mnewton de Maxima. 4.4 EJEMPLOS DE RESOLUCIÓN DE ECUACIONES DIFERENCIALES ORDINARIAS Para la resolución de ecuaciones diferenciales ordinarias de primer y segundo orden podríamos hacer uso de la opción Resolver EDO del menú Ecuaciones de la ventana principal de wxMaxima. En ese caso se nos presenta una ventana donde debemos teclear la función a determinar (por defecto, y) y la variable independiente (por defecto x). No es más que una ayuda para hacer uso de la función ode2. A continuación seleccionamos como primer ejemplo la misma ecuación diferencial (4.13) que se describe en el apartado “Ecuaciones diferenciales” del documento Primeros pasos en Maxima, se trata de la ecuación primer orden x 3 (y - 1) Tema 4 d y + (x - 1) y3 = 0 dx (4.13) 32 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Cuya representación obliga al uso de la comilla simple (´) delante de la función diff para evitar el cálculo de la derivada y cuya resolución provoca el siguiente resultado Donde %c representa un parámetro (constante), que se ajustará de acuerdo a la condición que se le quiera imponer al resultado. Con el fin de facilitar este paso, Maxima tiene la función ic1. Por ejemplo, como en el apartado “Ecuaciones diferenciales” del documento Primeros pasos en Maxima, con la siguiente instrucción estamos imponiendo que y(2)=-3. En el documento Primeros pasos en Maxima puede consultar otros tipos de ecuaciones diferenciales ordinarias que se pueden resolver con la función ode2. También puede consultar la resolución de la ecuación de segundo orden (4.14), donde el resultado contiene dos parámetros (constantes) que se ajustan imponiendo una condición al resultado y a su derivada mediante la función ic2 de Maxima o imponiendo condiciones de contorno mediante la función bc2. d d2 y= y+x dx d x2 (4.14) Ejemplo de reproducción por bipartición. Determinadas células embrionarias se reproducen por bipartición, es decir cada célula embrionaria se divide en dos células que a su vez se vuelven a dividir y así sucesivamente. El tiempo empleado en cada subdivisión se puede considerar el mismo, la unidad de tiempo, y por tanto una característica del proceso reproductor. A continuación vamos a comprobar que este proceso puede venir descrito por la siguiente ecuación diferencial (4.15) d x(t) = 2 t ln(2) x o dt (4.15) Donde xo representa el número de células en el instante t=0 y ln representa la función logaritmo neperiano. Efectivamente, con el siguiente conjunto de instrucciones (código 4.20) hemos conseguido representar la ecuación diferencial, resolverla, particularizar el resultado para el caso xo=10 y presentar la evolución del proceso en las cinco primeras unidades de tiempo. Se puede observar como el número de células embrionarias pasa de 10 a 20 en la primera unidad de tiempo, de 20 a 40 en la segunda, de 40 a 80 en la tercera, de 80 a 160 en la cuarta y de 160 a 320 en la quinta. Este ejemplo concreto de ecuación diferencial se podría haber resuelto por integración directa, pero no será tan fácil con otras ecuaciones. Habría bastado con la instrucción x:integrate(2^t*log(2)*xo,t);. Tema 4 33 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Código 4.20 Resolución de la ecuación diferencial (4.15) en Maxima. Ejemplo de crecimiento exponencial. Se sabe que la ecuación diferencial (4.16) puede servir para describir el crecimiento exponencial que suele experimentar una población en plena expansión, donde el parámetro k>0 representa la tasa neta de crecimiento de la población p(t). d p(t) = k p(t) dt (4.16) Su resolución en Maxima se puede llevar a cabo con el siguiente conjunto de instrucciones (código 4.21). Con las dos primeras instrucciones hemos conseguido representar la ecuación y obtener la expresión analítica general para p(t) mediante resolución de (4.16), con po como valor inicial de la población. A continuación hemos utilizado la expresión p(t) para determinar el tiempo de duplicación, es decir el intervalo de tiempo necesario para que la población inicial se haya duplicado de valor. Observe que este tiempo de duplicación depende únicamente de la tasa neta de crecimiento de la población. Y por último hemos comprobado gráficamente los resultados para el caso concreto de po=10 y k=0.1. Al que corresponde un tiempo de duplicación aproximado de 7 unidades de tiempo. Tema 4 34 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Código 4.21 Resolución de la ecuación diferencial (4.16) en Maxima. Ejercicio 4.23 Supongamos un depósito de sección regular como el de la figura 4.13, destinado a contener líquido, que dispone de un agujero (inicialmente tapado) en la parte inferior. Se sabe que la ecuación diferencial (4.17) puede servir para describir el vaciado del depósito si el líquido ocupaba un nivel inicial ho antes de quitar el tapón del agujero. k es un parámetro dependiente del tamaño del agujero y A es el área de la sección del depósito. Observe que el término de la izquierda de la ecuación (4.17) representa la variación instantánea del volumen de líquido contenido en el depósito, es decir el caudal de salida en cm3/s. Por tanto la ecuación pronostica que el caudal de salida del depósito es directamente proporcional a la raíz cuadrada del nivel instantáneo que ocupa el líquido y al tamaño del agujero. Esa proporcionalidad está recogida en el parámetro k. A d h - k dt h (4.17) En la gráfica de la figura 4.13 se muestra el vaciado previsto por la ecuación (4.17) para un depósito con k=10 y A=5 que contenía inicialmente líquido hasta un nivel de 100 cm. Se observa que el depósito se vaciará en aproximadamente 10 segundos. Determine una expresión h(t) analítica para esta gráfica mediante resolución de la ecuación diferencial (4.17). Tema 4 35 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 h tapón Figura 4.13 Esquema de un depósito con agujero destinado a contener líquido y evolución del nivel de líquido como consecuencia de un vaciado. Maxima también incorpora la resolución analítica de sistemas de ecuaciones diferenciales mediante la función desolve, que permite resolver ecuaciones diferenciales de orden mayor que dos. En el apartado “Ecuaciones diferenciales” del documento Primeros pasos en Maxima puede consultar un par de ejemplos. No obstante en determinados casos la resolución analítica no es posible y es necesario acudir a la resolución numérica. En los paquetes diffeq y dynamics puede encontrar funciones como runge1, runge2 y rk que emplean el método de Runge-Kutta, también comentadas en el documento Primeros pasos en Maxima. En cambio, si decidimos trabajar con Scilab, que no dispone de resolución analítica de ecuaciones diferenciales, todas las resoluciones serán numéricas. Para ello utilizaremos la función ode, que admite la elección del método numérico de integración, entre ellos el método de Runge-Kutta. A continuación mostraremos cómo abordar la resolución numérica de las ecuaciones diferenciales (4.15) y (4.16). En primer lugar hay que definir la ecuación diferencial mediante una función de usuario del tipo f(t,x) donde t representa el tiempo y x la variable dependiente, en segundo lugar elegimos la condiciones iniciales y fijamos los instantes de tiempo en los que queremos calcular la solución, pues todo ello son parámetros que necesita conocer la función ode de Scilab. Para más información consulte el Manual de Ayuda. Por ejemplo, el siguiente conjunto de instrucciones (código 4.22) nos permite resolver la ecuación diferencial (4.15) y reproducir la división celular por bipartición. Observe que: a) La ecuación diferencial la hemos definido a través de la función ed_biparticion. b) La función recibe obligatoriamente las variables t, x (aunque no dependa de esta última) y los parámetros (constantes) que intervienen en la ecuación diferencial. c) Se ha fijado la condición inicial x(0)=10, se ha elegido la misma ventana temporal, 5 unidades de tiempo, que en Maxima y hemos indicado que deseamos conocer únicamente los valores de la solución en las unidades de tiempo. d) Se ha solicitado tanto la presentación numérica como gráfica de resultados. Los valores obtenidos y representados en la figura 4.14 concuerdan con lo esperado, pues reproducen la secuencia: 10, 20, 40, 80, 160, 320. function xdot=ed_biparticion(t, x, xo) xdot=2^t*log(2)*xo endfunction xo=10;to=0;t=0:1:5; x=ode('rk',xo,to,t,ed_biparticion) disp([t;x]') plot(t,x,'o'), xlabel('t'), ylabel('x') Código 4.22 Resolución de la ecuación diferencial (4.15) en Scilab. Tema 4 36 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Figura 4.14 Comprobación por resolución numérica de la ecuación diferencial (4.15) para xo=10 que la población se duplica en cada unidad de tiempo. Ejercicio 4.24 Compruebe que el siguiente conjunto de instrucciones le permite resolver la ecuación diferencial (4.16) y reproducir el crecimiento exponencial. Observe en los resultados numéricos p(0), p(7) y p(14) que el tiempo de duplicación de la población es aproximadamente de 7 unidades de tiempo, como se demostró analíticamente. function pdot=ed_crec_exponencial(t, p, k) pdot=k*p endfunction k=0.1;po=10;to=0;t=0:1:20; p=ode('rk',po,to,t,ed_crec_exponencial) disp([t;p]') plot(t,p,'o'), xlabel('t'), ylabel('p') Ejercicio 4.25 Utilice la resolución numérica ode en Scilab para simular el vaciado del depósito de la figura 4.13 para distintos tamaños del agujero. Recuerde que para variar el tamaño del agujero puede emplear la constante de proporcionalidad k, por tanto se recomienda primero reproducir la gráfica de la figura 4.13 y luego repetir para al menos otros dos valores de k. Ejemplo de oscilación mantenida. Supongamos un péndulo simple como el representado en la figura 4.15, compuesto de una pequeña bola de masa m suspendida de un hilo de longitud L. Si desplazamos la bola desde la posición de equilibrio hasta que el hilo forme un ángulo o con la vertical, y luego la abandonamos partiendo del reposo, el péndulo oscilará en un plano vertical bajo la acción de la gravedad. Las oscilaciones, en ausencia de rozamiento, serán simétricas respecto a la vertical y tendrán lugar a lo largo de un arco de circunferencia entre las posiciones extremas o y -o. A continuación vamos a comprobar que este movimiento oscilatorio se puede describir mediante la ecuación diferencial de segundo orden (4.18), donde g es la aceleración de la gravedad. L d2 θ + g sen θ = 0 dt 2 (4.18) En la resolución de (4.18) vamos a poder utilizar la función ode de Scilab, pero antes es necesario expresar la ecuación diferencial de segundo orden como un sistema de dos ecuaciones diferenciales de primer orden (4.19), donde hemos incorporado la variable (la velocidad angular) como la derivada de la posición angular . Pasamos así a tener dos variables de estado en el sistema, la posición angular y la velocidad angular. Tema 4 37 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 d θ=ω dt d g ω=sen θ dt L (4.19) Ahora sí podemos utilizar el siguiente conjunto de instrucciones para simular el movimiento del péndulo simple. Observe que la función que define la ecuación diferencial recibe en x las dos variables de estado, la posición angular y la velocidad angular. En la figura 4.15 se muestra una gráfica con la posición angular a lo largo del tiempo para un péndulo de longitud 0.5 metros, si se suelta a 45º de la vertical. Se recomienda programar las siguientes instrucciones en Scilab (código 4.23) para reproducir los resultados de la figura 4.15. También puede generar una gráfica con la velocidad angular (segunda componente del vector de resultados x) para comprobar que el péndulo alcanza el máximo y el mínimo de velocidad al pasar por la posición vertical. Y por supuesto también puede utilizarlas para comparar distintas experiencias, partiendo de distintas posiciones iniciales y/o eligiendo distintas longitudes del péndulo. // Péndulo simple sin rozamiento function xdot=ed_pendulosimple(t, x, L) g=10 xdot(1)=x(2) xdot(2)=-g*sin(x(1))/L endfunction L=0.5;xo=[%pi/4;0];to=0;t=0:.05:10; x=ode('rk',xo,to,t,ed_pendulosimple) tetagrados=180*x(1,:)/%pi plot(t,tetagrados), xlabel('t'), ylabel('teta (grados)') Código 4.23 Resolución del sistema de ecuaciones diferenciales (4.19) en Scilab. L Figura 4.15 Esquema del péndulo simple y comprobación de la oscilación por resolución numérica del sistema de ecuaciones diferenciales (4.19) para g=10, L=0.5, partiendo del reposo a 45º de la vertical. Ejercicio 4.26 Dado que la función ode2 de Maxima permite la resolución de ecuaciones de segundo orden. a) Comprobar que el siguiente conjunto de instrucciones en Maxima permite reproducir de forma aproximada la oscilación mantenida del péndulo simple. b) Imponer otras condiciones a la derivada para simular situaciones en las que el péndulo no parta del reposo. g:10$l:0.5$ ec:l*'diff(teta,t,2)+g*(teta)=0; soluciongeneral:ode2(ec,teta,t); Tema 4 38 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 solucionparticular:ic2(soluciongeneral,t=0,teta=%pi/8,'diff(teta,t)=0); wxplot2d(rhs(%),[t,0,5])$ Ejercicio 4.27 El sistema de ecuaciones (4.19) ha servido para representar una oscilación mantenida, la que presenta el péndulo simple en condiciones ideales. Sin embargo en presencia de algún tipo de rozamiento la oscilación tenderá a disminuir de amplitud y el péndulo recuperará la posición de reposo. Compruebe en Scilab que este otro sistema de ecuaciones (4.20), donde se ha introducido un rozamiento proporcional a la velocidad angular, puede servir para simular ese fenómeno. El nuevo parámetro, el coeficiente de rozamiento b>0, le permitirá incluir más o menos rozamiento. Con b=0.2 debería observar una gran amortiguación respecto a la oscilación de la figura 4.15. d dt d g b sen dt L L (4.20) 4.5 EJEMPLOS DE OPTIMIZACIÓN El ejemplo 3 del tema 1 era un problema de valor extremo, concretamente de valor máximo, que se resolvió en Scilab y en Maxima mediante búsqueda exhaustiva entre las ternas de los números naturales que suman 15. El problema se podría haber formulado en términos de optimización como sigue: encontrar el máximo de una función producto de tres números naturales a, b y c sujeto a varias restricciones. La primera restricción, las tres variables suman 15. La segunda restricción, las tres variables sólo pueden que tomar valores distintos entre sí. Que se puede expresar matemáticamente como sigue: max f(a,b,c) (a,b,c) N3 f(a,b,c) = a b c a + b + c = 15 ; |a – b| > 0 ; |a – c| > 0 ; |b – c| > 0 Como en todo problema de optimización existe una función de coste, que en este caso se quiere maximizar. Existe un dominio de búsqueda, en este caso las ternas de números naturales. Y además suelen coexistir distintos tipos de restricciones. La primera restricción es de igualdad. Pero las otras restricciones son de desigualdad. Aunque parezca fácil, este problema de optimización no se resuelve fácilmente con los programas de cálculo matemático. Una de las principales dificultades es que las tres variables son números naturales, por tanto nos encontramos con un problema de optimización discreta, y la otra dificultad es que las variables no pueden tomar el mismo valor. De ahí que en el tema 1 se optó en una primera opción por resolverlo por búsqueda exhaustiva. Pero la búsqueda se pudo reducir algo más y la dimensión del problema de optimización también si eliminamos la restricción de igualdad incorporándola en la función. Basta despejar c = 15 – a – b y formular el problema de optimización de esta otra forma max f(a,b) (a,b) N 2 f(a,b,c) = a b (15 – a – b) |a – b| > 0 Tema 4 39 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Algunos problemas de optimización tienen solución analítica mediante el cálculo diferencial. Pues al tratarse de valores extremos (máximos y mínimos), la solución buscada será una raíz de la ecuación resultante de igualar a cero la derivada de la función de coste. Pero en general no existirá la solución analítica y habrá que acudir a métodos numéricos. Mientras que Maxima no dispone de funciones específicas para optimización, no ocurre lo mismo con Scilab más especializado en cálculo numérico. A lo largo del tema veremos algunos ejemplos que admiten solución analítica pero también los abordaremos de forma numérica. Con independencia de las restricciones existen dos tipos de optimizaciones, la optimización por máximo y la optimización por mínimo, pero en general optaremos por plantear siempre la optimización como un problema de mínimo. Pues un máximo de la función f(x) es un mínimo de la función –f(x). Ejemplo de optimización por mínimo. Supongamos que nos preguntan ¿qué puntos de la gráfica y = 4 – x2 están más cerca del punto (0,2)? En primer lugar vamos a plantear el problema en términos de optimización. Como la distancia de un punto cualquiera (x,y) del plano XY al punto (0,2) viene dada por d(x,y) = x2 + y - 2 2 Al imponer, sustituyendo y por 4 – x2, la restricción de que el punto (x,y) debe pertenecer a la gráfica llegamos a la siguiente expresión para la distancia, función únicamente de x d(x) = x2 + 4 - x2 - 2 = 2 x 4 - 3x 2 + 4 (4.21) Luego el problema se puede resolver encontrando el valor o valores reales de x para los que la función (4.21) presenta el valor mínimo. Y aún se puede reducir algo más, puesto que el mínimo del radicando será el que produzca un valor mínimo de la distancia. Si derivamos el radicando e igualamos a cero llegamos a que el valor o valores buscados debe verificar la igualdad 4 x3 – 6 x = 0. En definitiva se trata de determinar las tres raíces de este polinomio de tercer orden que son respectivamente x=0, x = 3 3 , x= 2 2 Aún no hemos resuelto totalmente el problema, pues los valores de x que hemos determinado anulando la derivada pueden corresponder a valores que hacen mínima o máxima la función. Si volvemos a derivar nos queda la función 12 x2 – 6, que presenta un valor negativo para x=0, por tanto para este valor de x tenemos un máximo de la distancia, y presenta un valor positivo igual a 12 para los otros dos valores de x. Por tanto el mínimo de la distancia se presenta para estos dos últimos valores de abscisa, que sustituyendo en la ecuación de la gráfica nos da el mismo valor de ordenada. La respuesta a la pregunta son los puntos: 3 5 , 2 2 Tema 4 , 3 5 , 2 2 40 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 A continuación se recogen las instrucciones (código 4.24) que nos permiten resolver este problema en Maxima y también se recoge una gráfica de la función d(x) para comprobar que presenta dos mínimos (los correspondientes a las dos soluciones) y un máximo local en x=0. Código 4.24 Ejemplo de optimización por mínimo en Maxima. La resolución analítica nos ha permitido encontrar las dos soluciones del problema, algo esperado si analizamos gráficamente la simetría del problema mediante la figura 4.16. Figura 4.16 Representación gráfica de la parábola y=4-x2, marcando los dos puntos de la parábola que están más cerca del punto (0,2). Pero el problema también se puede abordar de forma numérica a varios niveles: con la formulación inicial, optimización para dos variables con una restricción de igualdad, con la Tema 4 41 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 formulación monovariable sin restricciones tras la eliminación de la restricción de igualdad, como un problema de raíces a partir de la derivada de la distancia. En cualquier caso, salvo que utilicemos un método numérico de búsqueda exhaustiva, nunca tendremos la seguridad total de haber encontrado la solución y por supuesto sólo podremos determinar una de las dos soluciones. El siguiente conjunto de instrucciones (código 4.25) nos permite abordar numéricamente el problema monovariable en Scilab haciendo uso de la función fminsearch. Esta función es capaz de encontrar mínimos locales de una función real monovariable o multivariable mediante el algoritmo de Nelder-Meade simplex. En las primeras instrucciones hemos definido la función correspondiente a la expresión (4.21). A continuación hemos utilizado la función optimset de Scilab para poner la tolerancia 0.001 con la que deseamos determinar la solución. Hemos elegido xo=5 como punto inicial para búsqueda de la solución con fminsearch. Por último hemos mostrado la solución encontrada y la comparamos con las soluciones analíticas, conocidas por el desarrollo anterior. function d=distancia(x) y=4-x^2 d=sqrt(x^2+(y-2)^2) endfunction opt = optimset ( "TolX" , 0.001 ); xo=5 [x,fval,exitflag,output]=fminsearch(distancia,xo,opt); y=4-x^2 disp([x,y],'solución numérica') disp([sqrt(3/2),5/2],[-sqrt(3/2),5/2],'soluciones analíticas') Código 4.25 Ejemplo de optimización por mínimo en Scilab. El estudiante puede comprobar que este conjunto de instrucciones provoca el siguiente resultado en la consola de Scilab solución numérica 1.2246094 2.5003319 soluciones analíticas - 1.2247449 2.5 1.2247449 2.5 Se observa que la función ha sido capaz de encontrar la solución con x>0. Y basta probar con otros puntos de búsqueda inicial para comprobar que la función también es capaz de encontrar la otra solución. Ejemplo de optimización por máximo. Supongamos que con una cartulina de 8x5 metros se desea construir una caja, de tipo caja de zapatos sin tapa, de volumen máximo. ¿Qué dimensiones debería tener dicha caja? El volumen de la caja es una función de tres variables; las dimensiones de la caja: el largo a, el ancho b y el alto c, V(a,b,c) = a b c. El recorte de la caja en la cartulina impone dos ecuaciones de ligadura en sus dimensiones, como se puede observar en la figura 4.17 2c+a=5 Tema 4 ; 2c+b=8 42 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Por tanto expresando a y b en función de c llegamos a una expresión para el volumen que es únicamente función de c V(c) = (5 – 2 c) (8 – 2 c) c = 4 c3 – 26 c2 + 40 c 8 5 c a b Figura 4.17 Recorte de una caja de zapatos sin tapa en una cartulina rectangular. El máximo volumen se obtendrá para el valor de c que anula la primera derivada: V’(c) = 12 c2 – 52 c + 40. Las dos raíces de este polinomio son respectivamente c = 1, c = 10 3 Pero como el lado c no puede tener cualquier valor, sino que tiene que ser inferior a 2.5. La solución que buscamos es c = 1, las otras dos dimensiones son por tanto a = 3 y b = 6. Y por tanto la caja tendrá una capacidad de 18 m3, la máxima posible. A continuación se recogen las instrucciones (4.26) que nos permiten resolver este problema en Maxima y también se recoge una gráfica de la función V(c) para comprobar que presenta un máximo en c=1 (la solución). Código 4.26 Ejemplo de optimización por máximo en Maxima. Tema 4 43 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 El siguiente conjunto de instrucciones (código 4.27) nos permite resolverlo numéricamente en Scilab. Como en el ejemplo anterior mostramos la solución encontrada y la comparamos con la solución analítica, conocida por el desarrollo anterior. Como valor de búsqueda inicial hemos elegido el máximo posible co=2.5, el estudiante puede comprobar que la solución numérica coincide con la analítica. Pero también puede comprobarlo para otras elecciones del valor inicial. function v=volumen(c) a=5-2*c b=8-2*c v=-a*b*c endfunction opt = optimset ( "TolX" , 0.001 ); co=2.5 [c,fval,exitflag,output]=fminsearch(volumen,co,opt); a=5-2*c b=8-2*c disp([a b c],'solución numérica') disp([3 6 1],'solución analítica') Código 4.27 Ejemplo de optimización por máximo en Scilab. Ejercicio 4.28 En la figura 4.18 se muestra un circuito de corriente continua con una batería y dos resistencias. La batería proporciona una tensión fija de 20 V y una de las resistencias es de 10 ohmios. Se desea determinar el valor R de la otra resistencia para que la potencia disipada en ella sea máxima. Recuerde que el comportamiento de este circuito viene descrito por V = I (R + 10), donde I es la intensidad de corriente que circula por las dos resistencias, y que la potencia disipada por la resistencia R viene dada por la expresión P = I2 R. Se recomienda abordar la resolución analítica en Maxima y la resolución numérica en Scilab. Figura 4.18 Circuito de corriente continua con una batería y dos resistencias. Un problema de minimización en dos dimensiones. Se trata de determinar las dimensiones a, b, c del paralelepípedo rectangular de volumen dado V que tiene una superficie total menor. La superficie total del paralelepípedo rectangular es S = 2 (a b + a c + b c) y su volumen impone la siguiente restricción a b c = V. Por tanto despejando c y sustituyendo en la expresión de la superficie nos queda una función de dos variables S(a,b) = 2 (a b + V V + ) b a (4.22) Por tanto esta optimización se puede abordar numéricamente en Scilab como un problema de búsqueda de mínimo en dos dimensiones utilizando la función fminsearch. El conjunto Tema 4 44 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 de instrucciones necesarias sigue un esquema similar a los casos monovariables anteriores. Pero con dos claras diferencias, la variable se le pasa a la función como un vector y la restricción, que puede tomar distintos valores se le pasa como parámetro. function S=paralelepipedo(x, V) a=x(1);b=x(2); c=V/(a*b) S=2*(a*b+a*c+b*c) endfunction opt = optimset ( "TolX" , 0.001 ); V=8; xo=[1;1] [x,fval,exitflag,output]=fminsearch(paralelepipedo,xo,opt); a=x(1) b=x(2) c=V/(a*b); disp([a b c]) Código 4.28 Ejemplo de minimización en dos dimensiones con la función fminsearch de Scilab. A continuación abordamos el problema con otra función de Scilab, la función optim. A diferencia de fminsearch, la función optim es capaz de resolver problemas más complejos de optimización con restricciones por rango en las variables. No obstante en este caso concreto la utilizaremos de la forma más simple. Para conseguirlo la función optim requiere que la función del usuario (código 4.29) facilite al menos la función de coste y el valor del gradiente (las derivadas parciales en el caso multivariable). En este caso concreto la función de coste es la superficie S y el gradiente, representado por dS en la función del paralelepipedo, tiene dos componentes. La primera componente representa la derivada parcial de S respecto a la variable a y la segunda representa la derivada parcial de S respecto a la variable b. function [S, dS, ind]=paralelepipedo(x, ind, V) a=x(1);b=x(2); c=V/(a*b) S=2*(a*b+a*c+b*c) dS(1)=2*(b-V/a^2) dS(2)=2*(a-V/b^2) endfunction V=8; [S,x,dS]=optim(paralelepipedo,[1;1],'gc'); a=x(1) b=x(2) c=V/(a*b); disp([a b c]) Código 4.29 Ejemplo de minimización en dos dimensiones con la función optim de Scilab. En el caso concreto de V=8 m3 el estudiante puede comprobar, programando y ejecutando estas instrucciones, que la solución encontrada por fminsearch es (2.0002395, 1.9999037, 1.9998568) y la solución encontrada por optim es (2, 2, 2). Siendo ésta última la más exacta, a la que corresponde un área de 24 m2. También se puede comprobar que para otros valores de V la solución encontrada es a=b=c=V1/3, por tanto podemos concluir que el paralelepípedo rectangular de volumen dado V que tiene una superficie total menor es el cubo. Podemos acudir a la representación gráfica en tres dimensiones de la variable S para V=8 y los intervalos [1 3] en a y b, véase la figura 4.19, donde se observa claramente que el mínimo, de valor 24, se sitúa en el punto (2,2). Tema 4 45 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Figura 4.19 Representación gráfica de la función S(a,b) dada por (4.22) para V=8. Ejercicio 4.29 A continuación planteamos un problema que tiene cierto parecido con el ejemplo 3 del tema 1. Se trata de determinar las dimensiones (largo, ancho y alto) que debe tener una caja de zapatos para que su volumen sea máximo, con la condición de que las tres dimensiones sumen 15. a) Comprobar que el problema se puede resolver numéricamente en Scilab como un problema de búsqueda de mínimo en dos dimensiones utilizando el siguiente conjunto de instrucciones. b) Analizar los resultados y tratar de justificarlo gráficamente o de resolverlo analíticamente en Maxima. function v=cajavolumenmaximo(x) a=x(1);b=x(2); c=15-a-b v=-a*b*c endfunction opt = optimset ( "TolX" , 0.001 ); xo=[0;0] [x,fval,exitflag,output]=fminsearch(cajavolumenmaximo,xo,opt); a=x(1);b=x(2);c=15-a-b; disp([a b c]) Ejercicio 4.30 Aborde con la función optim en Scilab los siguientes problemas de optimización, planteados y resueltos en este apartado. 1) ¿Qué puntos de la gráfica y = 4 – x2 están más cerca del punto (0,2)? 2) ¿Qué dimensiones debe tener la caja construida con la cartulina de 8x5 metros para que su volumen sea máximo? 3) ¿Qué valor debe tener la resistencia R del circuito de la figura 4.18 para que la potencia disipada en ella sea máxima? 4.5.1 Resolución de ecuaciones mediante optimización Anteriormente hemos comprobado que los problemas de optimización suelen llevar a problemas de valores extremos en una o en dos dimensiones. A continuación mostraremos que la resolución de sistemas de ecuaciones lineales o no lineales también se puede abordar como un problema de optimización. Supongamos que queremos determinar los valores de x, y, z que son solución del sistema lineal de ecuaciones (4.1). Bastará con considerar que cada una de las ecuaciones está representada por un residuo, el resto entre la parte dependiente y el término independiente. Tenemos entonces tres residuos r1 = 4 x + 2 y – z – 3 r2 = 3 x + 2 z r3 = 2 x + y – z - 2 Tema 4 46 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 y por tanto la solución del sistema (4.1) serán aquellos valores de x, y, z que minimicen los tres residuos individuales o el valor de una función que los combine adecuadamente. Se podría considerar la suma de los valores absolutos de los residuos, pero lo habitual es utilizar la suma de residuos al cuadrado. Llegamos así al típico problema de mínimos cuadrados, en este caso con tres variables: determinar x, y, z tal que r12 + r22 + r32 sea mínimo. Este planteamiento tiene una gran desventaja respecto a la solución analítica algebraica presentada en el apartado 4.2, pues dependiendo de la terna inicial y la tolerancia exigida puede ocurrir que la búsqueda quede atrapada en algún mínimo local. Con las siguientes instrucciones en Scilab (código 4.30) se puede comprobar que la elección vo=[1 1 0] provoca la solución [0.6666469 -0.3333425 -1.0000348], muy próxima a la solución exacta [2/3 -1/3 -1], mientras que la elección vo=[0 0 0] genera la terna [0.4583540 0.2703072 -0.6965789] que dista mucho de la solución exacta. Con una tolerancia mucho menor ese problema ya no se presenta. function residuo=sle1(v) x=v(1);y=v(2);z=v(3); r1=4*x+2*y-z-3 r2=3*x+2*z r3=2*x+y-z-2 residuo=r1^2+r2^2+r3^2 endfunction opt = optimset ( "TolX" , 0.001 ); vo=[1 -1 0] [v,fval,exitflag,output]=fminsearch(sle1,vo,opt); disp(v) Código 4.30 Resolución del sistema de ecuaciones lineales (4.1) por optimización en Scilab. De forma similar, si queremos resolver el sistema no lineal de ecuaciones (4.10) con a=b, b=1, c=0.5, podemos optar por programar el siguiente conjunto de instrucciones (código 4.31) en Scilab. El esquema es muy parecido al utilizado en el apartado 4.3 con la función fsolve en Scilab y la función mnewton en Maxima, para encontrar las dos soluciones es necesario probar varios valores iniciales. function residuo=snle1(xy, a, b, c) x=xy(1); y=xy(2); r1=a*x+b*y-c r2=x^2+y^2-1 residuo=r1^2+r2^2 endfunction opt = optimset ( "TolX" , 0.001 ); a=1;b=1;c=0.5 // determinación iniciales de las dos soluciones eligiendo distintos valores [solucion1,fval,exitflag,output]=fminsearch(snle1,[0;1],opt); disp(solucion1) [solucion2,fval,exitflag,output]=fminsearch(snle1,[1;0],opt); disp(solucion2) Código 4.31 Resolución del sistema de ecuaciones no lineales (4.10) por optimización en Scilab. Ejercicio 4.31 Pruebe a resolver mediante optimización las siguientes ecuaciones, que ya se abordaron en el apartado 4.3. a) x3 − 8 x2 + 25 x − 26 = 0 Tema 4 b) x3 + ex − 10 = 0 c) x = cos (x) 47 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 4.6 LECTURA COMPLEMENTARIA El estudiante debe complementar este tema con la lectura de: Apartados “Looping and branching” y “Functions” del documento Introduction to Scilab Apartados “Ecuaciones”, “Ecuaciones diferenciales” y “Programación a nivel de Maxima” del documento Primeros pasos en Maxima Sin olvidar la ayuda disponible en Scilab en wxMaxima. También es conveniente que consulte los términos “Algoritmo”, “Sistema de ecuaciones lineales”, “Eliminación de Gauss-Jordan”, “Factorización de matrices”, “Metodo de bisección”, “Método de la regla falsa”, “Método de Newton”, “Método de la secante”, “Ecuación diferencial ordinaria”, “Método de Euler”, “Método de Runge-Kutta”, “Optimización”, “Multiplicadores de Lagrange” en la versión española de la enciclopedia libre Wikipedia donde encontrará referencias y enlaces que le permitirán ampliar sus conocimientos sobre el tema. Tema 4 48 HERRAMIENTAS INFORMÁTICAS PARA MATEMÁTICAS (Apuntes elaborados por el equipo docente para el curso 2014-15) Tema 5 PROCESAMIENTO DE DATOS En los temas anteriores nos hemos limitado a hacer cálculos o a resolver problemas que eran independientes de datos externos, bien porque las funciones o los programas no requerían de datos o porque éstos se le facilitaban a través de variables introducidas por teclado. En este tema abordaremos el acceso a datos numéricos y alfanuméricos contenidos en archivos, la incorporación en las variables del entorno Scilab o Maxima y su posterior procesamiento. Pondremos varios ejemplos elementales de análisis estadístico y centraremos nuestra atención en el ajuste de datos y en la interpolación. 5.1 TIPOS DE ACCESO A LOS DATOS En el apartado 1.2 del tema 1 tuvimos ocasión de programar un cálculo dependiente de un dato externo en Scilab. El cálculo era muy simple, sólo necesitaba el valor numérico de una variable, que se solicitaba a través de la consola de Scilab y se facilitaba por teclado. Por tanto, encadenando secuencialmente, condicionalmente o cíclicamente varias llamadas a la función input podríamos incorporar cualquier tipo de datos que hicieran falta en un problema matemático. Esta no es la práctica más habitual, recuerde que cuando hemos tenido que resolver un mismo problema con distintos datos de entrada hemos utilizado el concepto de función y le hemos facilitado los datos como argumentos de entrada. Así en el apartado 1.3 tuvimos ocasión de programar el mismo cálculo del apartado 1.2 en Maxima, haciendo uso de una función. En el apartado 4.1.2.3 se plantearon varios algoritmos sobre ordenación y determinación de máximos que requerían datos externos. El problema se solucionó imponiendo una estructura de vector o de matriz a los datos. Pero para introducir los datos no desarrollamos ningún programa especial sino que aprovechamos la sintaxis de los propios entornos, Scilab y Maxima, incorporando los correspondientes valores. De forma similar, en el apartado 4.2.1 tuvimos ocasión de programar una función para resolver sistemas de ecuaciones lineales utilizando la representación matricial, donde los datos de entrada eran dos matrices de coeficientes con la correspondiente sintaxis de Scilab o de Maxima. Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Sin embargo, la situación cambia radicalmente si el volumen de datos que va a recibir la función es muy elevado o si los datos han sido generados en otra aplicación o por otros usuarios. En ese caso lo normal es que los datos se faciliten a través de archivos. Tanto Scilab como Maxima disponen de funciones para crear archivos de datos y para leer datos de un archivo. Combinando ambos tipos de funciones se consigue que pueda existir intercambio de datos entre usuarios de los mismos entornos. Pero además, con las primeras se facilita la exportación de datos a otras aplicaciones y con las segundas se facilita la importación de datos de otras aplicaciones. En este tema nos vamos a centrar en el intercambio de información que más puede interesar a un matemático, la información numérica, aunque también podremos algún ejemplo de información alfanumérica. Para más información sobre las posibilidades de ambos entornos se recomienda consultar el apartado “Files : Input/Output functions” del manual de ayuda de Scilab y el apartado “Lectura y escritura” del manual de ayuda de Maxima. 5.1.1 Incorporación de un archivo de datos Como primer ejemplo vamos a suponer que queremos incorporar en Scilab y en Maxima un archivo de datos con las notas numéricas obtenidas por los 15 alumnos de una asignatura. ¿Qué tipo de archivo es preciso incorporar, cuál debe ser su contenido y dónde hay que incorporarlo? Una posible opción es utilizar cualquier editor de texto plano, por ejemplo el bloc de notas de Windows, y escribir una nota en cada línea del archivo. Una segunda opción es escribir las notas una detrás de otra, separándolas por un espacio en blanco. Y una tercera opción es como la segunda, pero utilizando la coma “,” como separador de notas. Si elegimos la misma extensión “txt” para los tres archivos, sus nombres podrían ser notas1.txt, notas2.txt y notas3.txt y sus respectivos contenidos serian los siguientes: 7.3 9 5 1.5 6 0 9 4.3 2.5 7 7 5.5 8 5 6.5 7.3 9 5 1.5 6 0 9 4.3 2.5 7 7 5.5 8 5 6.5 7.3,9,5,1.5,6,0,9,4.3,2.5,7,7,5.5,8,5,6.5 Inicialmente los archivos podrían estar en cualquier directorio del usuario y así se recomienda. Pero si queremos que estén accesibles en Scilab y en Maxima habría que integrarlos en la estructura de estos entornos, ya sea trasladándolos o copiándolos en un directorio concreto, o informar a los entornos que preferimos trabajar en el mismo Tema 5 2 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 directorio donde hemos generado los datos. Dado que las estructuras de directorios creadas por Scilab y por wxMaxima durante la instalación son dependientes del sistema operativo, se advierte que todo lo que comentemos a continuación está referida a una instalación sobre Windows XP. Scilab arranca en un directorio por defecto, que se convierte en ese momento en el directorio de trabajo, donde buscará con prioridad los archivos de datos o de programas cada vez que se le solicite o los necesite. Este directorio de trabajo será el directorio donde Scilab está instalado (C:\Archivos de programa\scilab-5.3.0) o el directorio donde está el archivo de aplicación *.sce o *.sci que hemos utilizado para arrancar el entorno. El directorio se puede consultar y se puede modificar a través de la opción Cambiar directorio actual de la ventana principal de Scilab. Por tanto en Scilab podemos optar por colocar los archivos en ese directorio o navegar por la estructura de directorios hasta colocarnos en el directorio donde hemos generado los datos. En cualquiera de las opciones tenemos una forma cómoda de comprobar si los archivos de datos ya están disponibles en Scilab, bastará teclear la instrucción dir desde la consola, tal como sigue: -->dir notas*.txt ans = notas.txt notas1.txt notas2.txt notas3.txt wxMaxima arranca siempre en el directorio donde estuvimos trabajando la última vez pero no utiliza este directorio como prioritario para la búsqueda de los archivos de datos o de programas cada vez que se le solicite o los necesite. Maxima dispone de la variable del sistema file_search_maxima que le dice al entorno en qué directorios debe buscar. Basta teclear el nombre de esa variable en Maxima para saber qué directorios son. Entre ellos se encuentran un subdirectorio /share/ del directorio donde se ha hecho la instalación (C:\ARCHIV~1\MAXIMA~1.0/share/maxima/5.23.0/share/) y el subdirectorio del usuario que hizo la instalación (C:/Documents and Settings/Usuario/maxima/). Aunque el valor de la variable file_search_maxima se puede cambiar, recomendamos dejarla como está y situar los archivos de datos en el subdirectorio /share/ de la instalación. Como en Scilab, tenemos una forma cómoda de comprobar si los archivos de datos ya están disponibles en Maxima y en qué directorio, bastará hacer uso de la función file_search como sigue. Si el archivo en cuestión no existe en ninguno de los directorios de Maxima, la función file_search devolverá el valor false. Ejercicio 5.1 La instalación de Maxima contiene al menos tres archivos de datos con los nombres pidigits.data, wind.data y biomed.data. Utilice la función file_search para localizarlos y cuando los tenga localizados haga copia de ellos en el directorio donde trabaje habitualmente con Scilab. Utilice la opción Abrir un archivo de la consola de Scilab para comprobar que el contenido de los tres archivos coincide con lo descrito en el apartado “Estadística descriptiva” del documento Primeros pasos en Maxima: 100 primeros dígitos del número , 100 medidas de la velocidad del viento tomadas en cinco estaciones metereologicas, 4 medidas sanguíneas tomadas en dos grupos de pacientes, A y B, de edades diferentes hasta un total de 100 pacientes. Observe que los Tema 5 3 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 dos primeros archivos contienen únicamente datos numéricos mientras que el tercero mezcla datos numéricos y datos alfanuméricos. 5.1.2 Lectura de los datos Una vez que el archivo de datos está localizado podremos leer su contenido, de forma parcial o total. A continuación vamos a comprobar que la estructura del contenido va a condicionar la lectura de los datos y la incorporación de éstos en cualquiera de los entornos. En todos los casos de este apartado optaremos por leer el contenido total de archivo pues con posterioridad, en el correspondiente entorno, siempre tendremos posibilidad de seleccionar un subconjunto de los datos. En Scilab el esquema más utilizado para la incorporación de datos procedentes de un archivo involucra tres acciones: Abrir el archivo Lectura e incorporación de los datos en determinadas variables Cerrar el archivo Para abrir cualquiera de los archivos ya creados utilizamos la función file, a la que pasamos como primer argumento el texto ‘open’ (término inglés correspondiente a abrir), como segundo argumento el nombre completo del archivo y como tercer argumento el texto ‘old’ (término en inglés correspondiente a viejo) para indicar que el archivo ya existe. Esta misma función es la que sirve para cerrar los archivos utilizando como primer argumento el texto ‘close’ (término inglés correspondiente a cerrar) y como segundo argumento el identificador de archivo facilitado por la función file cuando se solicitó abrir el archivo. El cierre de los archivos es importante, aunque prescindible, para que Scilab los libere y vuelvan a estar accesibles a cualquier otra aplicación. Mientras que la apertura y cierre de un archivo es independiente de su contenido, no ocurre lo mismo con la lectura e incorporación de los datos. Dado que los tres archivos que ahora nos interesan contienen únicamente datos numéricos podremos utilizar la función read para leer su contenido. Como primer argumento le pasaremos el identificador del archivo, mientras que el segundo (entero con el número de filas) y tercer argumento (número de columnas) tienen que estar en consonancia con su contenido (conocido de antemano). En el código 5.1 se muestran las instrucciones utilizadas para acceder a los contenidos de los archivos notas1.txt, notas2.txt y notas3.txt a1=file('open','notas1.txt','old') notas1=read(a1,15,1) file('close',a1) a2=file('open','notas2.txt','old') notas2=read(a2,1,15) file('close',a2) a3=file('open','notas3.txt','old') notas3=read(a3,1,15 ) file('close',a3) Código 5.1 Incorporación en Scilab de los datos numéricos de tres archivos en las matrices notas1, notas2 y notas3. Tema 5 4 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Como consecuencia de estas lecturas las notas quedan incorporadas en una matriz notas1 de 15 filas y una columna, o lo que es lo mismo un vector columna de 15 componentes. Pero también en los vectores fila de 15 componentes notas2 y notas3, que son idénticos entre sí. Ejercicio 5.2 a) Cree los tres archivos (notas1.txt, notas2.txt y notas3.txt) en el directorio donde trabaje habitualmente con Scilab. Para ello puede emplear el bloc de notas de Windows pero también puede emplear el editor de textos de la consola de Scilab. b) Ejecute el código 5.1 y compruebe el contenido y tamaño de las tres variables generadas a partir de los datos. Recuerde que para esta última tarea le bastará teclear el nombre de la variable o hacer uso de la función size. En Scilab también existen otras funciones para leer el contenido de archivos de texto. Por ejemplo con mgetl podremos leer todas o parte de las líneas de un archivo de texto y asignarlas a un array de texto. Compruebe la diferencia que existe si en lugar de utilizar el conjunto de instrucciones comentado anteriormente utilizamos este otro: a1=mopen('notas1.txt') notas1=mgetl(a1,15) mclose(a1) a2=mopen('notas2.txt') notas2=mgetl(a2,1) mclose(a2) a3=mopen('notas3.txt') notas3=mgetl(a3,1) mclose(a3) Código 5.2 Incorporación en Scilab del contenido de tres archivos en las cadenas de caracteres notas1, notas2 y notas3. Ahora las tres variables son alfanuméricas (cadenas de caracteres). La primera tendrá 15 componentes (filas), una por cada línea del archivo notas1.txt. Pero la segunda y la tercera tendrán una componente (fila) que reproduce fielmente, con separadores y todo, el contenido de la línea de texto procedente del correspondiente archivo notas2.txt y notas3.txt. Una tercera opción más inmediata, pues engloba las tres acciones (apertura, lectura y cierre) en una, consiste en utilizar la función read_csv. Los ficheros CSV (del inglés comma-separated values) son un tipo de documento para representar datos en forma de tabla, en las que las columnas se separan por comas (o punto y coma cuando la coma es utilizada como el separador decimal). Compruebe este otro conjunto de instrucciones: notas1=read_csv('notas1.txt') notas2=read_csv('notas2.txt') notas3=read_csv('notas3.txt') Código 5.3 Incorporación en Scilab del contenido de tres archivos en las cadenas de caracteres notas1, notas2 y notas3. Tema 5 5 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Podrá observar que las tres variables vuelven a ser alfanuméricas (cadenas de caracteres). La primera tendrá 15 componentes (filas), la segunda una componente (fila) y la tercera 15 componentes (columnas). Para leer el contenido de esos archivos en Maxima podemos hacer uso de la función read_list. Esta función engloba las tres acciones (apertura, lectura y cierre) sobre el archivo y asigna el contenido a una variable en forma de lista. El estudiante puede copiar los tres archivos creados anteriormente en el subdirectorio /share/ de Maxima y comprobar que las siguientes tres instrucciones les permiten acceder a las notas. Observe que el resultado es el mismo en los tres casos, con independencia de la disposición original en el archivo de datos, las 15 notas quedan dispuestas en una lista de 15 valores. Pero observe también que para las 15 notas lleguen perfectamente a la variable notas3 ha sido necesario especificarle a la función read_list que los datos del archivo notas3.txt están separados por una coma (con el término inglés comma). Código 5.4 Incorporación en Maxima del contenido de tres archivos en las listas notas1, notas2 y notas3. La misma función read_list nos vale para acceder al contenido de los archivos de Maxima pidigits.data, wind.data y biomed.data (código 5.5), sin embargo si estos datos van a sufrir un análisis posterior quizás sea más conveniente incorporarlos en el entorno en forma de matriz haciendo uso de la función read_matrix. Observe las diferencias que existen entre cada par de variables, las que empiezan por l son listas y las que empiezan por m son matrices. Mientras que en las listas se ha perdido la organización de los datos originales, las matrices conservan la estructura original. Este aspecto no tiene importancia en el caso de los 100 primeros dígitos de , como tampoco lo tenía en el ejemplo anterior de las notas, pero sí la tiene en los otros dos archivos de datos. ldigitospi:read_list(file_search("pidigits.data")); mdigitospi:read_matrix(file_search("pidigits.data")); ldatosviento:read_list(file_search("wind.data")); mdatosviento:read_matrix(file_search("wind.data")); ldatosmedicos:read_list(file_search("biomed.data")); mdatosmedicos:read_matrix(file_search("biomed.data")); Código 5.5 Incorporación en Maxima del contenido de tres archivos en listas y en matrices. Ejercicio 5.3 Tras el conocimiento adquirido sobre los archivos pidigits.data, wind.data y biomed.data, proponga un conjunto de instrucciones en Scilab que le permitan incorporar los correspondientes datos en las variables: digitospi, datosviento y datosmedicos. Comente además la naturaleza y tamaño de cada una de las variables y compare con las listas y matrices generadas previamente en Maxima . Tema 5 6 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 5.2 EJEMPLOS DE ANÁLISIS DE DATOS En el apartado anterior hemos optado por leer el contenido total de archivo, incorporándolo como lista o como matriz en el correspondiente entorno, pues mediante manipulación de estas variables podremos realizar cualquier selección y cualquier análisis de los datos. 5.2.1 Datos numéricos Si se trata de datos numéricos un primer análisis podría consistir simplemente en la inspección gráfica de éstos. Por ejemplo tras leer el contenido del archivo wind.data en Maxima e incorporarlo en la matriz mdatosviento podremos generar el grafico de la figura 5.1 sin más que encadenar las siguientes instrucciones: mdatosviento : read_matrix (file_search ("wind.data"))$ datosestacion1:submatrix(mdatosviento,2,3,4,5)$ datosestacion2:submatrix(mdatosviento,1,3,4,5)$ datosestacion3:submatrix(mdatosviento,1,2,4,5)$ datosestacion4:submatrix(mdatosviento,1,2,3,5)$ datosestacion5:submatrix(mdatosviento,1,2,3,4)$ n:length(mdatosviento)$ for i:1 thru n do tiempo[i]:i$ plot2d([[discrete,listarray(tiempo),list_matrix_entries(datosestacion1)], [discrete,listarray(tiempo),list_matrix_entries(datosestacion2)], [discrete,listarray(tiempo),list_matrix_entries(datosestacion3)], [discrete,listarray(tiempo),list_matrix_entries(datosestacion4)], [discrete,listarray(tiempo),list_matrix_entries(datosestacion5)]], [xlabel,"días"],[ylabel,"velocidad del viento (m/s)"], [legend,"estación 1","estación 2","estación 3","estación 4","estación 5"]); Código 5.6 Incorporación y representación de datos en Maxima. Figura 5.1 Velocidades del viento registradas en cinco estaciones metereológicas. Tema 5 7 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Observe como hemos creado una variable (vector columna) para cada una de las estaciones utilizando la función submatrix. También hemos creado el vector de tiempos correspondiente a los 100 días y hemos generado el gráfico compuesto con los datos procedentes de las cinco estaciones. Como la opción discrete de la función plot2d únicamente acepta variables de tipo lista, hemos tenido que convertir los datos de cada estación a una lista de valores mediante la función list_matrix_entries. Una gráfica similar a la de la figura 5.1 la podemos generar con el siguiente conjunto de instrucciones (código 5.7) en Scilab. Donde se observa que no ha sido necesario separar en vectores cada una de las columnas de la matriz datosviento. a2=file('open','wind.data','old') datosviento=read(a2,100,5); file('close',a2) [n,m]=size(datosviento) t=1:1:n; plot(t,datosviento) xlabel('días') ylabel('velocidad del viento (m/s)') legend('estación 1','estación 2','estación 3','estación 4','estación 5') Código 5.7 Incorporación y representación de datos en Scilab. El análisis de datos más habitual es el de tipo estadístico. Para ello podemos programar nuestras propias funciones, pero tanto Scilab como Maxima disponen de funciones para este fin. Las de Scilab las encontrará en el epígrafe “Statistics” y las de Maxima en el paquete descriptive. Por ejemplo, supongamos que queremos hacer un análisis estadístico de cada una de las estaciones meteorológicas. Nos interesa conocer: el rango (valor máximo - valor mínimo) en el que ha variado la velocidad del viento en las cinco estaciones, la estación que ha registrado el máximo valor y el día en que se registró, la estación que ha registrado el mínimo valor y el día en que se registró. La velocidad media del viento en cada estación para el total de días registrados y la desviación estándar (o desviación típica) muestral. Lo podemos conseguir encadenando a las anteriores el siguiente conjunto de instrucciones (código 5.8) en Scilab, en las que hacemos uso de las funciones strange, max, min, mean y st_deviation: rangosporestacion=strange(datosviento,'r') [maximoabsoluto,ind_max]=max(datosviento) diamaximoabsoluto=ind_max(1) estacionmaximoabsoluto=ind_max(2) [minimoabsoluto,ind_min]=min(datosviento) diaminimoabsoluto=ind_min(1) estacionminimoabsoluto=ind_min(2) mediasporestacion=mean(datosviento,'r') sdporestacion=st_deviation(datosviento,'r') Código 5.8 Encadenado con el código 5.7 permite un análisis estadístico de datos en Scilab. Que arroja los siguientes resultados: rangosporestacion = [19.67 20.96 17.37 24.38 22.46] maximoabsoluto=29.63, diamaximoabsoluto=50, estacionmaximoabsoluto=4 minimoabsoluto=0.5, diaminimoabsoluto=14, estacionminimoabsoluto=2 Tema 5 8 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 mediasporestacion = [9.9485 sdporestacion= [4.1708351 10.1607 3.8909032 10.8685 3.9537386 15.7166 14.8441] 5.7010109 4.9668676] Algo similar podemos conseguir con el siguiente conjunto de instrucciones (código 5.9) en Maxima, en las que, tras cargar el paquete descriptive, hacemos uso de las funciones range, smax, smin, mean y std: Código 5.9 Encadenado con el código 5.6 permite un análisis estadístico de datos en Maxima. Comparando los dos conjuntos de instrucciones se observa que las funciones max y min de Scilab tienen más funcionalidad que las funciones smax y smin de Maxima pues no solo permiten determinar el correspondiente máximo o mínimo sino también la posición (fila y columna) que ocupa en la matriz. Por otro lado, comparando los resultados, se observa que las desviaciones estándar determinadas en Scilab no coinciden con las determinadas en Maxima, el motivo es que la función std normaliza a N (el número de muestras) mientras que la función st_deviation normaliza a N-1. No obstante en Maxima también disponemos de la función std1 que tiene la misma funcionalidad que la st_deviation de Scilab. Por tanto si en lugar de utilizar std hubiéramos utilizado std1, los resultados habrían coincidido. También es posible que nos interese centrar la atención en una de las estaciones; por ejemplo trazando los datos registrados junto con la media y un histograma. La figura 5.2 que combina estos dos tipos de gráficas se ha obtenido con el código 5.10 en Scilab. En el histograma hemos utilizado diez clases repartidas entre el mínimo y el máximo de los datos registrados. datosestacion1=datosviento(:,1) mediaestacion1=mean(datosestacion1) subplot(2,1,1) plot(t,datosestacion1,[1 n],[mediaestacion1 mediaestacion1],'r-') xlabel('días') ylabel('velocidad del viento (m/s)') legend('estación 1','media estación 1') subplot(2,1,2) histplot(10,datosestacion1) title('Histograma de las medias de viento en la estación 1') Código 5.10 Encadenado con el código 5.7 permite generar la figura 5.2 en Scilab. Tema 5 9 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Figura 5.2 Registro de las medias de viento e histograma en la estación 1. Ejercicio 5.4 Trazar dos gráficos similares a los de la figura 5.2 en Maxima. Ejercicio 5.5 En el curso virtual encontrará el archivo notas.txt, en formato de texto plano, con las calificaciones numéricas obtenidas por 100 alumnos. Acceda al contenido del archivo con Scilab o Maxima y: a) Determine la nota media y la desviación estándar. b) Determine el número de suspensos (nota inferior a 5), de aprobados (nota igual a 5 o comprendida entre 5 y 7), de notables (nota igual a 7 o comprendida entre 7 y 9), de sobresalientes (nota igual a 9 o comprendida entre 9 y 10) y de matrículas de honor (nota igual a 10). c) Compruebe que el histograma de 20 clases con los datos del archivo y el diagrama de barras trazado con los datos determinados en el apartado (b) tendrán los aspectos mostrados en la figura 5.3. Figura 5.3 Histograma y diagrama de barras a partir del archivo notas.txt. Tema 5 10 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Tanto el archivo wind.data como el archivo notas.txt son ejemplos de muestras que varían en un rango continuo, la primera es una muestra multivariante (100 datos por cada estación metereológica) y la segunda es una muestra univariante (100 datos), pero tanto Scilab como Maxima también nos facilitan el análisis de muestras discretas univariantes y multivariantes. A continuación vamos a simular un número concreto de tiradas con un dado regular de seis caras posibles. El conjunto de las tiradas conformará una muestra discreta, con seis valores posibles (las puntuaciones 1, 2, 3, 4, 5 y 6), y se prestará a cualquier análisis de tipo estadístico. El análisis más simple puede consistir en determinar las frecuencias con las que se repiten cada una de las puntuaciones, el resultado se puede mostrar de forma numérica en una matriz o de forma gráfica mediante un histograma o cualquier otro tipo gráfico estadístico, por ejemplo un gráfico circular. Las siguientes instrucciones en Maxima (código 5.11) permiten poner en práctica este ejemplo. Inicialmente hemos cargado el paquete distrib para poder generar un conjunto de números aleatorios con distribución uniforme entre 0 y 6. Lo hemos convertido a una muestra discreta con la función ceiling que asocia a cada valor numérico el menor entero mayor o igual que él. Y hemos solicitado el recuento de las tiradas, así como un diagrama de barras y un diagrama circular. load(distrib)$ load(descriptive)$ vna:random_continuous_uniform(0,6,10)$ tiradas:ceiling(vna)$ resultadotiradas:discrete_freq(tiradas); barsplot(tiradas)$ piechart(tiradas)$ Código 5.11 Simulación de las tiradas con un dado en Maxima. El tercer argumento en la función random_continuous_uniform representa el tamaño de la muestra, como primer ejemplo hemos elegido un tamaño pequeño al suponer que se realizan 10 tiradas. Cada vez que ejecutemos las sentencias obtendremos un resultado distinto, como debería ser, por ejemplo el siguiente valor [[1,2,4,5,6],[2,1,2,2,3]] en la variable resultadotiradas nos indica que en el total de 10 tiradas el número 1 ha salido dos veces, el número 2 una vez, el número 3 ninguna vez, el número 4 dos veces, el número 5 dos veces y el número 6 tres veces. El diagrama de barras y el diagrama circular correspondientes a este caso se muestran en la figura 5.4. Figura 5.4 Diagrama de barras y gráfico circular en una simulación de diez tiradas con un dado regular. Tema 5 11 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Ejercicio 5.6 a) Programe en Maxima el código 5.11 y repita varias simulaciones para comprobar que los resultados son diferentes en cada caso. Si lo desea también puede intentarlo en Scilab. b) Repita las simulaciones eligiendo un mayor número de tiradas, por ejemplo 100, 1000, 10000. Podrá comprobar que cuanto mayor sea el número de tiradas más cerca estará el histograma y el gráfico circular de lo que correspondería a una distribución uniforme; la misma frecuencia, la misma porción de área, para las seis caras del dado. 5.2.2 Datos alfanuméricos Todos los archivos considerados en el subapartado anterior contenían exclusivamente valores numéricos. A continuación vamos a trabajar con archivos con contenido alfanumérico, en los que el tratamiento parcial de la información tendrá aún mayor importancia. Algunos archivos de contenido alfanumérico lo son por el simple hecho de que a un conjunto de datos numéricos se le ha añadido alguna información textual. Por ejemplo esto habría ocurrido con el archivo “wind.data” si en las primeras líneas se incluye un texto explicativo sobre el contenido del archivo. Pero en general, un archivo de contenido alfanumérico es aquel que contiene algún dato de naturaleza alfanumérica, por ejemplo el DNI de una persona podría tener la consideración de dato numérico (número natural de ocho dígitos) pero dejaría de tenerla si va acompañado de la letra. En el curso virtual encontrará el archivo listadonotas.csv que reproduce en formato CSV (con punto y coma como separador) el contenido de la tabla 5.1. La tabla recoge las mismas notas numéricas de los 15 alumnos de una asignatura consideradas en el apartado 5.1, concretamente las notas aparecen en la quinta columna y tienen asociado el texto “nota numérica” en la cabecera. Pero en la tabla y por tanto en el archivo se ha añadido cierta información (DNI, nombre, primer apellido y segundo apellido) sobre los alumnos, que ocupan respectivamente las columnas 1 a 4, y se ha añadido campo textual de calificación en la sexta columna. DNI 30603435A 10603435C 20603435B 00603435D 40603435E 70603435F 80603435G 90603435H 21603435I 22603435J 23603435K 24603435L 25603435M 25603435N 25603435O Tema 5 nombre apellido1 apellido2 nota numérica Fernando Morilla García 7.3 Miguel Ángel Rubio González 9 Juan López Morilla 5 Ignacio García Rubio 1.5 Luís Pérez García 6 Andrés Blanco García 0 Jesús Nieto García 9 Alberto González Rubio 4.3 Pedro Ruiz López 2.5 Ángel Sánchez Pérez 7 Antonio Rubio Parejo 7 Carlos Fernández Pérez 5.5 Manuel Gómez Pérez 8 Francisco Galindo González 5 Pablo Rubio García 6.5 Tabla 5.1 Datos contenidos en el archivo listadonotas.csv. calificación Notable Sobresaliente Aprobado Suspenso Aprobado Suspenso Sobresaliente Suspenso Suspenso Notable Notable Aprobado Notable Aprobado Aprobado 12 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Si conseguimos acceder al archivo listadonotas.csv e incorporamos todos los datos en una estructura de tipo array, nos encontraremos con un array de 16 filas (1 cabecera + 15 una por cada uno de los alumnos) y 6 columnas (una por cada uno de los campos descritos en la cabecera) cuyos elementos son cadenas de caracteres. Pero una ojeada a la tabla 5.1 nos permite comprobar que el listado de las calificaciones no tiene ningún tipo de orden. En esta situación podemos plantearnos el generar otros dos listados; uno por orden decreciente en la nota y otro por orden alfabético. Lo podemos conseguir con el siguiente conjunto de instrucciones en Scilab: listadonotas=read_csv('listadonotas.csv',';') [m,n]=size(listadonotas) notas=listadonotas(2:m,5) [notasordenadas,indices]=gsort(notas) listadopornotas=listadonotas(1+indices,:) apellidos1=listadonotas(2:m,3) [apellidos1ordenados,indices]=gsort(apellidos1,'lr','i') listadoporapellido1=listadonotas(1+indices,:) Código 5.12 Consulta de un listado de notas en Scilab y reordenación por notas y por orden alfabético. Observe que el acceso a los datos ha sido posible con la función read_csv, indicando que los datos están separados por punto y coma. Hemos extraído información de las notas numéricas e información del primer apellido, hemos hecho una ordenación de la información con la función gsort en ambos casos, y hemos transmitido esa reordenación al conjunto del array para generar los nuevos listados. En Maxima hay grandes dificultades para acceder al archivo con el listado de notas por la presencia de acentos y del separador “;”. 5.3 AJUSTE DE DATOS E INTERPOLACIÓN Cuando tenemos una serie de puntos medidos en un experimento lo normal es que estos puntos tengan errores de medida. Podemos entonces tratar de encontrar la función de una forma dada que más se aproxime a ellos. Este problema da origen al ajuste o aproximación de datos. Pero también puede ocurrir que tengamos, a través de una tabla, un conocimiento perfecto sobre determinados valores de una variable y que queramos conocer el valor de la variable en otros puntos no considerados en la tabla. Si el punto en cuestión está comprendido en el rango de la tabla estaremos hablando de interpolación y si el punto está fuera del rango estaremos hablando de extrapolación. En ambos casos el problema se resuelve determinando una función que pase por los puntos más próximos al punto en cuestión y particularizándola para ese punto. Por tanto, en estos casos no nos interesa tanto el determinar una función sino el valor de la función en cada uno de los puntos donde se quiere interpolar o extrapolar. 5.3.1 Ajuste de datos por mínimos cuadrados La función más utilizada en los ajustes de datos es el polinomio y el criterio de ajuste más utilizado es el de los mínimos cuadrados, que consiste en minimizar la suma de los errores al cuadrado entre los valores de la función y los puntos medidos. En Scilab no disponemos de una función específica para realizar el ajuste de datos pero en Maxima Tema 5 13 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 disponemos de varias funciones en el paquete lsquare. Antes de utilizarlas vamos a recordar el fundamento del ajuste por mínimos cuadrados e intentaremos dar soluciones particulares en Scilab. Supongamos que se han medido m parejas de valores (xi,yi) y que queremos determinar los n+1 parámetros de un polinomio de orden n que mejor aproxima los datos. Como la función elegida viene descrita por f(x) = an xn + an-1 xn-1 + …+ a1 x + ao (5.1) El error cometido por la función en un punto vale ei = yi – f(xi), luego la suma de todos los errores al cuadrado viene dada por: y - a m S= i n x in + a n-1 x in-1 + ... + a1 x i + a o i=1 2 (5.2) La suma así calculada será mínima si sus derivadas parciales respecto a cada uno de los n+1 parámetros es nula. Concretamente S = a j 2 y - a m i n x in + a n-1 x in-1 + ... + a1 x i + a o i=1 x j i (5.3) x ij (5.4) será nula si m an x i=1 m n+j i + a n-1 x m n-1+j i + ... + a1 i=1 x i=1 m 1+j i + a o x ij = i=1 m y i i=1 Este resultado es extensible a todos los parámetros de la función, de manera que el ajuste de datos por mínimos cuadrados mediante una función polinómica se puede expresar de forma matricial como un sistema de n+1 ecuaciones lineales con n+1 incógnitas, cuya expresión general A w = b y cuya resolución fue objeto de estudio en el apartado 4.2 del Tema 4. En este caso concreto A será una matriz (n+1)x(n+1), b será un vector de n+1 componentes, y ambos son conocidos puesto que sólo dependen de los datos medidos. Mientras que la incógnita w es un vector de n+1 componentes los n+1 parámetros de la función polinómica. La componente A(j,k), es decir la componente que ocupa la fila j y columna k de la matriz P, viene dada por la expresión m A(j,k) = x n+1-k+j i (5.5) i=1 Y la componente j del vector b será: m b(j) = y i x ij (5.6) i=1 Tema 5 14 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 A continuación se propone una función programada en Scilab (código 5.13) capaz resolver el problema del ajuste de datos por mínimos cuadrados mediante una función polinómica. La función tiene por nombre ajustadatos, recibe una matriz mdatos con 2 columnas y tantas filas como muestras se hayan tomado de los datos, la primera columna contiene los valores de x y la segunda columna contiene los valores de y. Y también recibe, como segundo parámetro, el orden n del polinomio. Sus parámetros de salida son los coeficientes del polinomio en un vector de n+1 componentes. function polinomio=ajustadatos(mdatos, n) x=mdatos(:,1) y=mdatos(:,2) for j=1:1:n+1 b(j)=sum(y.*x^(j-1)) for k=1:1:n+1 A(j,k)=sum(x^(n+1-k+j-1)) end end polinomio=inv(A)*b endfunction Código 5.13 Función para ajuste polinómico de datos en Scilab por mínimos cuadrados. Como primer ejemplo de ajuste por mínimos cuadrados vamos a suponer que nos han pasado la tabla 5.2 con seis datos experimentales. x y 1 0 2 1 3 3 4 2 5 4 6 5 Tabla 5.2 Datos experimentales. Al tratarse de un conjunto pequeño de datos ni siquiera merece la pena pasarlos a un archivo, sino que componemos la matriz mdatos con la siguiente instrucción en Scilab mdatos=[1 0;2 1; 3 3;4 2; 5 4; 6 5] A continuación necesitamos elegir el orden del polinomio. Aunque el orden se podría elegir a ciegas, es más recomendable elegirlo tras una inspección gráfica de los datos, véase la gráfica superior de la figura 5.5, o en base al conocimiento que se tenga de ellos. Si elegimos n=1 estamos provocando una regresión lineal de los datos. La recta que mejor aproxima estos datos por mínimos cuadrados resulta ser: y = 0.9428571 x - 0.8 (5.7) A este resultado se ha llegado tras programar la función ajustadatos en Scilab y encadenar las siguientes instrucciones (código 5.14). En lugar de mostrar los coeficientes del polinomio hemos optado por representar los datos experimentales, los datos generados por la recta de regresión resultante en el mismo rango de la variable x, y los errores cometidos con esta regresión lineal. Las dos gráficas resultantes están recogidas en la figura 5.5. Entre los resultados hemos incorporado el cálculo del error cuadrático medio (índice MSE), obtenidos como suma de los errores al cuadrado, la expresión (5.2), dividida por el número de muestras. Cuanto mejor es el ajuste menor es el índice MSE. Tema 5 15 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 mdatos=[1 0;2 1; 3 3;4 2; 5 4; 6 5] m=6;n=1 polinomio1=ajustadatos(mdatos,n) x=mdatos(:,1) y=mdatos(:,2) ye=polinomio1(1)*x+polinomio1(2); xt=min(x):.05:max(x); yt=polinomio1(1)*xt+polinomio1(2); subplot(2,1,1) plot(x,y,'o',xt,yt,'r') xlabel('x') ylabel('y') title('Datos experimentales y regresión lineal por mínimos cuadrados') subplot(2,1,2) plot(x,ye-y,x,ye-y,'o') xlabel('x') title('Errores cometidos con la regresión lineal') mse1=sum((ye-y).^2)/m Código 5.14 Encadenado con el código 5.13 permite hacer una regresión lineal en Scilab de los datos de la tabla 5.2. Si no estamos contentos con el ajuste por regresión lineal podemos intentarlo con polinomios de mayor orden, pero no hay garantías de que el ajuste mejore al aumentar el orden del polinomio. A continuación se propone un ejercicio donde podrá comprobarlo. Ejercicio 5.7 a) Programe en Scilab la función ajustadatos y el código 5.14 para comprobar que la regresión lineal de los datos de la tabla 5.2 nos lleva a la función (5.7). b) Repita el ajuste por mínimos cuadrados con polinomios de orden 2 y 3. c) Compruebe que los correspondientes errores cuadráticos medios son respectivamente: 0.3238095, 0.3431595, 0.2645503. Por tanto el mejor ajuste (el menor error cuadrático medio) se obtiene con el polinomio de orden 3, sin embargo el polinomio de orden 2 da peor aproximación que la regresión lineal. Figura 5.5 Representación gráfica de los datos experimentales de la tabla 5.2, de la recta de regresión y de los errores cometidos en la aproximación. Tema 5 16 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Las siguientes instrucciones en Maxima (código 5.15) nos permitirán comprobar los resultados del ejercicio 5.7. Observe cómo, tras incorporar los datos experimentales en una matriz, hemos hecho uso de la función lsquares_estimates del paquete lsquares para probar los tres ajustes polinómicos comentados anteriormente. El valor a2=0 en el segundo ajuste nos confirma que la regresión lineal es mejor que el polinomio de segundo orden para estos datos. Además con la función lsquares_residual_mse hemos podido valorar la bondad relativa de los ajustes lineal y cúbico. En el apartado “Ajuste por mínimos cuadrados” del documento Primeros pasos en Maxima encontrará otro ejemplo de ajuste de datos por mínimos cuadrados y resultados gráficos del ajuste. Código 5.15 Regresión lineal en Maxima de los datos de la tabla 5.2. Ejercicio 5.8 A continuación recogemos literalmente el enunciado de un problema de la asignatura Estadística del grado de Matemáticas de la UNED, curso 2010/11. Trate de resolverlo en Scilab y/o Maxima. Ejercicio 5.9 En el archivo datos1.txt del curso virtual dispone del conjunto de 21 datos experimentales representados en la figura 5.6. Acceda a estos datos mediante Scilab o Maxima y determine el polinomio de tercer orden que mejor los ajusta. Acompañe el resultado numérico con una representación similar a la de la figura 5.5. Tema 5 17 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Figura 5.6 Datos experimentales contenidos en el archivo datos1.txt. Hasta ahora hemos hecho un uso limitado de la función lsquares_estimates de Maxima, pues esta función admite usos más generales que el ajuste polinómico; permite elegir cualquier función no lineal para ajustar los datos y sin limitación en el número de parámetros. A continuación se plantea un ajuste por mínimos cuadrados donde los datos, dependientes de la variable temporal t, no siguen un patrón polinómico sino un crecimiento exponencial del tipo a (1 - e-kt). Los datos experimentales, recogidos en la tabla 5.3, corresponden a las medidas realizadas sobre el diámetro del tronco de un árbol a lo largo de 30 años. t (años) d (cm) 0 0 5 7 10 14 15 21 20 26 25 30 30 31.5 Tabla 5.3 Datos experimentales. Se pretende utilizar el ajuste por mínimos para estimar los parámetros a y k de la función tal que ésta describa lo más fielmente posible el crecimiento observado del tronco del árbol y permita predecir la evolución de su diámetro en los próximos años. Para ello hemos utilizado el siguiente conjunto de instrucciones en Maxima (código 5.16). Observe el resultado en la gráfica 5.7, donde se han utilizado los parámetros estimados a=50.07753262359672 y k=0.035001279506836. La gráfica nos permite reproducir bastante el crecimiento observado en el tronco del árbol y también nos permite predecir que el tronco alcanzará su máximo diámetro en aproximadamente 150 años. Este tipo de crecimiento exponencial es asintótico, pronostica que el diámetro del tronco nunca superará los 50 cm, el valor estimado para el parámetro a. mdatos:matrix([0,0],[5,7],[10,14],[15,21],[20,26],[25,30],[30,31.5])$ load("lsquares")$ parametros:lsquares_estimates(mdatos,[t,d],d=a*(1-exp(-k*t)),[a,k]),numer; a:rhs(first(parametros)[1]);k:rhs(first(parametros)[2]); tm:list_matrix_entries(submatrix(mdatos,2)); dm:list_matrix_entries(submatrix(mdatos,1)); plot2d([[discrete,tm,dm],a*(1-exp(-k*t))],[t,0,150],[style,points,lines])$ Código 5.16 Regresión no lineal en Maxima de los datos de la tabla 5.3. Tema 5 18 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Figura 5.7 Representación gráfica de los datos experimentales de la tabla 5.3 y de la función capaz de describir esa evolución como un crecimiento exponencial asintótico. Ejercicio 5.10 En el archivo datos2.txt del curso virtual dispone de otro conjunto de 21 datos experimentales. Acceda a estos datos mediante Maxima y determine los parámetros a, b y c de la función (5.8) que mejor ajustan dichos datos. Acompañe el resultado numérico con una representación similar a la de la figura 5.7 para el rango [-2.5 2.5]. a y ( x) (5.8) (b c x 2 ) 5.3.2 Interpolación En la presentación del apartado 5.3 remarcamos la diferencia que existe entre el ajuste de datos y la interpolación. Vamos a utilizar los mismos datos de la tabla 5.2 para hacer algún ejemplo simple de interpolación y volver a recordar las diferencias. Supongamos que queremos determinar la ordenada que correspondería a la abscisa 2.5. El procedimiento más simple, utilizando interpolación lineal, nos lleva a centrar la atención en los valores de la primera fila de la tabla 5.2 más próximos a 2.5, que son el 2 y el 3, y a pronosticar que la ordenada que correspondería al valor 2.5 se puede determinar por la ecuación de la recta que pasa por los dos puntos (2,1) y (3,3) de la tabla 5.2, de la siguiente forma: y(2.5) = y(2) + (2.5 - 2) y(3) - y(2) 3-1 = 1 + 0.5 =2 3-2 1 Sin embargo, sin en lugar de hacer interpolación, decidimos primero ajustar los datos por regresión lineal llegaríamos a la ecuación de la recta (5.7), que pronosticaría un valor de aproximadamente 1.557 para la abscisa 2.5. En la figura 5.8 mostramos gráficamente lo que se está ocurriendo cuando solicitamos interpolación lineal, la Tema 5 19 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 función que pasa por todos los puntos de la tabla es la que correspondería al conjunto de tramos lineales y el asterisco en rojo marca el punto correspondiente a la abscisa 2.5. Figura 5.8 Representación gráfica de los datos experimentales de la tabla 5.2, el conjunto de tramos que resultarían de una interpolación lineal y el punto obtenido de esa interpolación para x=2.5. En Scilab disponemos de la función interpln para hacer interpolaciones lineales de una variable, pero además podemos hacer uso de interp1 que, además de la interpolación lineal, contempla el uso de tramos curvos (“splines” en inglés) o tramos horizontales (tramos en escalera). Tanto el uso de tramos lineales entre puntos como el uso de tramos horizontales tiene la desventaja que nos lleva a funciones con discontinuidades, en el valor de la función (si los tramos están dispuestos en escalera) y en la derivada (si los tramos son rectos). Sin embargo la interpolación mediante tramos curvos garantiza que habrá transiciones suaves en todos los puntos. En la figura 5.9 mostramos una gráfica comparativa de los resultados que se obtienen por interpolación (en el rango [1 6] definido por la tabla 5.2) y por extrapolación en los rangos [0.5 1] y [6 6.5] utilizando las distintas opciones de la función interp1. En esta misma gráfica podemos observar que el valor interpolado para la abscisa 2.5 es muy diferente en los tres casos. Pero lo mismo se puede decir de otros puntos, y sobre todo de los valores extrapolados. El conjunto de instrucciones (código 5.17) que ha permitido generar la figura 5.8 en Scilab es el siguiente: mdatos=[1 0;2 1; 3 3;4 2; 5 4; 6 5] x=mdatos(:,1) y=mdatos(:,2) ypl=interpln(mdatos',2.5); plot(x,y,'o',x,y,2.5,ypl,'*') xlabel('x') ylabel('y') title('Datos y trazos por interpolación lineal') Código 5.17 Permite generar la figura 5.8 en Scilab. Tema 5 20 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Donde la función interpln se ha utilizado para interpolar el valor correspondiente a la abscisa 2.5. Mientras que el conjunto de instrucciones (código 5.18) que ha permitido generar la figura 5.9 en Scilab es el siguiente: mdatos=[1 0;2 1; 3 3;4 2; 5 4; 6 5] x=mdatos(:,1) y=mdatos(:,2) xp=min(x)-0.5:.05:max(x)+0.5; ypl=interp1(x,y,xp,'linear','extrap'); ypc=interp1(x,y,xp,'spline','extrap'); ypn=interp1(x,y,xp,'nearest','extrap'); plot(x,y,'o',xp,ypl,'r',xp,ypc,'k',xp,ypn,'g') xlabel('x') ylabel('y') title('Datos y trazos por interpolación y extrapolación lineal, cúbica y en escalera') Código 5.18 Permite generar la figura 5.9 en Scilab. Figura 5.9 Representación gráfica de los datos experimentales de la tabla 5.2, y los trazos que resultan de interpolar y extrapolar en Scilab: lineal (en rojo), por tramos curvos (en negro) y en escalera (en verde). Donde la función interp1 se ha utilizado para generar las tres interpolaciones (linear, spline, nearest), pero también para generar las extrapolaciones pasándole a la función un conjunto de abscisas que contienen valores dentro y fuera del rango considerado en la tabla 5.2. Para hacer algo similar en Maxima podemos acudir al paquete interpol, que contempla la interpolación lineal, la interpolación por tramos curvos cúbicos, y la interpolación polinómica de Lagrange. La diferencia fundamental es que las funciones de este paquete generan expresiones matemáticas, mientras que las funciones de Scilab generan un conjunto de valores. Observe el siguiente conjunto de instrucciones; después de asignar los datos a una matriz de dos columnas, cargamos el paquete interpol y solicitamos los tres tipos de interpolación. A continuación definimos cada una de las funciones previa evaluación (dos comillas simples) de la expresión devuelta por la interpolación correspondiente. Mientras que para generar la gráfica de la figura 5.10 hemos utilizado Tema 5 21 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 esas funciones tanto para interpolar como para extrapolar pues hemos seleccionado un rango para la variable independiente x mayor que el rango definido por la tabla5.2. mdatos:matrix([1,0],[2,1],[3,3],[4,2],[5,4],[6,5])$ load(interpol)$ y:linearinterpol(mdatos)$ ftl(x):=''y; y:cspline(mdatos)$ fs(x):=''y; y:lagrange(mdatos)$ fpl(x):=''y; xm:list_matrix_entries(submatrix(mdatos,2)); ym:list_matrix_entries(submatrix(mdatos,1)); plot2d([[discrete,xm,ym],ftl(x),fs(x),fpl(x)],[x,0.5,6.5], [style,points,lines,lines,lines], [xlabel,"x"],[ylabel,"y"],[legend,"Datos experimentales", "Interpolación y extrapolación lineal", "Interpolación y extrapolación por splines", "Interpolación y extrapolación por Lagrange"]); Código 5.19 Permite generar la figura 5.10 en Maxima. La expresión resultante de la interpolación lineal consta de cinco (número de muestras menos uno) tramos rectos en las que cada trozo queda delimitado por la función charfun2(x,a,b), que devuelve 1 si el primer argumento pertenece al intervalo [a,b) y 0 en caso contrario. Concretamente al ejecutar las instrucciones obtendremos el siguiente resultado: Que corresponde a los tramos rectos definidos por: x-1 2x–3 -x+6 2x–6 x–1 para para para para para x[- 2), obtenida como la recta que pasa por los puntos (1,0) y (2,1) x[2 3), obtenida como la recta que pasa por los puntos (2,1) y (3,3) x[3 4), obtenida como la recta que pasa por los puntos (3,3) y (4,2) x[4 5), obtenida como la recta que pasa por los puntos (4,2) y (5,4) x[5 ), obtenida como la recta que pasa por los puntos (5,4) y (6,5) La función por tramos curvos habrá quedado definida por cinco polinomios tercer orden, uno por cada uno de los que delimitan las muestras de la tabla 5.2. Tal como muestra la siguiente expresión: Tema 5 22 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 Y por último, la función polinómica es una función continua definida por un sumatorio de cinco polinomios de quinto orden, pues el orden del polinomio es igual al número de muestras menos uno. Tal como muestra la siguiente expresión: Figura 5.10 Representación gráfica de los datos experimentales de la tabla 5.2, y los trazos que resultan de interpolar y extrapolar en Maxima: lineal (en rojo), por tramos curvos (en verde) y por polinomio de Lagrange (en morado). Si comparamos los resultados de la figura 5.9 y 5.10 podemos observar que: al utilizar interpolación lineal se obtienen los mismos resultados en Scilab y Maxima, pero no ocurre lo mismo con la interpolación por tramos curvos. La solución aportada por la función interp1 de Scilab se parece más a la interpolación polinómica de Lagrange de Maxima. Esta discrepancia es debida al tipo de condición impuesta a las derivadas. El estudiante que lo desee puede explorar las opciones que permite la función cspline de Maxima y también puede explorar la función splin de Scilab. Ejercicio 5.11 Reproduzca los resultados de la figura 5.9 y 5.10 en los respectivos entornos Scilab y Maxima. Ejercicio 5.12 Acceda de nuevo a los datos experimentales del archivo datos2.txt del curso virtual y utilícelos en Maxima para generar, por interpolación y extrapolación Tema 5 23 Apuntes elaborados por el equipo docente de Herramientas Informáticas para Matemáticas, curso 2014-15 mediante tramos curvos, la correspondiente gráfica en el rango [-2.5 2.5]. Compare los resultados con los obtenidos en el ejercicio 5.10, podrá así analizar la ventaja de poder utilizar la función continua no lineal (5.8) en lugar del conjunto de tramos curvos. En este apartado únicamente hemos contemplado la interpolación lineal, pero Scilab también dispone de funciones para interpolación en 2 dimensiones. Consulte las funciones interp2d y splin2d. 5.4 LECTURA COMPLEMENTARIA El estudiante debe complementar este tema con la lectura de: Apartados “Estadística descriptiva”, “Interpolación” y “Ajuste por mínimos cuadrados” del documento Primeros pasos en Maxima Sin olvidar la ayuda disponible en Scilab en wxMaxima. También es conveniente que consulte los términos “Ajuste de curvas”, “Estadística descriptiva”, “Interpolación lineal”, “Interpolación polinómica”, “Mínimos cuadrados”, “Regresión lineal”, “Regresión polinómica” y “Spline” en la versión española de la enciclopedia libre Wikipedia donde encontrará referencias y enlaces que le permitirán ampliar sus conocimientos sobre el tema. Tema 5 24