无法提高计算精度(小数位数不足)

时间:2018-11-12 03:50:14

标签: python python-2.7 rounding

我有代码应该返回一个表,该表具有使用Backwards Euler方法求解特定方程组的值。

我以0.025的时间步长编写了一个代码,它为我返回了必要的值,但是,当我增加计算量时,有时由于在末尾缺少小数点而失去了准确性。价值观。 它只是一遍又一遍地返回相同的数字。 我该怎么做才能提高准确性?我曾尝试使用十进制,但它仍会返回相同的值,其中一些精度较低

这是有效的代码:

delta3 = float(0.025)
nfinal3 = 1/0.025
ic3 = numpy.array([[1], [1]]) 
be3 = PrettyTable(['t','x','y'])
for l in range(0, int(nfinal3)):
    x3=ic3[0] 
    y3=ic3[1]
    firstline3 = -199*(x3+delta3)-198*(y3+delta3)
    secondline3 = 99*(x3+delta3)+98*(y3+delta3)
    systems3 = numpy.array([[firstline3], 
                       [secondline3]]) 
    step3 = delta3*systems3
    result3 = numpy.array([[ic3[0] + step3[0]], [[ic3[1]+step3[1]]]])
    ic3[0]=result3[0]
    ic3[1]=result3[1]
    be3.add_row([l+1, result3[0], result3[1]])
print be3[0]

这是给出不正确数字的代码

t4 = 0.01
n4 = 1/t4
ic4 = numpy.array([[1],[1]])
be4 = PrettyTable(['t','x','y'])
for q in range(0, int(n4)):
    x4=ic4[0]
    y4=ic4[1]
    firstline4 = t4*(-199*(x4+t4)-198*(y4+t4))
    secondline4 = t4*(99*(x4+t4)+98*(y4+t4))
    result4 = numpy.array([[ic4[0]+firstline4], [ic4[1]+secondline4]])
    ic4[0]=result4[0]
    ic4[1]=result4[1]
    be4.add_row([q+1, result4[0], result4[1]])
print be4

我对Python相对较新,所以我可能不了解高端概念,但是如果有人可以指出我做错了什么,或者可以使用什么好的模块或函数,我将不胜感激。 / p>

2 个答案:

答案 0 :(得分:0)

欢迎使用StackOverflow!

为了获得更高的准确性,您可以在python中使用decimal模块。只需使用with open("vip_counter.pickle", "rb")as p: counter=pickle.load() #counter is now loaded counter+=1 #increment your counter before the new filesave #your code here #save your pickle back again :) with open("vip_counter.pickle", "wb") as p: pickle.dump(p, counter) 函数(例如Decimal)而不是Decimal(0.025)来包装小数。您也可以探索文档中的操作功能。优先使用通常的操作功能。

答案 1 :(得分:0)

您可以使numpy数组存储如下的128位浮点数:result4 = np.array([[ic4[0]+firstline4], [ic4[1]+secondline4]], dtype = np.float128)。您将必须对计算中使用的所有numpy数组执行此操作。您也可以像t4 = np.array(0.01, dtype=np.float128)那样将标量设为具有128位的0维Numpy数组。然后,您只需要使用Numpy数组重写操作。 另一种选择是使用https://docs.python.org/2/library/decimal.html中的decimal