首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在mathematica中创建合理的误差图?

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

Stack Overflow用户
提问于 2012-02-29 09:15:06
回答 1查看 318关注 0票数 4

不确定我想做的是不是有意义。我正在用mathematica制作一些代码的原型,我希望有一天能用C++写。一个我只能以双精度计算的环境(因为我使用的是MS VC++编译器)。

我有一个多项式,它近似于一个函数f,我想画出误差曲线。多项式的系数已经计算到机器精度(就像C++中的情况一样)。但是当我绘制相对误差图时,我只得到了一个数值噪声图。我希望误差是一条平滑的曲线,因为多项式是泰勒多项式。如何才能获得更合理的情节?下面的代码演示了我想要做的事情,使用Cos函数作为测试用例。绘图的结果只是数字噪声。

代码语言:javascript
复制
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]的精度。

代码语言:javascript
复制
a[k_] := N[(-1)^k/(2*k)!,30]

以获得更合理的情节,但这违背了我的原型代码的目的。因为我最终想要画出我在C++中创建的近似值的误差曲线图。在这种环境下,系数只会以双精度计算。

我认为这个测试是有意义的??我希望我的近似值精确到大约机器精度,但我如何绘制误差曲线?

感谢您的阅读。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-29 13:19:14

首先,在包含Pi/2-Pi/2的范围内绘制approx[x]/Cos[x] - 1只会导致问题,因为在这两个点上Cos[x]会变为零。在这一点上,approx非常接近于零,但并不完全是这样。此外,在除法时将Cos[x]转换为数值零之前,会将其代数求值为零,因此您会看到这些点处的峰值。

其次,当在更敏感的区域进行绘图时,

代码语言:javascript
复制
Plot[approx[x]/f[x] - 1, {x, 0, 0.5}, WorkingPrecision -> 30, PlotRange -> All]

我得到了

这正是我在接近机器精度时所期望的。每个峰值大致相当于一个比特。

最后,如果您想要在整个感兴趣的领域中有一个良好的近似值,我不会使用泰勒展开,它只在扩展点附近的邻域中有效。相反,我会使用Chebyshev polynomials查看min-max approximation。例如,将契比雪夫级数和泰勒级数展开到14项,给出了

在这里我绘制了每个序列和Cos之间的绝对差异。从左边的图中可以看到,Chebyshev级数总体上比右边的Taylor级数表现得更好。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9492273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档