我有一些scipy eigh函数的问题,返回正半定矩阵的负特征值.以下是MWE.
该hess_R函数返回一个正半定矩阵(它是秩1矩阵和对角矩阵的总和,两者都带有非负数项).
import numpy as np
from scipy import linalg as LA
def hess_R(x):
d = len(x)
H = np.ones(d*d).reshape(d,d) / (1 - np.sum(x))**2
H = H + np.diag(1 / (x**2))
return H.astype(np.float64)
x = np.array([ 9.98510710e-02 , 9.00148922e-01 , 4.41547488e-10])
H = hess_R(x)
w,v = LA.eigh(H)
print w
Run Code Online (Sandbox Code Playgroud)
印刷的特征值是
[ -6.74055241e-271 4.62855397e+016 5.15260753e+018]
Run Code Online (Sandbox Code Playgroud)
如果我更换np.float64与np.float32在return语句hess_R,我得到
[ -5.42905303e+10 4.62854925e+16 5.15260506e+18]
Run Code Online (Sandbox Code Playgroud)
相反,所以我猜这是一种精确的问题.
有没有办法来解决这个问题?从技术上讲,我不需要使用eigh,但我认为这是我的其他错误的根本问题(取这些矩阵的平方根,得到NaN等)
> x <- 1.00042589212565
> x
[1] 1.000426
Run Code Online (Sandbox Code Playgroud)
如果我想打印确切的值x,我该怎么做?
对不起,如果这是一个愚蠢的问题.我试着谷歌搜索"R"和"确切"或"圆形",但我得到的是关于如何舍入的文章.
先感谢您!
我想BigDecimal用科学记数法打印,以便在小数点后面有5位数字.例如:-3.12345E-51,9.12345E100
.setScale()在这种情况下不起作用,因为我事先并不知道科学记数法中的数字的指数.而且,BigDecimal似乎没有getExponent()办法.
实现这一目标的最佳方法是什么?先感谢您.