По матрице A найти все матрицы такие, что AB = BA - PullRequest
0 голосов
/ 14 апреля 2020

Учитывая квадратную матрицу A, найдите все матрицы X такие, что AX = XA. Это частный случай уравнения Сильвестра (одно из форм AX + XB = Q), когда A = B и Q - нулевая матрица. Я знаю, что у SciPy есть решатель для этого типа уравнений, однако, поскольку нулевая матрица всегда является решением моего уравнения, этот решатель просто дает мне это тривиальное решение.

Существуют бесконечные решения уравнения AX = XA, так что я на самом деле ищу способ найти основу для пространства решений.

Вот моя попытка для небольшого примера, который я работал на бумаге:

import numpy as np
import scipy
from sympy import *


A = np.array([[-2, 1, 1],[3, -3, 0], [1, 0, -1]])

X = np.array([["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"]])

Q = np.zeros_like(L)


var('a b c d e f g h i L S')

A = Matrix([[-2, 1, 1],[3, -3, 0], [1, 0, -1]])

X = Matrix([[a, b, c], [d, e, f], [g, h, i]])


M = A.multiply(X) - X.multiply(A)
M

Я могу Не могу найти способ «извлечь» коэффициенты из матрицы М. Если бы я мог это сделать, то у меня была бы матрица коэффициентов однородной системы линейных уравнений и, возможно, тогда я мог бы получить нетривиальное решение или все возможные решения этой проблемы.

1 Ответ

1 голос
/ 17 апреля 2020

Я решил это с помощью, которую вы мне дали, но, возможно, есть более эффективные способы. Я отправляю это так или иначе, если это кому-нибудь поможет Я надеюсь, что смогу расширить это на более крупные матрицы более эффективным способом.

import numpy as np
import scipy
from sympy import *
from sympy import Matrix, lcm

var('x L S')

#L is the matrix given, I want to find all matrices that commute with it
L = Matrix([[-2, 1, 1],[3, -3, 0], [1, 0, -1]])

#S is a variable matrix
S = Matrix([[x**1, x**2, x**3], [x**4, x**5, x**6], [x**7, x**8, x**9]])

#I need to solve the equation M = 0 (M = LS - SL)
M = L.multiply(S) - S.multiply(L)  

#I convert each entry to a polynomial and extract coefficients
B = []

for i in range(0,9):
    b = poly(M[i]).all_coeffs()
    B.append(b)

# Define a function to add zeros corresponding to missing variables   
def trp(l, n):
    return [0]*(n-len(l)) + l[:n]

# Add zeros at the beginning of every list 
C = []

for i in range(0,9):
    c = trp(B[i],10)
    C.append(c)

#Function to remove last zero corresponding to constant term
def trp2(l,n):
    return l[:n] + [0]*(n-len(l))


#"Good" list: with coefficients for all variables wanted
A = []

for i in range(0,9):
    a = trp2(C[i],9)
    A.append(a)

#Find null space of matrix
A = Matrix(A)
v = A.nullspace()

#one solution matrix
v[0] + v[1] + v[2]

#The matrix found is S = [[1,1,1],[3,0,0],[1,0,2]] which indeed satisfies that SL = LS.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...