usando o SciPy para integrar uma função que retorna uma matriz ou matriz
Eu tenho uma matriz simbólica que pode ser expressa como:
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 )
Então, para cadax
Eu obtenho uma matriz diferente:
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]])
e assim por diante...
Eu preciso integrar numericamenteg
sobrex
digamosfrom 0. to 100.
(no caso real a integral não tem uma solução exata) e na minha abordagem atual eu tenho quelambdify
cada elemento emg
e integrá-lo individualmente. estou usandoquad
para fazer uma integração baseada em elementos como:
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. )
Existem dois problemas aqui:1) lambdify usado muitas vezes e2) por loop; e acredito que o primeiro é o gargalo, porque og_sympy
matriz tem no máximo 10000 termos (o que não é grande coisa para um loop for).
Como mostrado acimalambdify
permite a avaliação de toda a matriz, então pensei: "Existe uma maneira de integrar toda a matriz?"
scipy.integrate.quadrature
tem um parâmetrovec_func
o que me deu esperança. Eu estava esperando algo como:
g_int = quadrature( g, x1, x2 )
para obter a matriz totalmente integrada, mas dá aValueError:
matriz deve ser bidimensional
EDIT: O que estou tentando fazeraparentemente pode ser feito em Matlab usandoquadv
ejá foi discutido para SciPy
O caso realfoi disponibilizado aqui.
Para executá-lo, você precisará de:
numpycigarrinhomatplotlibsympyApenas corra:"python curved_beam_mrs.py"
.
Você verá que o procedimento já é lento, principalmente por causa da integração, indicada peloTODO
no arquivocurved_beam.py
.
Irá muito mais devagar se você remover o comentário indicado após oTODO
no arquivocurved_beam_mrs.py
.
A matriz de funções que é integrada é mostrada noprint.txt
Arquivo.
Obrigado!