【发布时间】:2019-03-11 12:49:20
【问题描述】:
我知道 SymPy 能够解决线性方程组的超定系统,但我遇到了以下问题:
让我们从有效的开始:
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)}
现在还有一个额外的等式:
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 个变量,所以我不能去通过这个手动检查哪些方程可以被删除。 (在这个玩具示例中也不会那么明显)
【问题讨论】:
-
似乎是一个错误。方法
sympy.matrices.matrices.MatrixBase.gauss_jordan_solve正在提升ValueError: Linear system has no solution,它应该能够解决欠定和超定系统(所以要么在实现中出现问题,要么在文档中出现问题)。 -
为什么使用
linsolve而不是rref?
标签: python sympy equation-solving