2016-07-19 23 views
2

我使用sympy来产生符号多项式方程。我有大约30个变量和大约20个常量变量。我的方程式达到的最高功率是一个平方项。如何在线性方程组中找到唯一的非简并方程

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

我尝试了系统如下:

  1. 创建一个空矩阵。
  2. 迭代每个方程。对于每个等式,将其转化为矩阵的行,并通过添加新行来检查矩阵的等级是否增加。
  3. 如果排名增加,则将该行添加到空矩阵中
  4. 打印生成的矩阵。

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

如何找到我的独特方程?所有这些都将解决我的问题:

  1. 一个明确的解决方案,使非退化的方程
  2. 一种用于评估在有sympy符号矩阵的秩的方法。
  3. 或者,sympy是否具有内置功能来确定sympy方程是否是其他sympy方程的线性组合?

回答

2

Sympy有Matrix类与rank方法:

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 

我不知道实现,这可能是缓慢的。 所以你可能想改进你的算法,例如。 G。通过保持矩阵缩减为梯队形式。

一个更系统的方法不依赖于多项式的输入顺序 可能会计算和使用一个Gröbner basis