2011-07-30 23 views
5

Estoy buscando una función de cuadratura numérica super duper. Debe tener las siguientes tres propiedades:Integración numérica en Python con cuadratura adaptativa de función vectorizada

  • Adaptable - ajusta automáticamente la densidad de los puntos de muestreo para adaptarse al integrando. Esto es absolutamente necesario porque mi integrando es muy poco uniforme y costoso de calcular.
  • Vectorizado: llama al integrando en listas de puntos de muestra en lugar de un punto a la vez, para mayor eficiencia.
  • Capaz de manejar funciones con valores vectoriales: todos los componentes del integrando con valores vectoriales se calculan al mismo tiempo sin costo adicional, por lo que no tiene sentido integrar todos los componentes por separado.

Además, debe ser:

  • 2D - la integral Quiero calcular es una integral doble sobre una región planar, y quiero ser capaz de especificar una tolerancia total (relativa) para toda la integral y hacer que administre el presupuesto de error de manera apropiada.

¿Alguien sabe de una biblioteca que tiene tal función? Incluso dos o tres de las cuatro propiedades serían mejores que nada.

Estoy usando Python y SciPy, por lo que si ya funciona con Python eso es una ventaja. (Pero también puedo escribir código de pegamento para que llame a mi integrando si es necesario.)

+1

Por desgracia, no hay respuestas aún! Estoy escribiendo mi propio algoritmo de integración numérica en C#. Es adaptativo y maneja dimensiones N, pero no está vectorizado, sin embargo. Obtener las condiciones de terminación (tolerancia) correctas está resultando difícil. –

+0

@Keenan Pepper Tal vez el proceso descrito [en esta pregunta puede darle alguna idea] (http://stackoverflow.com/questions/14441541/performance-behaviour-of-vectorized-functions-in-numpy/16551313#16551313) –

Respuesta

1

La función quadrature en scipy.integrate satisface los dos primeros requisitos de lo que está buscando. La función romberg similar usa un different method.

Otras funciones sólo satisfacen uno de los requisitos:

  • La función quad nombre similar hace cuadratura adaptativa, pero sólo es compatible con una función con un argumento escalar. Puede pasarle una función ctypes para un mayor rendimiento, pero las funciones normales de Python serán muy lentas.
  • La función simps y los métodos de muestreo relacionados se pueden pasar un vector de muestras (por lo general espaciadas uniformemente), pero no son adaptativas.

El tercer requisito que enumeró (integral simultánea de una función vectorial) es un poco esotérico y los conflictos con la capacidad de aceptar una función vectorizada en el primer lugar (el argumento de la función tendría que tomar una matriz! De manera similar, la capacidad de calcular una integral doble complicaría la especificación de la función de manera significativa.

En la mayoría de los casos, la función quadrature sería el camino a seguir.

1

Acabo de implementar la cuadratura adaptativa vectorizada para dominios 1D y 2D en quadpy. Todo lo que necesita proporcionar es una triangulación de su dominio y la función que desea integrar. Puede ser de valor vectorial.

Instalar quadpy con

pip install quadpy 

y ejecutar

import numpy 
import quadpy 


triangles = numpy.array([ 
    [[0.0, 0.0], [1.0, 0.0]], 
    [[1.0, 0.0], [1.0, 1.0]], 
    [[0.0, 1.0], [0.0, 1.0]], 
    ]) 

val, error_estimate = quadpy.triangle.adaptive_integrate(
     lambda x: [numpy.sin(x[0]), numpy.exp(x[0])], 
     triangles, 
     1.0e-10 
     ) 

print(val) 
print(error_estimate) 

Esto da

[ 0.45969769 1.71828183] 
[ 7.10494337e-12 3.68776277e-11] 
Cuestiones relacionadas