Integracja numeryczna nad macierzą funkcji, SymPy i SciPy

Z mojego wyjścia SymPy mam matrycę pokazaną poniżej, którą muszę zintegrować w 2D. Obecnie robię to elementarnie, jak pokazano poniżej. Ta metoda działa, ale staje się zbyt wolna (dla obusympy.mpmath.quad iscipy.integrate.dblquad) dla mojej prawdziwej sprawy (w którejA a jego funkcje są znacznie większe (patrz edycja poniżej):

from sympy import Matrix, sin, cos
import sympy
import scipy
sympy.var( 'x, t' )
A = Matrix([[(sin(2-0.1*x)*sin(t)*x+cos(2-0.1*x)*cos(t)*x)*cos(3-0.1*x)*cos(t)],
            [(cos(2-0.1*x)*sin(t)*x+sin(2-0.1*x)*cos(t)*x)*sin(3-0.1*x)*cos(t)],
            [(cos(2-0.1*x)*sin(t)*x+cos(2-0.1*x)*sin(t)*x)*sin(3-0.1*x)*sin(t)]])

# integration intervals
x1,x2,t1,t2 = (30, 75, 0, 2*scipy.pi)

# element-wise integration
from sympy.utilities import lambdify
from sympy.mpmath import quad
from scipy.integrate import dblquad
A_int1 = scipy.zeros( A.shape, dtype=float )
A_int2 = scipy.zeros( A.shape, dtype=float )
for (i,j), expr in scipy.ndenumerate(A):
    tmp = lambdify( (x,t), expr, 'math' )
    A_int1[i,j] = quad( tmp, (x1, x2), (t1, t2) )
    # or (in scipy)
    A_int2[i,j] = dblquad( tmp, t1, t2, lambda x:x1, lambda x:x2 )[0]

Zastanawiałem się nad zrobieniem tego w jednym ujęciu, ale nie jestem pewien, czy tak jest:

A_eval = lambdify( (x,t), A, 'math' )
A_int1 = sympy.quad( A_eval, (x1, x2), (t1, t2)                 
# or (in scipy)
A_int2 = scipy.integrate.dblquad( A_eval, t1, t2, lambda x: x1, lambda x: x2 )[0]

EDYCJA: Prawdziwa sprawa została udostępniona wten link. Po prostu rozpakuj i uruchomshadmehri_2012.py (czy autorem jest ten przykład pochodzi z:Shadmehri i in. 2012). Rozpocząłem nagrodę w wysokości 50 dla tego, który może wykonać następujące czynności:

uczynić go rozsądnym szybciej niż proponowane pytanie
udaje się uruchomić bez podawania błędu pamięci nawet z wieloma warunkamim=15 in=15 w kodzie) udało mi sięm=7 in=7 w wersji 32-bitowej

Aktualny czas można podsumować poniżej (mierzony za pomocą m = 3 in = 3). Stąd widać, że integracja numeryczna jest wąskim gardłem.

buduj funkcje próbne = 0%
ocena równań różniczkowych = 2%
lambdifying k1 = 22%
integracja k1 = 74%
lambdifying i integracja k2 = 2%
wyodrębnianie wartości własnych = 0%

Powiązane pytania:o lambdify

questionAnswers(2)

yourAnswerToTheQuestion