在计算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矩阵情况下使用。
答案 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