np.linalg.solve 没有给出正确的结果

np.linalg.solve is not giving correct result

我尝试用函数 linalg.solve:

参数化具有给定基 ss 的任意 t 向量
t = np.array([0.4, 0., 0., 0., 0., 0., 0., 0.3, 0., 0., 0., 0., 0.2, 0., 0., 0.1])
ss = np.array([[1.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  1.],
           [0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.],
           [0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  0.],
           [1.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  0., -0.,  0.,  1.,  0.,  0., -1.],
           [0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.],
           [0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
           [0.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
           [0.,  0.,  0.,  1.,  0.,  0.,  0., -0.,  0.,  0., -1.,  0.,  0.,  0.,  0., -0.],
           [0.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  0.],
           [0.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0.],
           [0.,  0.,  0.,  0.,  0., -1., -0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
           [0.,  0.,  0.,  0., -1.,  0.,  0., -0.,  0.,  0.,  0.,  1.,  0.,  0.,  0., -0.],
           [1.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0., -1., -0.,  0., -1.],
           [0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., -0., -1.,  0., -0.],
           [0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., -0.,  0.,  1., -0.],
           [1.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  0., -0.,  0., -1., -0.,  0.,  1.]])

然后做:

para = sp.linalg.solve(ss, t)

print para

print np.dot(ss, para) == t

我得到了:

[ 0.175 0.-0. 0.15 -0。 0.-0. 0.125 0.-0. -0.15 0. 0.025 -0. 0. 0.075]

[真真真真真真真真真真真 真真真假]

很明显是不对的...为什么会出现这个False?

看起来是 rounding/numerical-approximation 错误:

t[-1]
Out[493]: 0.10000000000000001

np.dot(ss,para)[-1]
Out[495]: 0.099999999999999964