我正在尝试模拟某个物理系统。为了传播解决方案,我需要能够将行列式= 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
答案 0 :(得分: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
以下是有关浮点运算的更多信息:What Every Computer Scientist Should Know About Floating-Point Arithmetic