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

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多项式开始,对于任何变量为[x_1, x_2, ..., x_N]的多项式,是否可以提取系数并构造如上所示的相应的sympy矩阵?

最终,我真的希望获得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)

Q = sympy.Rational(1, 2) * sympy.hessian(model, (x_1, x_2, x_3, x_4))
sympy.pprint(Q)

它提供了:

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

或者,如果您需要上三角矩阵:

import numpy as np

h = np.array(sympy.hessian(model, (x_1, x_2, x_3, x_4)), dtype=float)
Q = np.triu(h) - 0.5 * np.diag(np.diag(h))
print(Q)

这提供了:

[[ 1.  0.  0.  0.]
 [ 0.  0. -1.  1.]
 [ 0.  0.  0.  2.]
 [ 0.  0.  0. -2.]]

Python相关问答推荐

如何在超时的情况下同步运行Matplolib服务器端?该过程随机挂起

在使用Guouti包的Python中运行MPP模型时内存不足

Pandas 填充条件是另一列

使用mySQL的SQlalchemy过滤重叠时间段

ModuleNotFound错误:没有名为Crypto Windows 11、Python 3.11.6的模块

Pytest两个具有无限循环和await命令的Deliverc函数

将两只Pandas rame乘以指数

如何找到满足各组口罩条件的第一行?

Pandas:将多级列名改为一级

使用Python更新字典中的值

在含噪声的3D点网格中识别4连通点模式

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

Python脚本使用蓝牙运行在Windows 11与raspberry pi4

如何保持服务器发送的事件连接活动?

如何更新pandas DataFrame上列标题的de值?

为什么Django管理页面和我的页面的其他CSS文件和图片都找不到?'

如何在FastAPI中为我上传的json文件提供索引ID?

从Windows Python脚本在WSL上运行Linux应用程序

如何在达到end_time时自动将状态字段从1更改为0

如何创建引用列表并分配值的Systemrame列