Я пытаюсь написать алгоритм TDMA с numba в режиме nopython. Вот мой код:
@jit(nopython=True)
def TDMA(a,b,c,d):
n = len(d)
x = np.zeros(n)
w = np.zeros(n)
# ac, bc, cc, dc = map(np.copy, (a, b, c, d)) # copy arrays
ac = np.copy(a)
bc = np.copy(b)
cc = np.copy(c)
dc = np.copy(d)
for i in range(1,n):
w[i] = ac[i-1]/bc[i-1]
bc[i] = bc[i] - w[i]*cc[i-1]
dc[i] = dc[i] - w[i]*dc[i-1]
x[n-1] = dc[n-1]/bc[n-1]
for k in range(n-2,-1,-1):
x[k] = (dc[k]-cc[k]*x[k+1])/bc[k]
return np.array(x)
Затем протестируйте этот решатель:
A = np.array([[5, 2, 0, 0],[1, 5, 2, 0],[0, 1, 5, 2],[0, 0, 1, 5]],float)
B = np.array([[15],[2],[7],[20]],float)
a = A.diagonal(-1)
b = A.diagonal()
c = A.diagonal(1)
x1 = np.linalg.solve(A,B)
x2 = TDMA(a,b,c,B)
print('by default solver, x1 = ',x1)
print('by TDMA, x2 = ',x2)
Однако моя функция TDMA не работает с TypingError
:
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Cannot resolve setitem: array(float64, 1d, C)[int64] = array(float64, 1d, C)
File "<ipython-input-20-e25cda7246bd>", line 16:
def TDMA(a,b,c,d):
<source elided>
x[n-1] = dc[n-1]/bc[n-1]
^
Он корректно работает с декоратором @jit
, но не работает в режиме nopython
. Как мне изменить эту функцию TDMA, чтобы сделать ее совместимой с nopyhon
?
Строка, которую я прокомментировал:
ac, bc, cc, dc = map(np.copy, (a, b, c, d)) # copy arrays
Также не совместимо с nopython
. Можно ли использовать функцию map
в режиме nopython
?
Я понимаю, что моя TDMA может все еще работать медленно. Так есть ли самый быстрый код, использующий язык Python 3 для реализации алгоритма трехдиагональной матрицы?