rumigaculum.com

  • Aumentar tamaño del tipo
  • Tamaño del tipo predeterminado
  • Disminuir tamaño del tipo
Inicio Computación y cálculo numérico Microentornos de desarrollo de cálculo numérico

Microentornos de desarrollo de cálculo numérico

E-mail Imprimir PDF

Introducción

En este monográfico presento y pongo a disposición del lector sendos microentornos de desarrollo (frameworks) para resolver problemas de: integración numérica, anulación iterativa de sistemas de ecuaciones no lineales y optimización iterativa de superficies.
No se explica aquí la teoría y práctica de ningún método de cálculo novedoso. Lo que pongo a disposición del lector se basa en algoritmos estándares; nada que no se pueda encontrar en Wikipedia o en otras páginas especializadas. Mi meta es sobre todo mostrar, de la manera más clara posible, que la forma de uso de todos los métodos computacionales aquí presentados es, en esencia, la misma.
Mi objetivo último es que toda persona interesada, con un nivel medio tanto en matemáticas como en programación, pueda descargar y adaptar rápidamente a sus necesidades los siguientes microentornos de desarrollo:

  • Integrator - Integración de sistemas de ecuaciones diferenciales ordinarias (fundamentalmente no lineales).
  • Solver - Resolución de sistemas de ecuaciones no lineales.
  • Optimizer - Optimización (búsqueda de máximos y mínimos) de funciones de varias variables sin restricción en el dominio de búsqueda.

Para qué no sirven estos microentornos

Ninguno los microentornos anteriores es apto para resolver problemas de gran tamaño. Con esto quiero decir que:

  • Integrator no está pensado para resolver sistemas de cientos de ecuaciones diferenciales.
  • Solver no puede resolver con soltura sistemas de cientos de ecuaciones no lineales; posiblemente tanto el consumo de memoria como el de tiempo de computación serían prohibitivos.
  • Optimizer no debe usarse para la optimización de funciones de cientos de variables, por las mismas razones que hemos apuntado para el microentorno anterior.

En definitiva, el cálculo matricial que subyace bajo lo microentornos anteriores está diseñado para tamaños de matriz relativamente pequeños (hasta 50 o 100 filas y columnas).

Desaconsejo por tanto (de manera general) el empleo de estos microentornos de desarrollo en problemas de medios continuos o cualesquiera otros en que aparezcan sistemas de ecuaciones de tamaño grande.

Por qué microentornos y no aplicaciones

En ningún momento he hablado de aplicaciones, sino de microentornos de desarrollo (micro frameworks). Lo que podrá descargarse el lector son ficheros de código fuente que podrá añadir con facilidad a sus propios desarrollos o aplicaciones. Pero para hacer que estos desarrollos funcionen, será necesario que el usuario escriba algunas clases sencillas (en C++ estándar) para indicarle al microentorno:

  • El problema que se desea resolver.
  • Cómo y cuándo se debe detener la búsqueda de la solución. (Los microentornos presentados incluyen algunas clases con criterios estándares, por lo que es posible que en muchas ocasiones nos ahorremos este trabajo).

Por otra parte siempre es necesario indicar a cualquiera de los tres microentornos:

  • El algoritmo de cálculo que se desea usar.
  • Una semilla o condición inicial del cálculo.
  • Un contenedor donde se almacene el resultado del cálculo.

Lenguaje de programación usado

He empleado C++ estándar para la codificación de los microentornos anteriores. Creo que es un lenguaje eficiente para el cálculo numérico. Se podría haber usado cualquier otro lenguaje compilado, pero el hecho de que la estructura del código estuviera orientada a objetos me parecía de capital importancia. Creo que el lector estará de acuerdo conmigo en cuanto empiece a bucear en la estructura común de los tres proyectos.

Existe empero la posibilidad de llamar al microentorno Solver desde Java. Para ello he creado el proyecto JSolver, cuya descarga también está disponible. Lo que se ha hecho básicamente es encapsular Solver en una dll (Jsolver.dll) a la que puede invocarse desde Java. La bondad de esta dll reside en que la introducción del problema a resolver está en la parte Java, esto es, en la parte controlada por el usuario.

Todas las codificaciones han sido probadas con éxito en tres compiladores distintos:

  • MS Visual Studio 2005.
  • Mingw32 gcc bajo Bloodshed Dev-C++ v.4.9.9.2.
  • GNU C/C++ bajo Eclipse CDT v.4.0.

Documentación y ejemplos

Los tres microentornos disponen de sendos Manuales del Desarrollador. En ellos se explica el funcionamiento y uso de los mismos, y qué tareas debe emprender el usuario para adaptarlos a sus propios proyectos.

