我有代码应该返回一个表,该表具有使用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>
答案 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
库