如何在python中创建符号的对称矩阵?

ifsvaxew  于 2023-02-18  发布在  Python
关注(0)|答案(2)|浏览(102)

我想创建一个元素都是变量的矩阵,所以我尝试了以下方法

import sympy as sp
from sympy import MatrixSymbol, Matrix

A=sp.symbols('rho0:'+str(side*(side)/2))

rho = MatrixSymbol('rho', side, side)

rho[0][0]=A[0]
count=0
for i in range(side):
  for j in range(i,side):
    rho[i][j]=A[count]
    rho[j][i]=rho[i][j]
    count+=1

不过我使用的矩阵类型似乎不支持符号,我该怎么办?

rkttyhzu

rkttyhzu1#

MatrixSymbol用于将抽象矩阵表示为单个实体/符号,其方式类似于Symbol用于表示标量。如果您只打算按顺序使用泛型符号,也许您可以使用

>>> MatrixSymbol('rho', 2, 2).as_explicit()
Matrix([[rho[0, 0], rho[0, 1]], [rho[1, 0], rho[1, 1]]])

注意,一个标准的符号矩阵已经产生。
但是,由于您希望矩阵是对称的,因此必须循环返回矩阵,并像在上面的代码中尝试的那样,为矩阵下面的元素赋值。
或者,您可以通过使用正确的矩阵索引和矩阵(而不是MatrixSymbol)来修改上述操作:

import sympy as sp
from sympy import zeros, Matrix
sides = 2
A=sp.symbols('rho0:'+str(side*(side+1)/2))  # note (side+1) not side

rho = zeros(side, side)

rho[0,0]=A[0]
count=0
for i in range(side):
  for j in range(i,side):
    rho[i,j]=A[count]
    rho[j,i]=rho[i,j]
    count+=1
qhhrdooz

qhhrdooz2#

如果你首先创建一个非对称矩阵,那么你可以用它的元素创建一个对称矩阵:

In [23]: M = MatrixSymbol('M', 3, 3)

In [24]: M
Out[24]: M

In [25]: M.as_explicit()
Out[25]: 
⎡M₀₀  M₀₁  M₀₂⎤
⎢             ⎥
⎢M₁₀  M₁₁  M₁₂⎥
⎢             ⎥
⎣M₂₀  M₂₁  M₂₂⎦

In [26]: M[0,0]
Out[26]: M₀₀

In [27]: Msym = Matrix(3, 3, lambda i, j: M[min(i,j),max(i,j)])

In [28]: Msym
Out[28]: 
⎡M₀₀  M₀₁  M₀₂⎤
⎢             ⎥
⎢M₀₁  M₁₁  M₁₂⎥
⎢             ⎥
⎣M₀₂  M₁₂  M₂₂⎦

In [29]: Msym.is_symmetric()
Out[29]: True

相关问题