我正在使用 RKF45 集成器,我在 GPU 上使用 CUDA C++ 进行了编程,并且正在思考一些问题,因为我试图追踪我的代码的一些问题。
我在计算中使用双精度值。如果机器精度是双精度,我是否可以要求我的积分器在 4 阶和 5 阶估计之间的差异 < 1 x 10 ^-16?
如果我确实将局部误差设为 10E-16 并且我积分超过例如 20,000 个时间步,那么我是否应该期待这两个数字乘积的最大全局误差:2E-12?
确实,如果是这种情况,那还不错,但是我正在尝试跟踪泄漏的来源,其中我的数字变得不切实际,并且我正在尝试排除机器精度作为该错误的根源。
编辑
我的方程式的 RHS 看起来像这样。
double frag_term = 0;
double flux = 0;
if (r == ((maxlength)-1))
flux = -km*(r)*conc[r]+2*(ka)*conc[r-1]*conc[0];
else if ( (r > ((nc)-1)) && (r != ((maxlength)-1)) )
{
frag_term = conc2[maxlength-1] - conc2[r];
flux = -(km)*(r)*conc[r] + 2*(km)*frag_term - 2*(ka)*conc[r]*conc[0] + 2*(ka)*conc[r-1]*conc[0];
}
else if (r == ((nc)-1))
{
frag_term = conc2[maxlength-1] - conc2[r];
flux = (kn)*pow(conc[0],(nc)) + 2*(km)*frag_term - 2*(ka)*conc[r]*conc[0];
}
else if (r < ((nc)-1))
flux = 0;
其中 conc 是一个浓度数组,其值我随着时间的推移进行积分, conc2 是一个部分和数组,使得 conc2[r] = 小于并包括第 r 项的所有 conc 数组项的总和。