Subido por Concha la del Banco

LIBRO BASE Herramientas informaticas para matematicas

Anuncio
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 21
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-21 
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
0i 
 
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 -1x<2 y x-2 para x2. 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=23i) 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 x0 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 x0. 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 x0. 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
Descargar