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

Python 找出欠定线性系统中哪些变量是自由的,python,numpy,scipy,linear-algebra,sympy,Python,Numpy,Scipy,Linear Algebra,Sympy,我有一个欠定的线性方程组。例如,这可以通过SimPy解决,其中的解决方案是一些自由变量的函数。我要找的是,哪些是自由变量。这组变量不是唯一的,但一个选项就足够了。比如说 [1 0 1] [x1] = [1] [0 1 0] [x2] = [1] [x3] 这里,x2由第二个方程确定,并且x1或x3可以用作自由变量。例如,set{x1}就是我问题的有效解决方案 找到这一点的一种方法是使用SymPy并解析解决方案,以找到其中使用了哪些变量。这相当麻烦。有更好的方法吗?最

我有一个欠定的线性方程组。例如,这可以通过SimPy解决,其中的解决方案是一些自由变量的函数。我要找的是,哪些是自由变量。这组变量不是唯一的,但一个选项就足够了。比如说

[1  0  1] [x1] = [1]
[0  1  0] [x2] = [1]
          [x3]
这里,
x2
由第二个方程确定,并且
x1
x3
可以用作自由变量。例如,set
{x1}
就是我问题的有效解决方案

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

这里提出了相同的问题,但没有回答,因为提问者想问其他问题:

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

这与类似,只是您需要自由变量,它对应于我们为列空间选择基础后保留的列。因此,集合差将一个问题转化为另一个问题。下面是一个略为复杂的矩阵示例:

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仍然是首选

我不确定这是否准确,但我认为自由变量是指任何变量中非关键元素的非零系数,以及它所描述的变量。

x3的方程式是什么?@EPo抱歉,我的矩阵不正确。我修复了它,现在下面的评论是正确的
x2=1
x1+x3=1
,因此
x1
x3
都可以自由选择