也不要被计算机显示的精度误导,并记住错误不会以相同的方式叠加,具体取决于您对相同值的计算。
考虑以下:
import numpy as np # Personnal comfort, not relevant here.
dt = 0.2
n = 100
add_time, mul_time = np.zeros(n), np.zeros(n)
for i in range(n):
if i == 0:
add_time[i], mul_time[i] = 0.2
else:
add_time[i] = add_time[i-1] + dt
mul_time[i] = (i-1)*dt
add_time[-5:], mul_time[-5]
这导致以下情况:
(array([ 19.2, 19.4, 19.6, 19.8, 20. ]), array([ 19.2, 19.4, 19.6, 19.8, 20. ]))
但出于演示目的,我打印了以下内容:
print "add_time: {0:18.18f}\n {1:18.18f}\n {2:18.18f}\n {3:18.18f}\n {4:18.18f}\n mul_time: {5:18.18f}\n {6:18.18f}\n {7:18.18f}\n {8:18.18f}\n {9:18.18f}\n".format(add_time[-5], add_time[-4], add_time[-3], add_time[-2], add_time[-1], mul_time[-5], mul_time[-4], mul_time[-3], mul_time[-2], mul_time[-1])
add_time: 19.199999999999963762
19.399999999999963052
19.599999999999962341
19.799999999999961631
19.999999999999960920
mul_time: 19.200000000000002842
19.400000000000002132
19.600000000000001421
19.800000000000000711
20.000000000000000000
我最初的猜测也是这很好用,因为 dt 设置为 0.2 的值,但由于浮点精度,你总是会出现舍入错误。但是,如果您可以通过最少的操作提前存储您的值,就像这个简短示例中的时间步长一样,请执行此操作。操作次数越少,误差越小。
编辑:从打印的数组中减去预期值时,可以注意以下简单精度:
add_time: -0.000000000000035527
0.000000000000035527
0.000000000000039080
0.000000000000039080
0.000000000000039080
mul_time: 0.000000000000003553
0.000000000000003553
0.000000000000000000
0.000000000000000000
0.0000000000000000000000000
我们处于精确设置中,其中的错误甚至与打印无关。因此,我实际上建议在每次更改时间步时设置一个标志,并使用以下内容计算新的时间步,例如:
tn=to+i∗dtn
在哪里to是时间步长改变的时间,dtn新的时间步长和i使用这个新值的迭代次数。