SymPy: 解决超定线性方程组问题

3
我知道SymPy能够解决超定线性方程组,但我遇到了以下问题:
让我们从一些可行的内容开始:

equation

from sympy import *
x, y, z = symbols('x y z')
matrix = Matrix([
    [1, 0, 0, symbols('A')],
    [0, 1, 0, symbols('B')],
    [0, 0, 1, symbols('C')]])
linsolve(matrix, (x,y,z))

输出: {(A, B, C)}

现在加入一个额外的方程:

enter image description here

from sympy import *
x, y, z = symbols('x y z')
matrix = Matrix([
    [1, 0, 0, symbols('A')],
    [0, 1, 0, symbols('B')],
    [0, 0, 1, symbols('C')],
    [2, 1, 0, symbols('D')]])
linsolve(matrix, (x,y,z))

输出:EmptySet()

虽然显然仍然存在解决方案,但不再有任何输出。例如,Wolfram Alpha仍将呈现此解决方案:

输入:

1x+0y+0z=A, 0x+1y+0z=B, 0x+0y+1z=C, 2x+y=D

输出:

D = 2 A + B, x = A, y = B, z = C

在这个例子中,显然最后一个方程不需要用来求解x、y、z,但问题是我必须解决成千上万个这样的系统,每个系统最多有14个变量,所以我不能手动检查哪些方程可以被省略。(这并不像这个玩具例子中那么明显)

2
似乎是一个漏洞。方法 sympy.matrices.matrices.MatrixBase.gauss_jordan_solve(https://docs.sympy.org/latest/modules/matrices/matrices.html?highlight=gauss_jordan_solve#sympy.matrices.matrices.MatrixBase.gauss_jordan_solve)会引发 ValueError: Linear system has no solution,而它应该能够解决欠定和超定系统(因此要么实现有问题,要么文档有误)。 - jdehesa
为什么要使用 linsolve 而不是 rref - Rodrigo de Azevedo
1个回答

0

如果您允许它解决更多的变量,它将这样做。在这里,所有的A-D都被允许,但您也可以只允许D:

>>> linsolve(matrix, (x,y,z)+var("A:D"))
{(-B/2 + D/2, B, C, -B/2 + D/2, B, C, D)}

您还可以探索使用connected_components来分离不依赖于其他方程的方程,就像solve一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接