提高numpy.dot(python)的精度

提高numpy.dot(python)的精度,python,numpy,scipy,Python,Numpy,Scipy,我试图模拟一个物理系统。为了传播解,我需要能够将描述系统每个部分的行列式=1的矩阵相乘。在下面的代码中,T(变量)是一个det(T)=1的二维矩阵,我只表示区域编号,其余的与此无关 当我为超过30个区域的系统运行此代码时,最终的Msys不再具有行列式=1。在整个计算过程中,我检查了Msys的行列式值,在最初的几次迭代中它是1,但随后它开始偏离这个值。在创建数组T时,我尝试过放置dtype=float64,以查看这是否会提高精度并阻止它崩溃,但我没有看到任何改进 是否有任何方法可以编写代码以避免错

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

当我为超过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

所有浮点运算的精度都是有限的,并且错误会累积。您需要确定多少精度是“足够好”或多少误差累积是“可忽略的”。如果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

这里有更多关于浮点运算的信息:

这里肯定有很多浮点问题。我记得一些例子,你可以证明2个方程是相等的。只是在其中一个等式中,他们得到了错误,因为他们用一个非常非常小的数字进行了除法(正如大多数科学计算教科书所述)。还要记住机器ε(实际上有一个计算机可以表示的最小数).这些仍然不够准确,但我找到了另一个名为mpmath的模块,可以让你选择你想要的预测。谢谢你的帮助!如果它是一个选项,具有任意精度谢谢!最终使用了作为sympy一部分的mpmath。