ускорение матричных операций - PullRequest
0 голосов
/ 08 июня 2018

Я написал код, который использует sympy для настройки матрицы и вектора.Элементы этих двух символов sympy.Затем я инвертирую матрицу и умножаю инвертированную матрицу и вектор.Это должно быть универсальным решателем для систем линейных уравнений с n переменными.Я заинтересован в символическом решении этих линейных уравнений.Проблема в том, что мой код слишком медленный.Например, для n = 4 это занимает примерно 30 секунд, но для n = 7 я до сих пор не смог решить его, код выполнялся всю ночь (8 часов) и не закончился утром.Это мой код.

from sympy import * 
import pprint 

MM = Matrix(niso,1, lambda i,j:var('MM_%s' % (i+1) ))
MA = Matrix (niso,1, lambda i,j:var('m_%s%s' % ('A', chr(66+i)) ) )
MX = Matrix (niso,1, lambda i,j:var('m_%s%s'% (chr(66+i), 'A')))
RB = Matrix(niso,1, lambda i,j:var('R_%s%s' % ('A'+chr(66+i),i+2)))
R = Matrix (niso, niso-1, lambda i,j: var('R_%s%d' % (chr(65+i) , j+2 )))
K= Matrix(niso-1,1, lambda i,j:var('K_%d' % (i+2) ) )
C= Matrix(niso-1,1, lambda i,j:var('A_%d' % i))

A = Matrix(niso-1,niso-1, lambda i,j:var('A_%d' % i))
b = Matrix(niso-1,1, lambda i,j:var('A_%d' % i))

for i in range(0,niso-1):
        for j in range(0,niso-1):
            A[i,j]=MM[j+1,0]*(Add(Mul(R[0,j],1/MA[i,0]/(RB[i,0]-R[0,i])))+R[i+1,j]/MX[i,0]/(-RB[i,0]+R[0,i]))

for i in range(0,niso-1):
    b[i,0]=MM[0,0]*(Add(Mul(1,1/MA[i,0]/(RB[i,0]-R[0,i])))+1/MX[i,0]/(-RB[i,0]+R[0,i]))


A_in = Inverse(A)
if niso <= 4:
    X =simplify(A_in*b)
if niso > 4:
    X = A_in*b
pprint(X)

Есть ли способ ускорить его?

1 Ответ

0 голосов
/ 08 июня 2018

Не инвертируйте!С n=4

%timeit soln = A.LUsolve(b)
697 µs ± 12.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

С n=10

%timeit soln = A.LUsolve(b)
431 ms ± 13 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
...