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++中创建的近似值的误差图.在该环境中,系数仅以双精度计算.
我认为这个测试有道理吗?我希望我的近似精确到机器精度,但我如何绘制误差曲线?
谢谢阅读.
首先,绘制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.从左边的情节可以看出,切比雪夫系列的整体表现要好于右边的泰勒系列.
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |