Mik*_*and 5 python numpy linear-algebra linear-programming scipy
我正在尝试编写一个简单的Simplex算法,第一步是找到一个基本的可行解决方案:
我知道解决方案将涉及使用scipy.linalg.svd(或scipy.linalg.lu)和一些numpy.argwhere/ numpy.where魔术,但我不确定如何.
有没有人有一个纯粹的Numpy/Scipy实现找到基础(步骤1),或者甚至更好,以上所有?
例:
>>> 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}
Run Code Online (Sandbox Code Playgroud)
等等.
QR分解为A 的列空间提供正交基础:
q,r = np.linalg.qr(A)
Run Code Online (Sandbox Code Playgroud)
如果等级A为n,则第一n列q形成列空间的基础A.