Posso eseguire l'integrazione numerica a variabile singola in Julia utilizzando quadgk
. Alcuni semplici esempi:Come eseguire due integrazione numerica variabile in Julia?
julia> f(x) = cos(x)
f (generic function with 1 method)
julia> quadgk(f, 0, pi)
(8.326672684688674e-17,0.0)
julia> quadgk(f, 0, pi/2)
(1.0,1.1102230246251565e-16)
julia> g(x) = cos(x)^2
g (generic function with 1 method)
julia> quadgk(g, 0, pi/2)
(0.7853981633974483,0.0)
julia> pi/4
0.7853981633974483
Il documentation for quadgk non sembra implicare un supporto per l'integrazione multidimensionale, e abbastanza sicuro ottengo un errore se si tenta di abusarne per un 2D integrale:
julia> quadgk(h, 0, pi/2, 0, pi/2)
ERROR: `h` has no method matching h(::Float64)
La documentazione suggerisce che ci sono alcuni pacchetti esterni per l'integrazione, ma non li nominano. Immagino che uno di questi pacchetti possa fare integrali bidimensionali. Qual è il miglior pacchetto di questo tipo per questa attività?
Se provo: usando Cubatura; f (x) = cos (pi * sin (x [1]) * cos (x [2])) * sin (x [1]); hcubature (f, [0,0], [pi/2, pi/2]) quindi Julia sembra entrare in un ciclo di allocazione infinito (1 Gb/minuto).Curiosamente con f (x) = cos (pi * sin (x [1]) * cos (x [2])), l'integrale ha successo. –
Il ciclo di allocazione infinita era una conseguenza del fallimento della convergenza. Può essere aggirato specificando esplicitamente un parametro abstol: hcubature (f, [0,0], [pi/2, pi/2], abstol = 1e-8) –
'cos (pi * sin (x [1]) * cos (x [2])) * sin (x [1]) 'si integra a zero sopra il' xmin' specificato e 'xmax' in modo che la tolleranza non venga mai soddisfatta. Specificare 'abstol' sembra la soluzione più semplice. È anche possibile dividere 'xmin' e' xmax' in più regioni e quindi sommare le integrazioni. – rickhg12hs