2012-01-25 35 views
5

Tengo el siguiente problema:integración numérica con C++ sobre una malla dada con discretización constante fija

Mi C++ código puede calcular dos funciones

f1 (i1, i2, i3, i4)

f2 (j1, j2)

para cada conjunto de {i1, i2, i3, i4} obtengo un valor de f1 y para cada conjunto de {j1, j2} obtengo un valor de f2.

los conjuntos {i1, i2, i3, i4} y {j1, j2} se dan en una malla FIJA con algún paso de discretización constante "h".

necesito para calcular, en lenguaje matemático, un F3 Integral (x1, x3) = Integral [f1 (x1, x2, x3, x4) * f2 (x3, x4) dx4 dx3]

El la la suma simple no es lo suficientemente buena, ya que f2 tiene muchos saltos.

¿Hay alguna biblioteca C++ que pueda hacer este tipo de integración? O alguna algorhithm que es fácil de implementar (no soy muy bueno en C++)

muchas gracias

Respuesta

3

Si sólo dispone de los valores en los puntos de malla y sin conocimiento matemático adicional de la forma de las curvas no hay nada mejor que puedas hacer que la suma trivial.

No hay manera más que para cambiar la malla o utilizar otros métodos como completamente http://en.wikipedia.org/wiki/Monte_Carlo_integration

+0

asumí que conozco los saltos en f2 y supuse que f1 es lo suficientemente suave. ¿Qué puedo hacer en ese caso? – Sankp

+0

Quiero decir, si, por ejemplo, sus funciones son analíticas en regiones, si son funciones de paso, splines, polinomios, etc. Entonces puede hacer integrales exactas en esas regiones y sumar las regiones.¿Conoces la forma exacta de f2 con mayor precisión que el binning? Entonces, ¿por qué no puedes evaluar las funciones en ubicaciones arbitrarias para la integración? ¿Tardan mucho tiempo o obtienen las funciones de algún otro lugar en forma tabulada? También eche un vistazo a la respuesta de @ElKamina. Necesitaría una versión 2d, como esta http://math.fullerton.edu/mathews/n2003/simpsonsrule2dmod.html –

+1

Para Monte Carlo, mire las vEGAS y MISER las buenas subrutinas fortran. Quizás pueda encontrarlos en www.netlib.org, o como versiones C en el libro Numerical Recipes. Pueden ayudar a hacer frente al hecho de que f2 no ​​es regular. –

1

Puede utilizar la regla de Simpson (http://en.wikipedia.org/wiki/Simpson%27s_rule). Pero, como mencionó Johan, si f2 es empinado y errático, el paso decreciente h es la única solución. Otro enfoque que quizás desee considerar es la variable h en la malla. Es decir:

1. Start with a global common h 
2. Divide the space into smaller subspaces 
3. Calculate integral for each subspace 
4. Recalculate integral for each subspace using step size h/2 
5. For only subspaces where difference between integrals (h and h/2) is substantial repeat the above mentioned steps (From step 3) 
+0

Bueno, pero él afirma que la malla si está arreglada. Además, el método que sugiere solo funciona para las funciones que se comportan bien. –

+0

@JohanLundberg Estoy completamente de acuerdo contigo! – ElKamina

1

La integración se define para funciones de argumentos reales. Por lo tanto, si solo conoce sus funciones en una malla fija, debe proporcionar una regla adicional de cómo define su función para argumentos entre los puntos de malla. Esto realmente no tiene mucho que ver con la programación, solo son matemáticos.

Por ejemplo, si sabe que su función es razonablemente suave, utilice una interpolación lineal. De algo más complicado, si es necesario. Pero sin alguna regla de este tipo, el problema de integración simplemente no está bien definido.

Una vez que tenga esta regla, que solo puede provenir de un significado subyacente de sus funciones, puede comenzar a elegir un algoritmo de integración. Para las funciones de cuatro variables, secundé la sugerencia de Johan Lundberg de buscar integradores de Monte Carlo.

0

Has mencionado que conoces los saltos en f2, no puedes separar f2 en f2 = f2a + f2b, donde; f2a es una función suave, en la cual, los métodos de integración numérica convencionales serán suficientes, y f2b es una función muy simple con saltos, que puede calcular el área analíticamente, ya que es simple. Luego puede agregar los valores ya que la integración es una operación lineal. Todo depende de lo que sabes sobre f2 realmente, creo.

Cuestiones relacionadas