2012-01-25 5 views
5

Ho il seguente problema:integrazione numerica con C++ su un dato maglia con discretizzazione costante fisso

mio codice C++ può calcolare due funzioni

f1 (i1, i2, i3, i4)

f2 (j1, j2)

per ogni set di {i1, i2, i3, i4} Ottengo un valore di f1 e per ogni set di {j1, j2} ottengo un valore di f2.

i set {i1, i2, i3, i4} e {j1, j2} sono dati su una mesh FISSA con un passo di discretizzazione costante "h".

Ho bisogno di calcolare, in linguaggio matematico, una F3 integrale (x1, x3) = Integrale [f1 (x1, x2, x3, x4) * f2 (x3, x4) dx3 dx4]

Il la la semplice sommatoria non è abbastanza buona, dato che f2 ha molti salti.

C'è qualche libreria C++ che può fare questo tipo di integrazione? O qualche algorhithm che è facile da implementare (Io non sono veramente bene su C++)

molte grazie

risposta

3

Se avete solo i valori in corrispondenza dei punti di maglia e nessun ulteriore conoscenze matematiche della forma delle curve non c'è niente meglio puoi fare che la sommatoria banale.

Non c'è modo altro che cambiare la rete o utilizzare altri metodi completamente come http://en.wikipedia.org/wiki/Monte_Carlo_integration

+0

presupposto conosco i salti su f2 e presuppongo che f1 sia abbastanza regolare. cosa posso fare in questo caso? – Sankp

+0

Intendevo, se ad esempio le vostre funzioni sono analitiche nelle regioni, se sono funzioni di step, spline, polinomio, ecc. Quindi potete eseguire integrali esatti in quelle regioni e sommare le regioni.Conoscete la forma esatta di f2 con maggiore accuratezza rispetto al binning? Allora perché non puoi valutare le funzioni in posizioni arbitrarie per l'integrazione? Sono estremamente dispendiosi in termini di tempo o si ottengono le funzioni da qualche altra parte in una forma tabulata? Dai anche un'occhiata alla risposta di @ElKamina. Avresti bisogno di una versione 2d, come questa http://math.fullerton.edu/mathews/n2003/simpsonsrule2dmod.html –

+1

Per Monte Carlo, guarda le subroutine fortran di VEGAS e MISER. Li puoi trovare su www.netlib.org, o come versioni di C nel libro di Ricette numeriche. Possono aiutare a far fronte al fatto che f2 non è regolare. –

1

È possibile utilizzare la regola di Simpson (http://en.wikipedia.org/wiki/Simpson%27s_rule). Ma, come ha detto Johan, se f2 è ripida e irregolare la dimensione del passo h è l'unica soluzione. Un altro approccio da prendere in considerazione è la variabile h attraverso la mesh. Ovvero:

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

Bene, ma lui afferma che la rete se fissa. Inoltre, il metodo suggerito funziona solo per funzioni ben funzionanti. –

+0

@JohanLundberg Sono completamente d'accordo con te! – ElKamina

1

L'integrazione è definita per le funzioni degli argomenti reali. Quindi se conosci solo le tue funzioni su una mesh fissa, devi fornire una regola aggiuntiva su come definisci la tua funzione per gli argomenti tra i punti di mesh. Questo in realtà non ha molto a che fare con la programmazione, è solo matematica.

Ad esempio, se si sa che la propria funzione è ragionevolmente regolare, si utilizza sanamente l'interpolazione lineare. Di qualcosa di più complicato, se è necessario. Ma senza alcune regole di questo tipo, il problema dell'integrazione non è semplicemente ben definito.

Una volta che hai una tale regola - che può venire solo da un significato fondamentale delle tue funzioni --- puoi iniziare a scegliere un algoritmo di integrazione. Per le funzioni di quattro variabili, avrei seguito il suggerimento di Johan Lundberg di esaminare gli integratori di Monte Carlo.

0

Hai detto che conosci i salti su f2, non puoi separare f2 in f2 = f2a + f2b, dove; f2a è una funzione fluida, sulla quale saranno sufficienti i convenzionali metodi di integrazione numerica e f2b è una funzione molto semplice con salti, che, è possibile calcolare l'area analiticamente poiché è semplice. Quindi è sufficiente aggiungere i valori poiché l'integrazione è un'operazione lineare. Dipende tutto da quello che sai su F2 davvero, penso.