У меня есть символический массив, который может быть выражен как:
from sympy import lambdify, Matrix
g_sympy = Matrix([[ x, 2*x, 3*x, 4*x, 5*x, 6*x, 7*x, 8*x, 9*x, 10*x],
[x**2, x**3, x**4, x**5, x**6, x**7, x**8, x**9, x**10, x**11]])
g = lambdify( (x), g_sympy )
Итак, для каждого x получается другая матрица:
g(1.) # matrix([[ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.],
# [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])
g(2.) # matrix([[ 2.00e+00, 4.00e+00, 6.00e+00, 8.00e+00, 1.00e+01, 1.20e+01, 1.40e+01, 1.60e+01, 1.80e+01, 2.00e+01],
# [ 4.00e+00, 8.00e+00, 1.60e+01, 3.20e+01, 6.40e+01, 1.28e+02, 2.56e+02, 5.12e+02, 1.02e+03, 2.05e+03]])
и т.д.
Мне нужно численно интегрировать g поверх x, скажем from 0. to 100. (в реальном случае интеграл не имеет точного решения), и в моем текущем подходе я должен lambdify каждый элемент в g и интегрировать это индивидуально. Я использую quad для элементарного интегрирования, например:
ans = np.zeros( g_sympy.shape )
for (i,j), func_sympy in ndenumerate(g_sympy):
func = lambdify( (x), func_sympy)
ans[i,j] = quad( func, 0., 100. )
Здесь есть две проблемы: 1) lambdify используется много раз и 2) для цикла; и я считаю, что первое из них является узким местом, потому что матрица g_sympy имеет не более 10000 терминов (что не очень важно для цикла for).
Как показано выше, lambdify позволяет оценить всю матрицу, поэтому я подумал: "Есть ли способ интегрировать всю матрицу?"
scipy.integrate.quadrature имеет параметр vec_func, который дал мне надежду. Я ожидал чего-то вроде:
g_int = quadrature( g, x1, x2 )
чтобы получить полностью интегрированную матрицу, но при этом матрица ValueError: должна быть двумерной
EDIT: Я пытаюсь сделать по-видимому, в Matlab, используя quadv и уже обсуждался для SciPy
Здесь представлен реальный случай .
Чтобы запустить его, вам понадобится:
- NumPy
- SciPy
- Matplotlib
- SymPy
Просто запустите: "python curved_beam_mrs.py".
Вы увидите, что процедура выполняется медленно, главным образом из-за интеграции, указанной TODO в файле curved_beam.py.
Это будет намного медленнее, если вы удалите комментарий, указанный после TODO в файле curved_beam_mrs.py.
Матрица интегрируемых функций показана в файле print.txt.
Спасибо!