我正在使用sympy生成符号多项式方程。我有大约30个变量和大约20个常量变量。我的方程式达到的最高幂是一个平方项。
我需要取这些方程中的2^13,计算出其中有多少是唯一的(即,不是彼此的线性组合,不是退化的)。否则,我需要找到方程组产生的矩阵的秩。这些方程大多是退化的,它们是彼此的线性组合。然而,最终,我需要从数据中提取出唯一的方程。
我尝试了如下系统:
- 创建一个空矩阵
- 对每个方程式进行迭代。对于每个方程,将其转换为矩阵的一行,并检查矩阵的秩是否通过添加新行而增加
- 如果秩增加,则将行附加到空矩阵
- 打印生成的矩阵
如果做得正确,这应该会给出所有唯一的方程。但是,numpy.linalg.matrix_rank()不适用于sympy符号。不幸的是,我有大约20个用符号表示的常数。
如何找到我唯一的方程式?这些都能解决我的问题:
- 得到非退化方程的显式解
- 一种计算矩阵秩的方法,矩阵中有符号
- 或者,sympy是否具有用于确定sympy方程是否是其他sympy方程的线性组合的内置功能
Sympy有一个带有rank
方法的Matrix
类:
In [1]: x, y = symbols('x y')
In [2]: M = Matrix([[x, y], [2*x, 2*y]])
In [3]: M
Out[3]:
⎡ x y ⎤
⎢ ⎥
⎣2⋅x 2⋅y⎦
In [4]: M.rank()
Out[4]: 1
我不知道具体的实施情况,可能会很慢。因此,您可能想要改进您的算法,例如,通过将矩阵简化为行-梯队形式
一种更系统的方法,它不依赖于多项式可以计算并使用Gröbner基。