如何在mathematica中创建合理的错误图?

mar*_*ark 4 wolfram-mathematica

不确定我想要做的事情是否有意义.我正在使用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]
Run Code Online (Sandbox Code Playgroud)

我可以提高a[k]计算系数的精度.

a[k_] := N[(-1)^k/(2*k)!,30]
Run Code Online (Sandbox Code Playgroud)

获得一个更明智的情节,但这违背了我的原型代码的目的.因为最终我想绘制我在C++中创建的近似值的误差图.在该环境中,系数仅以双精度计算.

我认为这个测试有道理吗?我希望我的近似精确到机器精度,但我如何绘制误差曲线?

谢谢阅读.

rco*_*yer 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]
Run Code Online (Sandbox Code Playgroud)

我明白了

在此输入图像描述

这正是我在机器精度附近操作时所期望的.每个尖峰大致相当于一个位.

最后,如果你想要对整个感兴趣的领域进行良好的近似,我不会使用泰勒扩展,这种扩展仅在扩展点周围的邻域中很好.相反,我将使用切比雪夫多项式来研究最小 - 最大近似.例如,将切比雪夫系列和泰勒系列分为14个项

在此输入图像描述

我正在绘制每个系列和之间的绝对差异Cos.从左边的情节可以看出,切比雪夫系列的整体表现要好于右边的泰勒系列.