Численное интегрирование по матрице функций, SymPy и SciPy

Из моего вывода SymPy у меня есть матрица, показанная ниже, которую я должен интегрировать в 2D. В настоящее время я делаю это поэлементно, как показано ниже. Этот метод работает, но он становится слишком медленным (для обоихsympy.mpmath.quad а такжеscipy.integrate.dblquad) для моего реального случая (в которомA и его функции намного больше (см. правку ниже):

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]

Я думал сделать это одним выстрелом, но яЯ не уверен, если это путь:

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]

РЕДАКТИРОВАТЬ: реальный случай был сделан доступным вэта ссылка, Просто распакуйте и запуститеshadmehri_2012.py (автор, откуда был взят этот пример:Shadmehri et al. 2012). Я'мы получили награду в размере 50 для того, кто может сделать следующее:

сделать это значительно быстрее, чем предложенный вопрос

удается запустить без выдачи ошибки памяти даже с несколькими условиямиm=15 а такжеn=15 в коде) мне удалось доm=7 а такжеn=7 в 32-битном

Текущее время может быть суммировано ниже (измерено с m = 3 и n = 3). Отсюда видно, что численное интегрирование является узким местом.

построить пробные функции = 0%

оценка дифференциальных уравнений = 2%

lambdifying k1 = 22%

интегрирование k1 = 74%

лямбда и интегрирование k2 = 2%

извлечение собственных значений = 0%

Смежные вопросы:о лямбдайфе

Ответы на вопрос(2)

Ваш ответ на вопрос