создание диагональной матрицы блочной полосы в - PullRequest
0 голосов
/ 02 июля 2019

Я хотел бы создать диагональную матрицу полосы блоков, используя sympy. По сути, матрица должна выглядеть как

Д Н 0 0 0 0
Р Д Н 0 0 0
0 Р Д Н 0 0
0 0 R D N 0
0 0 0 R D N
0 0 0 0 R D

Эта матрица будет затем позже передана в numpy через sympy.lambdify, и numpy вычислит собственные значения для множества различных наборов параметров. Я нашел способ построить матрицу, используя sympy.kronecker_product, однако это невероятно медленно. Я посмотрел на то, почему моя программа такая медленная, и обнаружил, что виновником является kronecker.py. Это было довольно неожиданно, так как я думал, что диагонализация матрицы будет самой медленной частью. Тем более, что матрицу нужно построить только один раз, а затем диагонализировать очень часто.

Таким образом, я ищу способ построения моей матрицы без использования sympy.kronecker_product. Любой совет приветствуется.

Вот пример программы:

import sympy
a,b,c,d = sympy.symbols('a b c d', real=True)
e,f,g,h = sympy.symbols('e f g h', real=True)

D = sympy.Matrix([[a,b-sympy.I*c],[b+sympy.I*c,d]])
#usually more complicated, with constants and sin/cos terms
N = sympy.Matrix([[e,sympy.I*f],[g,-sympy.I*h]])
R = sympy.adjoint(N)

size = 20 #usually around 100

H = sympy.kronecker_product(sympy.eye(size),D) \
  + sympy.kronecker_product(sympy.jordan_cell(0,size),N) \
  + sympy.kronecker_product(sympy.transpose(sympy.jordan_cell(0,size)),R)

H_numpy = sympy.lambdify((a,b,c,d,e,f,g,h), H, 'numpy')

import numpy
for i in range(10*size):
    eigenvalues = numpy.linalg.eigvalsh(H_numpy(i,2,3,4,5,6,7,8))

1 Ответ

1 голос
/ 02 июля 2019

Недавно добавленное banded может быть решением для вас:

>>> size=3
>>> var('d n r')
(d, n, r)

со скалярами

>>> banded(size,{0:d,1:n,-1:r})
Matrix([
[d, n, 0],
[r, d, n],
[0, r, d]])

С матрицами, которые вы определили:

>>> banded(2*size, {0:D,2:N,-2:R})
Matrix([
[      a, b - I*c,       e,     I*f,       0,       0],
[b + I*c,       d,       g,    -I*h,       0,       0],
[      e,       g,       a, b - I*c,       e,     I*f],
[   -I*f,     I*h, b + I*c,       d,       g,    -I*h],
[      0,       0,       e,       g,       a, b - I*c],
[      0,       0,    -I*f,     I*h, b + I*c,       d]])
...