假设我有一个多元多项式:
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
之外的额外计算。
只要所有单项式都是 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 转换为上三角矩阵。