użycie SciPy do zintegrowania funkcji, która zwraca macierz lub tablicę
Mam tablicę symboliczną, którą można wyrazić jako:
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 )
Więc dla każdegox
Mam inną matrycę:
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]])
i tak dalej...
Muszę zintegrować się numerycznieg
koniecx
, mówićfrom 0. to 100.
(w prawdziwym przypadku całka nie ma dokładnego rozwiązania) iw moim obecnym podejściu muszęlambdify
każdy element wg
i zintegrować go indywidualnie. ja używamquad
zrobić integrację opartą na elementach, taką jak:
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. )
Są tu dwa problemy:1) lambdify używane wiele razy i2) dla pętli; i wierzę, że pierwszym jest wąskie gardło, ponieważg_sympy
macierz ma co najwyżej 10000 terminów (co nie jest wielkim problemem dla pętli for).
Jak wyżejlambdify
pozwala na ocenę całej macierzy, więc pomyślałem: „Czy istnieje sposób na zintegrowanie całej macierzy?”
scipy.integrate.quadrature
ma parametrvec_func
co dało mi nadzieję. Spodziewałem się czegoś takiego:
g_int = quadrature( g, x1, x2 )
aby uzyskać w pełni zintegrowaną matrycę, ale dajeValueError:
macierz musi być dwuwymiarowa
EDYCJA: Co próbuję zrobićnajwyraźniej można to zrobić w Matlab za pomocąquadv
izostał już omówiony w SciPy
Prawdziwa sprawazostał udostępniony tutaj.
Aby go uruchomić, musisz:
numpyscipymatplotlibsympyPo prostu biegnij:"python curved_beam_mrs.py"
.
Zobaczysz, że procedura jest już powolna, głównie z powodu integracji wskazanej przezTODO
w plikucurved_beam.py
.
Będzie to znacznie wolniejsze, jeśli usuniesz komentarz wskazany poTODO
w plikucurved_beam_mrs.py
.
Macierz zintegrowanych funkcji jest pokazana wprint.txt
plik.
Dziękuję Ci!