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:

numpyscipymatplotlibsympy

Po 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!

questionAnswers(5)

yourAnswerToTheQuestion