如何在python中做更高精度的矩阵指数?

时间:2015-07-17 06:40:13

标签: python matrix

是否可以在Python中进行更高精度的矩阵指数?我的意思是获得比双浮点数更高的精度。

我有以下测试代码:

import sympy
from sympy import N
import random

n = 100
#A = sympy.Matrix([[random.random(),random.random()],
#                   [random.random(),random.random()]])
A = sympy.Matrix([[1,2],[3,4]])
dlt = 1000
e1 = A.exp()
e1 = N(e1, n)
ee2 = (A/dlt).exp()
ee2 = N(ee2, n)
e2 = sympy.eye(2)
for i in range(dlt):
    e2 = e2*ee2
print(N(max(e1-e2)))

理论上,最终结果应为零。有了scipy,错误大约是1e-14。

通过同意,如果矩阵类似于[[1,2],[3,4]],则前面代码的输出大约是1e-98。但是,对于随机矩阵,误差约为1e-14。 对于随机矩阵,是否有可能得到像1e-100这样的结果?

速度无关紧要。

2 个答案:

答案 0 :(得分:0)

使用java.lang.UnsatisfiedLinkError后,您处于浮点运算领域,因此您永远不会假设您将达到绝对零度。所有浮点运算都是这种情况,如here和其他许多地方所讨论的那样。唯一可靠的解决方案是包含一个适当选择的N变量和一个要检查的函数。

因此,不要检查eps定义result == 0并检查isZero = lambda val: abs(val) < eps

这是浮点运算中的普遍问题。原则上,使用isZero(result),您可以找到真正的零,因为它是代数库,而不是浮点数学库。但是,在您给出的示例中,不使用sympy(这是切换到浮点运算)会使计算速度极慢。

答案 1 :(得分:0)

我在尝试mpmath时犯了一个错误。 我再次尝试过mpmath,它是解决这个问题的完美解决方案。