【问题标题】:SymPy: solving overdetermined system of linear equationsSymPy:求解线性方程组的超定系统
【发布时间】: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


【解决方案1】:

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

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

您也可以像solve 那样使用connected_components 进行调查,以分离出不依赖于其他方程的方程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    相关资源
    最近更新 更多