不确定我想要做的事情是否有意义。我正在使用mathematica中的一些代码进行原型设计,有一天我希望用C ++编写。我只能以双精度计算的环境(因为我使用的是MS VC ++编译器)。
我有一个近似于函数f的多项式,我想绘制误差曲线。已经计算出多项式的系数以达到机器精度(如C ++中的情况)。但是当我绘制相对误差时,我只是获得了数值噪声的图。我期望误差是平滑曲线,因为多项式是泰勒多项式。我怎样才能获得更明智的情节?下面的代码演示了我要做的事情,使用Cos函数作为测试用例。该图的结果只是数值噪声。
f[x_] = Cos[x]
a[k_] := N[(-1)^k/(2*k)!]
approx[x_] := Sum[a[k]*x^(2*k), {k, 0, 12}]
Plot[approx[x]/f[x] - 1, {x, -Pi, Pi}, WorkingPrecision -> 30]
我可以提高计算系数a[k]
的精度。
a[k_] := N[(-1)^k/(2*k)!,30]
获得更明智的情节,但这违背了原型代码的目的。因为最终我想绘制我在C ++中创建的近似值的误差图。在该环境中,系数仅以双精度计算。
我觉得这个测试有道理吗?我希望我的近似精确到机器精度,但我如何绘制误差曲线?
感谢阅读。
答案 0 :(得分:6)
首先,在包含approx[x]/Cos[x] - 1
或Pi/2
的范围内绘制-Pi/2
只会导致问题,因为Cos[x]
在这些点上变为零。在这些点上,approx
几乎为零,但并非如此。此外,Cos[x]
在分割时被转换为数字零,在代数上被评估为零,因此您可以看到这些点处的尖峰。
其次,当策划一个更明智的地区时,
Plot[approx[x]/f[x] - 1, {x, 0, 0.5}, WorkingPrecision -> 30, PlotRange -> All]
我得到了
这正是我在机器精度附近操作时所期望的。每个尖峰大致相当于一个位。
最后,如果你想要在整个感兴趣的领域有一个很好的近似,我不会使用泰勒展开,这只在扩展点周围的邻域是好的。相反,我会使用min-max approximation查看Chebyshev polynomials。例如,将切比雪夫系列和泰勒系列分为14个术语给出
我正在绘制每个系列与Cos
之间的绝对差异。从左边的情节可以看出,切比雪夫系列的整体表现要好于右边的泰勒系列。