我有一个RKF7(8)积分器,我已经用几个简单的测试功能验证了其输出。但是,当我在感兴趣的运动方程式上使用它时,局部截断误差突然很小。对于大约1e-1
的时间步,我的错误全都围绕1e-18
或1e-19
。对于简单的测试函数(到目前为止,正弦和指数),误差始终是合理的,即同一时间步长为1e-7
左右。
简单测试函数和问题函数之间的唯一区别是,这是一个巨大的代码块,例如可能有1000个不同的术语,其中一些具有相对较大的指数(例如9或10)。可能会影响精度吗?我应该更改代码以使用long double
吗?
非常有趣的问题。您面临的问题可能与浮点算法的问题(或局限性)有关。由于函数包含的数值范围很宽,因此您的计算可能会损失一些精度。通常,这些问题的形式可以是:
当您处理的数字相对于机器精度而言太大或太小时,就会发生上溢和下溢,我敢打赌,这不是您的系统中发生的情况。但是,必须考虑到乘法和除法运算会导致上溢和下溢。另一方面,由于舍入误差的原因,相加数量相差很大的数量(或相减相似数量的数量)会导致精度的严重降低。根据我在涉及大量问题的优化问题上的经验,我会说这可能是对积分器行为的合理解释。
我有两个建议给您。第一个当然是将您的数字精度提高到最大程度。这可能会有所帮助,具体取决于您的问题ill conditioned。第二个方法是使用更好的算法来执行数值方法中的总和。与天真地按顺序相加所有数字相反,您可以使用更精细的策略,将总和划分为子总和,从而有效地减少舍入误差。这些算法的显着示例是pairwise summation和Kahan summation。
我希望这个答案为您提供一些线索。祝你好运!