Estoy buscando alguna implementación de código abierto (cualquiera de Python, C, C ++, Fortran está bien) de aproximación racional a una función. Algo a lo largo del artículo [1]. Le doy una función y me devuelve dos polinomios, cuya relación es la aproximación en el intervalo dado y el error oscila con la misma amplitud y es una aproximación óptima, o cercana.
Aquí está lo que encontré:
Parece que chebfun puede hacer eso, pero no tengo acceso a Matlab *.
Hay un programa simple en la sección 5-13 "Aproximación racional de Chebyshev" en Recetas numéricas (NR).
Mathematica ha EconomizedRationalApproximation y MiniMaxApproximation
Me preguntaba si hay algo más nuevo (posiblemente mejor probado) que el código NR.
Mi aplicación es que tengo un conjunto de funciones especiales, alrededor de 10, que se dan como series hipergeométricas o alguna fórmula que tiene cancelaciones numéricas, y quiero tener una función de evaluación sólida, rápida y precisa, que se llama El bucle más interno del cálculo de dos elementos de matriz de partículas en los cálculos de Hartree Fock. Pongo un ejemplo simple de una función que funciona para mí en [2]. Como puede ver, es usando una fórmula directa, o una serie alrededor de x = 0, que calculé usando SymPy. Funciona de alguna manera, pero la precisión no es excelente, alrededor de x = 1 se pierde aproximadamente la mitad de los dígitos significativos (pero para x = 0.1 y x = 1e5 es preciso para casi todos los dígitos significativos). Estoy buscando una mejor aproximación.
[1] Deun, J. y Trefethen, LN (2011). Una implementación robusta del método Carathéodory-Fejér para aproximación racional. BIT Numerical Mathematics, 51 (4), 1039-1050. doi: 10.1007 / s10543-011-0331-7 ( junio de 2010 e-print )
[2] https://gist.github.com/3831580
(*) Ni al sitio web de chebfun, que me da 404, pero Pedro sugirió que ese debe ser mi problema con el proveedor.
fuente
A menudo, las mejores aproximaciones racionales se pueden lograr mediante iteraciones "manuales" del algoritmo de Remez : interpolar una aproximación racional con errores de signos alternos (relativos o absolutos) en una conjetura inicial de puntos de interpolación, ubicar uno (o más) puntos donde el error real excede el de los puntos de interpolación y el pivote (intercambiando uno o más de los puntos adivinados por estos, de una manera que conserva los errores de signos alternos). Es una buena manera de entender la teoría desde cero. Cuando la precisión requerida es modesta, encuentro que la implementación de una hoja de cálculo me ayuda a entender los cálculos y adaptar los problemas a través de cortar y pegar.
Si bajamos la línea recta a la mitad de la distancia en el punto de "error máximo", entonces tendremos tres puntos de error absoluto "equi-oscilatorios" contando los dos puntos finales y este punto crítico en el interior. Así, la mejor aproximación polinómica lineal a una función convexa lisa se puede encontrar casi por inspección.
El software Chebfun en sí es de código abierto ( licencia de estilo BSD ) desde v4.0. No estoy seguro de por qué los enlaces a su sitio pueden haber devuelto un error 404 en ese momento, pero ahora están en v5.2.1. (También tienen un repositorio de GitHub .) El proyecto Chebfun apunta a más que las mejores aproximaciones racionales, con el concepto central como una sintaxis tipo vector Matlab para funciones (reales univariadas) en un intervalo.
Para completar el círculo, sería necesario hacerlo funcionar bajo Octave en lugar de Matlab. Hubo un hilo de mantenedores de Octave sobre esto que comenzó en 2010. Un artículo de 2012 realizado por los mantenedores / autores de Chebfun sugiere que se han realizado algunos esfuerzos en la compatibilidad con Octave por su parte.
Mirar la página de proyectos relacionados con Chebfun sugiere que debido a que el software Chebfun es de código abierto, podría ser posible hacer este puerto, o utilizar uno de los paquetes de código abierto que se enumeran allí, como Olivier Verdier
pychebfun
, Python Chebyshev Functions. proyecto alojado en GitHub.fuente