查找欠定线性系统中哪些变量是自由的

时间:2018-09-12 21:12:18

标签: python numpy scipy linear-algebra sympy

我的线性方程组不确定。例如,这可以通过SimPy解决,其中解决方案是一些自由变量的函数。我正在寻找的是那些自由变量。这组变量不是唯一的,但是一个选项就足够了。例如

[1  0  1] [x1] = [1]
[0  1  0] [x2] = [1]
          [x3]

在这里,x2由第二个方程式确定,x1x3都可以用作自由变量。例如,集合{x1}是解决我的问题的有效方法

找到此问题的一种方法是使用SymPy并解析解决方案以找到在其中使用了哪些变量。这相当麻烦。有没有更好的方法可以做到这一点?最好不要进行任何符号计算(返回自由变量的索引)。

在这里问了同样的问题,但没有回答,因为提问者想问其他问题:How to determine which one is free variable in the result of sympy.linsolve

他只是想为系统提供一个解决方案。我想知道自由变量,甚至不需要知道解决方案。

2 个答案:

答案 0 :(得分:2)

这类似于How can I find a basis for the column space of a rectangular matrix?,不同之处在于,您要查询的是自由变量,这些自由变量对应于我们为列空间选择基础后剩余的列。因此,集合差异将一个问题减少到另一个。这是一个矩阵稍复杂的示例:

import numpy as np
from scipy.linalg import lu
M = np.array([[1, 1, 0, 1], [0, 0, 1, 0], [0, 0, 7, 0]])
U = lu(M)[2]
basis_columns = {np.flatnonzero(U[i, :])[0] for i in range(U.shape[0])}
free_variables = set(range(U.shape[1])) - basis_columns

答案:{1, 3}

注意事项:所有这些都对浮点错误敏感,因此,如果您在输入中有确切的有理数并希望保留它们,则仍然首选SymPy。

答案 1 :(得分:0)

不确定这是否精确,但是我认为自由变量是echelon form中非关键元素及其描述的变量的任何非零系数。