使用双类型我制作了三次样条插值算法。这项工作看起来很成功,但是当计算出非常小的值时,存在大约 6% 的相对误差。
双数据类型是否足以进行准确的科学数值分析?
使用双类型我制作了三次样条插值算法。这项工作看起来很成功,但是当计算出非常小的值时,存在大约 6% 的相对误差。
双数据类型是否足以进行准确的科学数值分析?
对于大多数应用,Double 具有足够的精度。当然它是有限的,但总是有可能通过使用糟糕的算法来浪费任何数量的精度。事实上,这应该是你的第一个嫌疑人。仔细检查您的代码,看看您是否正在做一些让舍入错误累积得比必要更快的事情,或者是有风险的事情,例如减去彼此非常接近的值。
科学数值分析很难做到正确,这就是我将其留给专业人士的原因。您是否考虑过使用数字库而不是自己编写?Eigen 是我目前最喜欢的:http ://eigen.tuxfamily.org/index.php?title=Main_Page
我总是手头有最新的数字食谱(nr.com),它确实有一个关于插值的优秀章节。NR 有一个限制性许可证,但作者知道他们在做什么,并就每种数值技术提供简洁的文章。其他要查看的库包括:ATLAS 和 GNU Scientific Library。
要回答你的问题,对于大多数科学应用来说,加倍应该绰绰有余,我同意以前的海报,它应该像一个算法问题。您是否考虑过发布您正在使用的算法的代码?
如果 double 足以满足您的需求,则取决于您使用的数字类型。正如 Henning 建议的那样,最好查看一下您正在使用的算法并确保它们在数值上是稳定的。
首先,这里有一个很好的加法算法:Kahan summation algorithm。
双精度主要适用于任何问题,但如果多项式或函数快速振荡或重复或具有相当高的维度,则三次样条将无法正常工作。
在这种情况下,最好使用勒让德多项式,因为它们可以处理指数的变体。
举个简单的例子,如果您使用欧拉、梯形或辛普森规则在三阶多项式内进行插值,则不需要很大的采样率来获得插值(曲线下的区域)。但是,如果将这些应用于指数函数,则可能需要大大增加采样率以避免损失很多精度。Legendre多项式可以更容易地满足这种情况。