C++数值分析准确的数据结构?
采用双类型三次样条插值算法。 这项工作似乎是成功的,但当计算非常小的值时,相对误差在6%左右C++数值分析准确的数据结构?,c++,numerical-analysis,C++,Numerical Analysis,采用双类型三次样条插值算法。 这项工作似乎是成功的,但当计算非常小的值时,相对误差在6%左右 double数据类型足以进行精确的科学数值分析吗?double在大多数应用中具有足够的精度。当然它是有限的,但是使用一个糟糕的算法总是可能浪费任何数量的精度。事实上,那应该是你的第一个嫌疑犯。仔细看看你的代码,看看你是在做一些让舍入误差积累得比必要的更快的事情,还是在做一些危险的事情,比如相距非常近的值相减。如果双精度足以满足你的需要,这取决于你使用的数字类型。正如亨宁所建议的,最好看看你正在使用的算法
double数据类型足以进行精确的科学数值分析吗?double在大多数应用中具有足够的精度。当然它是有限的,但是使用一个糟糕的算法总是可能浪费任何数量的精度。事实上,那应该是你的第一个嫌疑犯。仔细看看你的代码,看看你是在做一些让舍入误差积累得比必要的更快的事情,还是在做一些危险的事情,比如相距非常近的值相减。如果双精度足以满足你的需要,这取决于你使用的数字类型。正如亨宁所建议的,最好看看你正在使用的算法,确保它们在数值上是稳定的
首先,这里有一个很好的加法算法:。科学数值分析很难正确,这就是为什么我把它留给专业人士。您是否考虑过使用数字库而不是编写自己的库?Eigen是我目前最喜欢的: 我手头总是有最新的Numerical Recipes nr.com,它确实有一个关于插值的优秀章节。NR有一个限制性的许可证,但作者知道他们在做什么,并对每种数字技术提供了一个简洁的书面说明。其他图书馆包括:ATLAS和GNU科学图书馆
为了回答你的问题,对于大多数科学应用来说,加倍应该足够了,我同意前面的海报,它应该像一个算法问题。您是否考虑过发布所用算法的代码?双精度最适合于任何问题,但如果多项式或函数快速振荡或重复,或维数相当高,则三次样条曲线将无法正常工作 在这种情况下,最好使用勒让德多项式,因为它们处理指数的变量
举个简单的例子,如果使用Euler、梯形或Simpson法则在三阶多项式内插值,则无需大量采样率即可获得曲线下的插值面积。但是,如果将这些应用于指数函数,则可能需要大大提高采样率,以避免失去很多精度。勒让德多项式更容易适应这种情况。u对,这是算法问题。我刚刚改变了算法,得到了更好的数据。当我使用新算法的长双重类型时,我可以得到更精确的数据。