Numpy slogdet计算错误

时间:2017-06-08 16:40:15

标签: numpy determinants

在计算Vanermonde矩阵的对数行列式时,numpy的slogdet与确切结果之间似乎存在重大差异。

我与确切的对数行列式进行比较,请参阅例如here作为证据。

看到这个的最小代码是:

A = np.power.outer(np.linspace(0,1,50),range(50))

print np.linalg.slogdet(A)[1]

s = 0
for v1 in np.linspace(0,1,50):
    for v2 in np.linspace(0,1,50):
        if v1>v2:
            s+= np.log(v1-v2)

print s

哪些事情:

-1191.88408998
-1706.99560647

我想知道是否有更准确的日志决定因素实现,我可以在这种情况下使用,但也可以在非Vandermonde矩阵情况下使用。

1 个答案:

答案 0 :(得分:0)

你可以像这样使用sympy和mpmath:

import numpy as np
import sympy as smp
import mpmath as mp

mp.mp.dps = 50 

linspace1 = list(map(smp.mpmath.mpf,np.linspace(0,1,50)))
A = np.power.outer(list(map(float,linspace1)),range(50))

first_print = smp.mpmath.mpf(np.linalg.slogdet(A)[1])
print(first_print)

s = 0
linspace2 = list(map(smp.mpmath.mpf,np.linspace(0,1,50)))
linspace3 = list(map(smp.mpmath.mpf,np.linspace(0,1,50)))
for v1 in linspace1:
    for v2 in linspace2:
        if v1>v2:
            s+= mp.log(v1-v2)

print(s)

结果

first_print = -1178.272517342130186079884879291057586669921875

s = -1706.9956064674289001970168329846189154212781094939