要找到所需的确切解决方案,numpy和scipy可能不是最佳工具。他们的算法通常在浮点中工作,并且不能保证给出 确切的 答案。
您可以sympy
用来获取此问题的确切答案。中的Matrix
类sympy
提供了nullspace()
返回空空间基向量列表的方法。这是一个例子:
In [20]: from sympy import Matrix, lcm
In [21]: A = Matrix([[1, -1, 0], [0, 2, -1], [2, 0, -1]])
获取空空间中的向量。 nullspace()
返回列表;此代码假定A的等级为2,因此列表的长度为1:
In [22]: v = A.nullspace()[0]
In [23]: v
Out[23]:
Matrix([
[1/2],
[1/2],
[ 1]])
在中找到值的分母的最小公倍数,v
以便我们可以将结果缩放为最小整数:
In [24]: m = lcm([val.q for val in v])
In [25]: m
Out[25]: 2
x
持有整数答案:
In [26]: x = m*v
In [27]: x
Out[27]:
Matrix([
[1],
[1],
[2]])
要将结果转换为整数的numpy数组,可以执行以下操作:
In [52]: np.array([int(val) for val in x])
Out[52]: array([1, 1, 2])