Por otra parte, todos los microentornos tienen varios ejemplos que muestran su uso de manera completa (ficheros de nombre Sample.cpp).

Los proyectos Integrator y Solver disponen además de algunas pequeñas demos que aclaran aún más su uso.

Forma de uso común

Si el lector se toma la molestia de acudir a la página de descargas y abrir los Manuales del Desarrollador de los tres microentornos, verá ya desde la introducción que todos constan de cinco componentes (expresados en forma de clases) y que estos componentes son completamente independientes entre sí, esto es, están desacoplados. Esta es para mí la capacidad más notable de los microentornos presentados: se puede sustituir un componente por otro del mismo tipo sin alterar en absoluto el resto de la aplicación.

Los componentes pueden describire, de forma abstracta, como sigue:

En primer lugar necesitamos un contenedor para el problema que pretendemos resolver. Dicho contenedor se crea como una clase heredada de otra clase perteneciente al microentorno de interés. Dentro de tal contenedor, y siguiendo las intrucciones del Manual del Desarrollador correspondiente, se introduce el objeto del cálculo: un sistema de ecuaciones diferenciales, un sistema de ecuaciones o una función de varias variables.

Es necesario en segundo lugar un contenedor para albergar datos de partida del cálculo: en el caso de un problema de integración, necesitamos introducir una condición inicial; en el caso de la resolución de un sistema de ecuaciones o de la optimización de una superficie, necesitamos un valor semilla para iniciar el proceso iterativo de búsqueda de la solución.

A continuación necesitamos otro contenedor para albergar el resultado del cálculo. Si se trata de un problema de integración, podremos usar dos tipos de contenedores distintos: uno para la albergar la solución de cálculo, y otro para albergar toda la trayectoria integrada.

En cuarto lugar es necesario un objeto que contenga el algoritmo de cálculo que va a usarse para resolver el problema. Este algoritmo debe describirse dando valores a una serie de parámetros intrínsecos que lo definen. Aunque los tres microentornos ya cuentan de manera estándar con algoritmos en cantidad suficiente, el lector puede añadir los suyos propios, siempre que respete la estructura del microentorno.

Por último necesitaremos un objeto que describa el criterio de paro que se aplicará al cálculo. Este criterio se define como una clase heredada de otra clase perteneciente al microentorno de interés. Los tres microentornos ya disponen de criterios de paro estándares; no obstante es muy posible que para resolver problemas de integración el lector precise de otros distintos. Los Manuales del Desarrollador explican cómo construir estos criterios.

Para la ejecución del cálculo deberemos introducir los componentes anteriores (objetos) como argumentos de una función específica para cada microentorno: Integrate(...) en el proyecto Integrator, Solve(...) en el proyecto Solver y Optimize(...) en el proyecto Optimizer.

La exposición de las semejanzas que acabamos de apuntar le servirá al lector para que, una vez haya comprendido el uso de uno de los microentornos, no tenga dificultad alguna en usar cualquiera de los otros dos.

Autoría y propiedad de los microentornos

El código que aquí se ofrece (más documentación y ejemplos) lo ha escrito en su totalidad David Serrano Martínez (correo-e).

Todo el software que pongo a disposición de los lectores de esta página se puede considerar de dominio público (no sujeto a licencia de ningún tipo). Por ello el usuario tendrá el derecho de incluirlo en sus proyectos, modificarlo a su conveniencia, mejorarlo y entregarlo a quien le plazca. Sólo apelo a la buena conciencia del usuario para que, en caso de que el código esté incluido en un producto suyo destinado a la venta, descuente del precio final el coste que cree que tendría el haberlo desarrollado por su cuenta, pues se da el caso de que dicho código (salvo sus modificaciones) pertenece en origen tanto al vendedor como al comprador.

Exención de responsabilidad

Los proyectos que aquí se ofrecen se han desarrollado de buena fe, con la intención de ayudar al lector y usuario en tareas de cálculo numérico. Los algoritmos de cálculo empleados son estándares y pueden contrastarse en cualquier libro sobre la materia o en Internet. Por otra parte, el código ha sido sometido a numerosas pruebas.

Dicho lo anterior, no asumo ninguna responsabilidad sobre cualquier posible daño que su uso pudiere ocasionar. El usuario es libre de usar, bajo su absoluta responsabilidad, el código que aquí se ofrece.

Tampoco puedo garantizar la bondad, exactitud y precisión de los resultados numéricos arrojados por los algoritmos incluidos en los microentornos presentados.

Asistencia técnica

Me eximo de prestar asistencia técnica referente al código presentado o a ningún otro. No obstante lo anterior, trataré (en la medida de lo posible) de responder de buen grado a las dudas, quejas, aclaraciones y propuestas que los lectores me hagan llegar.

Share