Я хотел бы создать диагональную матрицу полосы блоков, используя 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))