Инвертирующая трехдиагональная матрица
У меня есть уравнение
Ax= К
Где A и B - трехдиагональные матрицы. Я хочу рассчитать матрицу
C=inv (A).B
Существуют разные x,s, которые дают разные y, s, поэтому вычисление C удобно.
Может кто-нибудь, пожалуйста, скажите мне более быстрый метод для вычисления обратного. Я использую Python 3.5 и предпочитаю использовать какой-либо метод из numpy. Если это невозможно, я могу использовать scipy или cython в качестве второго и третьего варианта.
Я видел другие подобные вопросы, но они не полностью соответствуют моей проблеме.
Спасибо
2 ответа
Есть много способов сделать это, во всяком случае, одним из самых простых является алгоритм трехдиагональной матрицы, см. Страницу Wiki. Этот алгоритм работает за O(n) раз, в Numpy есть простая реализация по следующей ссылке Github. Однако вы можете подумать о том, чтобы реализовать самостоятельно один из известных алгоритмов, например что-то вроде факторизации LU.
scipy.linalg.solve_banded - это оболочка для LAPACK, которая, в свою очередь, должна вызывать MKL. Кажется, запустить O(N). Для тривиального примера, чтобы показать синтаксис
a = np.array([[1,2,0,0], [-1,2,1,0], [0,1,3,1], [0,0,1,2]])
x = np.array([1,2,3,4])
b = np.dot(a,x)
ab = np.empty((3,4))
ab[0,1:] = np.diag(a,1)
ab[1,:] = np.diag(a,0)
ab[2,:-1] = np.diag(a,-1)
y = solve_banded((1,1),ab,b)
print y