提高numpy.dot(python)的精度

Zyk*_*ykx 3 python numpy scipy

我正在尝试模拟某个物理系统.为了传播解决方案,我需要能够将行列式= 1的矩阵乘以描述系统的每个部分.在下面的代码中,T(变量)是一个二维矩阵,其det(T)= 1,我只是表示区域编号,其余部分是无关紧要的.

当我为具有超过30个区域的系统运行此代码时,最终的Msys不再具有determinant = 1.我在整个计算过程中检查了Msys的行列式的值,并且在前几次迭代中它是1,但随后它开始偏离.我在创建数组T时尝试放入dtype = float64,看看这是否会提高精度并阻止它崩溃,但我没有看到改进.

有没有什么方法可以编写代码来避免错误累积或我可以增加小数位数numpy存储的方式,以使错误可忽略不计的100+区域的系统.

for i in range(n):                                  
    if i == 0:                                      
        Msys = T(L[i],i,k)
    else:                                           
        Msys = numpy.dot(T(L[i]-L[i-1],i,k), Msys)
return Msys
Run Code Online (Sandbox Code Playgroud)

Bi *_*ico 6

所有浮点运算都具有有限的精度,并且误差会累积.您需要确定多少精度"足够好"或多少错误累积"可忽略不计".如果float64对您来说不够精确,请尝试使用float128.你可以找到float类型的精度,如下所示:

In [83]: np.finfo(np.float32).eps
Out[83]: 1.1920929e-07

In [84]: np.finfo(np.float64).eps
Out[84]: 2.2204460492503131e-16

In [85]: np.finfo(np.float128).eps
Out[85]: 1.084202172485504434e-19
Run Code Online (Sandbox Code Playgroud)

这里有关于浮点运算的更多信息:每个计算机科学家应该知道的浮点运算