将多元多项式转换为矩阵表示

问题描述 投票:0回答:1

假设我有一个多元多项式:

import sympy

x_1, x_2, x_3, x_4 = sympy.symbols('x_1 x_2 x_3 x_4')

expressions = [
           -x_1*x_1-x_2*x_2+x_1*x_2,
           x_2*x_2-x_1*x_2,
           x_1*x_1-x_1*x_2,
           x_1*x_2,
           x_1*x_1-x_1*x_3,
           x_1*x_3,
           x_3*x_3-x_2*x_3,
           -x_2*x_2-x_4*x_4+x_2*x_4,
           x_2*x_2-x_2*x_3,
           x_2*x_3,
           -x_3*x_3-x_4*x_4+x_3*x_4,
           x_3*x_4,
          ]

model = sympy.Poly(sympy.Add(*expressions))
model

# Poly(x_1**2 - x_2*x_3 + x_2*x_4 + 2*x_3*x_4 - 2*x_4**2, x_1, x_2, x_3, x_4, domain='ZZ')


请注意,变量是

[x_1, x_2, x_3, x_4]
,因此可以将多项式的系数表示为 4x4 方阵,其中平方项的系数(即
x_i*x_i
)是沿矩阵的对角项,并且-对角项取决于
x_i*x_j
的系数:

[[1, 0,  0,  0],
 [0, 0, -1,  1],
 [0, 0,  0,  2],
 [0, 0,  0, -2]
]

sympy
多项式开始,是否可以提取系数并构造相应的
sympy
矩阵,如上所示,对于任何具有变量
[x_1, x_2, ..., x_N]
的多项式?

最终,我真的希望获得最终的矩阵作为

numpy
数组,以便它可以用于
sympy
之外的额外计算。

python matrix sympy polynomials
1个回答
0
投票

只要所有单项式都是 2 次(即

a_ij * x_i * x_j
),这应该有效:

import sympy

x_1, x_2, x_3, x_4 = sympy.symbols('x_1 x_2 x_3 x_4')

expressions = [
           -x_1*x_1-x_2*x_2+x_1*x_2,
           x_2*x_2-x_1*x_2,
           x_1*x_1-x_1*x_2,
           x_1*x_2,
           x_1*x_1-x_1*x_3,
           x_1*x_3,
           x_3*x_3-x_2*x_3,
           -x_2*x_2-x_4*x_4+x_2*x_4,
           x_2*x_2-x_2*x_3,
           x_2*x_3,
           -x_3*x_3-x_4*x_4+x_3*x_4,
           x_3*x_4,
          ]

model = sympy.Add(*expressions)

h = sympy.hessian(model, (x_1, x_2, x_3, x_4))
Q = sympy.Rational(1, 2) * h.subs({x_1:0, x_2:0, x_3:0, x_4:0})
sympy.pprint(Q)

它给出:

⎡1   0     0     0 ⎤
⎢                  ⎥
⎢0   0    -1/2  1/2⎥
⎢                  ⎥
⎢0  -1/2   0     1 ⎥
⎢                  ⎥
⎣0  1/2    1    -2 ⎦

如果需要,您可以将 if 转换为上三角矩阵。

© www.soinside.com 2019 - 2024. All rights reserved.