不确定我想做的是不是有意义。我正在用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++中创建的近似值的误差曲线图。在这种环境下,系数只会以双精度计算。
我认为这个测试是有意义的??我希望我的近似值精确到大约机器精度,但我如何绘制误差曲线?
感谢您的阅读。
发布于 2012-02-29 13:19:14
首先,在包含Pi/2或-Pi/2的范围内绘制approx[x]/Cos[x] - 1只会导致问题,因为在这两个点上Cos[x]会变为零。在这一点上,approx非常接近于零,但并不完全是这样。此外,在除法时将Cos[x]转换为数值零之前,会将其代数求值为零,因此您会看到这些点处的峰值。
其次,当在更敏感的区域进行绘图时,
Plot[approx[x]/f[x] - 1, {x, 0, 0.5}, WorkingPrecision -> 30, PlotRange -> All]我得到了

这正是我在接近机器精度时所期望的。每个峰值大致相当于一个比特。
最后,如果您想要在整个感兴趣的领域中有一个良好的近似值,我不会使用泰勒展开,它只在扩展点附近的邻域中有效。相反,我会使用Chebyshev polynomials查看min-max approximation。例如,将契比雪夫级数和泰勒级数展开到14项,给出了

在这里我绘制了每个序列和Cos之间的绝对差异。从左边的图中可以看到,Chebyshev级数总体上比右边的Taylor级数表现得更好。
https://stackoverflow.com/questions/9492273
复制相似问题