提高numpy.dot的精度(python)

3 投票
1 回答
3828 浏览
提问于 2025-04-17 11:05

我正在尝试模拟一个特定的物理系统。为了传播解决方案,我需要能够相乘一些行列式为1的矩阵,这些矩阵描述了系统的每个部分。在下面的代码中,T(变量)是一个二维矩阵,且它的行列式det(T) = 1,i表示区域编号,其他的就不重要了。

当我运行这个代码处理超过30个区域的系统时,最后得到的Msys的行列式不再等于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

1 个回答

6

所有浮点数运算的精度都是有限的,而且误差会逐渐累积。你需要决定一下,什么样的精度对你来说是“足够好的”,或者说误差累积到什么程度是“可以忽略不计”的。如果float64的精度对你来说不够,可以试试float128。你可以通过下面的方式来查看不同浮点数类型的精度:

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

关于浮点数运算还有很多信息可以了解:每个计算机科学家都应该知道的浮点运算知识

撰写回答