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
我尝试用函数 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