Numpy-slogdet计算错误

Numpy-slogdet计算错误,numpy,determinants,Numpy,Determinants,在计算Vanermonde矩阵的对数行列式时,numpy的slogdet与精确结果之间似乎存在重大差异 我将其与精确的对数行列式进行比较,参见eg以获得证明 看到这一点的最低代码是: 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):

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

我将其与精确的对数行列式进行比较,参见eg以获得证明

看到这一点的最低代码是:

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矩阵情况下使用。

您可以像这样使用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)
结果
谢谢,但这两个数字仍然相差50%左右,你知道为什么吗?@j_uuuuux的预期值是多少吗?1706.995是使用vandermonde矩阵特定公式得到的实际值,但slogdet与1706相差大约50%。272@j__我再次更新了答案,请告诉我这些值是否正确!我不认为OP在抱怨迭代解;关闭的是
slogdet
。它速度更快,但不能处理行列式非常小的较大数组。而
mpmath
slogdet
没有任何作用。这是通过使用float64编译的LAPACK函数计算的。对于N=10,值匹配,正如
np.log(np.det(a))
一样。可能是N=30时,
det(A)
太小了,甚至
slogdet
都无法处理。
first_print = -1178.272517342130186079884879291057586669921875

s = -1706.9956064674289001970168329846189154212781094939