如何在线性方程组中找到唯一的非退化方程



我正在使用sympy生成符号多项式方程。我有大约30个变量和大约20个常量变量。我的方程式达到的最高幂是一个平方项。

我需要取这些方程中的2^13,计算出其中有多少是唯一的(即,不是彼此的线性组合,不是退化的)。否则,我需要找到方程组产生的矩阵的秩。这些方程大多是退化的,它们是彼此的线性组合。然而,最终,我需要从数据中提取出唯一的方程。

我尝试了如下系统:

  1. 创建一个空矩阵
  2. 对每个方程式进行迭代。对于每个方程,将其转换为矩阵的一行,并检查矩阵的秩是否通过添加新行而增加
  3. 如果秩增加,则将行附加到空矩阵
  4. 打印生成的矩阵

如果做得正确,这应该会给出所有唯一的方程。但是,numpy.linalg.matrix_rank()不适用于sympy符号。不幸的是,我有大约20个用符号表示的常数。

如何找到我唯一的方程式?这些都能解决我的问题:

  1. 得到非退化方程的显式解
  2. 一种计算矩阵秩的方法,矩阵中有符号
  3. 或者,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基。

最新更新