【发布时间】:2015-02-19 10:28:06
【问题描述】:
我有一个不使用随机化的脚本,当我运行它时会给我不同的答案。我希望每次运行脚本时答案都是一样的。这个问题似乎只发生在某些(病态的)输入数据上。
sn-p 来自为线性系统计算特定类型控制器的算法,它主要由线性代数(矩阵求逆、Riccati 方程、特征值)组成。
显然,这对我来说是一个主要的担忧,因为我现在不能相信我的代码会给我正确的结果。我知道对于条件不佳的数据,结果可能是错误的,但我希望始终是错误的。为什么我的 Windows 机器上的答案并不总是相同?为什么 Linux 和 Windows 机器给出的结果不一样?
我正在使用Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win 32,Numpy 版本 1.8.2 和 Scipy 0.14.0。 (Windows 8、64 位)。
代码如下。我还尝试在两台 Linux 机器上运行代码,并且脚本总是给出相同的答案(但机器给出了不同的答案)。一个运行 Python 2.7.8,使用 Numpy 1.8.2 和 Scipy 0.14.0。第二个是使用 Numpy 1.6.1 和 Scipy 0.12.0 运行 Python 2.7.3。
我求解 Riccati 方程 3 次,然后打印答案。我每次都希望得到相同的答案,而是得到序列 '1.75305103767e-09; 3.25501787302e-07; 3.25501787302e-07'.
import numpy as np
import scipy.linalg
matrix = np.matrix
A = matrix([[ 0.00000000e+00, 2.96156260e+01, 0.00000000e+00,
-1.00000000e+00],
[ -2.96156260e+01, -6.77626358e-21, 1.00000000e+00,
-2.11758237e-22],
[ 0.00000000e+00, 0.00000000e+00, 2.06196064e+00,
5.59422224e+01],
[ 0.00000000e+00, 0.00000000e+00, 2.12407340e+01,
-2.06195974e+00]])
B = matrix([[ 0. , 0. , 0. ],
[ 0. , 0. , 0. ],
[ -342.35401351, -14204.86532216, 31.22469724],
[ 1390.44997337, 342.33745324, -126.81720597]])
Q = matrix([[ 5.00000001, 0. , 0. , 0. ],
[ 0. , 5.00000001, 0. , 0. ],
[ 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ]])
R = matrix([[ -3.75632852e+04, -0.00000000e+00, 0.00000000e+00],
[ -0.00000000e+00, -3.75632852e+04, 0.00000000e+00],
[ 0.00000000e+00, 0.00000000e+00, 4.00000000e+00]])
counter = 0
while counter < 3:
counter +=1
X = scipy.linalg.solve_continuous_are(A, B, Q, R)
print(-3449.15531628 - X[0,0])
我的 numpy 配置如下print np.show_config()
(编辑以减少问题)
【问题讨论】:
-
如果您将日志语句添加到代码中以报告各个阶段的关键变量的值,这将有很大帮助。然后你可以在不同机器生成的日志文件上运行
diff,看看代码在哪里出现了分歧。 -
我正要建议@unutbu 的提议。这应该有助于缩小问题范围。
-
我们的目标是将代码筛选成最简单的具体示例,在不同的机器上产生不同的值。
-
您的脚本在我的系统上始终给出 -305367.072356(Windows 7、Python 2.7.8 (Anaconda 2.0.1)、Numpy:1.8.1、Scipy:0.14.0)。很奇怪。
-
一个疯狂的猜测 - 底层实现是并行/多线程的吗?如果是这样,可能是一个并发错误 - 可以解释不确定的行为(但可能会看到与不同机器上的内核数量相关)?
标签: python windows numpy scipy non-deterministic