El otro día mientras terminaba la aplicación para el cálculo y diseño de placas de orificio, Jole, me surgieron como era normal, el problema de determinar las características del agua, densidad, viscosidad dinámica y cinemática. Evidentemente descargué los datos de internet, creando un par de archivos CSV de la densidad del agua y de la viscosidad del agua.
Tenía dos opciones, la primera era incorporar esos archivos al programa y en función de la temperatura facilitada por el usuario, interpolar entre la temperatura inferior y superior, esto ya lo he realizado otras veces con un resultado adecuado. La segunda opción, que es por la que me decanté, para poder actualizar la aplicación de cálculo de funciones por mínimos cuadrados, era la de calcular un par de ecuaciones que se aproximaran lo máximo posible a estos datos, como así hice.
Para ello actualicé la aplicación Apolo. Esta aplicación la hice tiempo atrás, pero es de estas aplicaciones que he hecho en varios lenguajes de programación, Pascal, Basic, Visual Basic, C#, C, C++, Java.
Por supuesto es la versión en Java, la versión más lograda, aunque todavía se puede mejorar en algunos aspectos, pero para compartirla es ya plenamente funcional, y seguro que a más de uno le saca de un apuro en un momento determinado.
De lo realizado hasta el momento, está pendiente que determine el error de los datos para poder evaluar la bonanza del resultado, pero bueno, a ojo ya se puede ver.
La aplicación Apolo se puede descargar de aquí, aunque es evidente que se puede calcular los parametros del agua con los archivos indicados arriba.
A continuación dejo aquí algunos pantallazos de la aplicación, y más abajo y como parece ya una tradición, un screencast con una demo del uso de la aplicación. Espero que os sea de utilidad.
Y la demo de utilización de la aplicación:
Lo que viene a continuación es la explicación del sistema, así como las librerías empleadas, cuando empecé a redactar el artículo esto iba al principio, pero como es un poco pesado e cambiado el orden para que a nadie se le pierda el objetivo de este asunto.
La aplicación se basa en la matriz pseudoinversa de Moore-Penrose,
La matriz seudoinversa permite calcular una solución por mínimos cuadrados de uns sistema lineal de ecuaciuones. Dado un sistema lineal de ecuaciones
- por lo general no se puede esperar encontrar un vector x que resuelva el sistema, y en el caso de existir puede no ser unico. En ambos casos la matriz pseudoinversa permite hallar la solución por mínimos cuadrados. Para aquellos casos con más ecuaciones que incognitas se trata de determinar aquel vector x que resuelve Ax tan proxima a b como sea posible, minimizando la Regla ecuclidea
Tampoco quiero extenderme más allá. Para resolver este sistema me he basado en una librería matemática Jama. JAMA es una librería de algebra lineal básica para Java. Proporciona clases a nivel de usuario para construir y manipular matrices. Mientras que para la representación gráfica de los datos utilicé JFreeChart. JFreeChart es una librería de gráficos implementada en java y que facilita el desarrollo de aplicaciones con gráficos de calidad profesional.
Para que os hagais una idea de hasta que punto es fácil el uso de la librería matemática Jama, indicar que la resolución del sistema de ecuaciones, se realiza en 3 líneas, con esto, queda todo dicho:
[java]
public static Matrix calcula(Matrix A){
//(AT*A)^-1*AT
Matrix AT=A.transpose();
Matrix temp=(AT.times(A)).inverse();
return temp.times(AT);
}
[/java]