我正在尝试编写一个简单的单纯形算法,其第一步是找到一个基本的可行解决方案:
- 选择 A 的线性独立列的一组 B
- 将 x 中与不在 B 中的列相对应的所有分量设置为零。
- 求解 m 个所得方程以确定 x 的分量。这些是基本变量。
我知道解决方案将涉及使用scipy.linalg.svd
(or scipy.linalg.lu
) 还有一些numpy.argwhere
/ numpy.where
神奇,但我不确定到底是如何实现的。
有没有人有一个纯 Numpy/Scipy 实现来寻找基础(步骤 1),或者更好的是,以上所有内容?
Example:
>>> A
array([[1, 1, 1, 1, 0, 0, 0],
[1, 0, 0, 0, 1, 0, 0],
[0, 0, 1, 0, 0, 1, 0],
[0, 3, 1, 0, 0, 0, 1]])
>>> u, s, v = scipy.linalg.svd(A)
>>> non_zero, = numpy.where(s > 1e-7)
>>> rank = len(non_zero)
>>> rank
4
>>> for basis in some_unknown_function(A):
... print(basis)
{3, 4, 5, 6}
{1, 4, 5, 6}
等等。