У меня есть символический массив, который может быть выражен как:
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
.
Спасибо!