5

私が興味を持っているいくつかの本当に面白い動作を特定しました。最終的には、科学計算の理由から完全に再現可能なコードが必要です。

とにかく、これは出力付きのコードのスニペットです。ご覧のとおり、同じ計算でもわずかに異なる結果が得られます。

np.random.seed(0)
x = np.random.randn(100)
P = np.random.randn(100, 100)

for i in range(10):
    a1 = P.dot(x)
    a2 = P.dot(x)
    b1 = x.dot(a1)
    b2 = x.dot(a2)
    if b1 != b2:
        break

print 'i = {}'.format(i)
print np.abs(a1 - a2).max()
print np.abs(b1 - b2)
print b2

出力は次のとおりです。

i = 1
0.0
1.7763568394e-15
-10.2398857939

私の 2 つの変数は、 1 次元xP2 次元の numpy 配列です。しかし、どういうわけか、同じ簡単な計算でも異なる結果が得られます。さらに、ループの反復ごとに、同じ結果が得られない試行は異なります。この場合、たとえば、i = 0試行では問題はありませんでしたが、計算では について同じ結果が得られませんでしたi = 1

a1興味深いことに、中間値をとに保存しないとa2、結果は同じになります。

for i in range(10000):
    b1 = x.dot(P.dot(x))
    b2 = x.dot(P.dot(x))
    if b1 != b2:
        break

print 'i = {}'.format(i)
print np.abs(b1 - b2)

出力あり:

i = 9999
0.0

ここで何が起こっているのか分かりますか??

4

0 に答える 0