如何从数学公式的角度优化算子精度
对于一些数学算子,常常采用泰勒级数用无限项连加式来拟合,这些相加的项由函数在某一点的导数求得,通过函数在自变量零点的导数求得的泰勒级数又叫做麦克劳林级数。在数学上,对于一个在实数或复数邻域上,以实数作为变量或以复数作为变量、无穷可微的函数f(x),它的泰勒级数是以下这种形式的幂级数:
这里,表示n的阶乘,而表示函数在点处的n阶导数。
对于函数f(x),虽然它们的展开式会收敛,但函数与其泰勒级数也可能不相等。实际应用中,泰勒级数需要截断,只取有限项,可以用根据误差的上限选取泰勒展开的阶数。函数f(x)在进行泰勒展开的时候,在展开点附近拟合误差比较小,一般定义域离展开点越远,收敛越慢,误差越大。为了简化级数表达式,一般函数往往采用在处进行泰勒展开(即麦克劳林展开)来拟合,例如:
它们分别采用6阶麦克劳林展开和7阶麦克劳林展开即可达到精度要求。
而有些函数在某些区间的收敛十分缓慢,如下图所示为arcsin函数的拟合曲线,当x接近1的时候拟合误差很大,无法直接采用麦克劳林展开来近似表示(由于收敛过慢即使提高展开阶数也达不到精度要求),因此需要针对这类函数进行分区间拟合。因此针对这种情况,为了达到精度的要求,可以采用分区间在不同的展开点进行泰勒展开,或者将精度达标的展开区间的拟合结果通过数学公式映射到其他区间。
接下来以arcsin函数为例,介绍了三种解决拟合精度问题的方法。
关于arcsin x:
反正弦函数arcsin x是正弦函数sin x将值域限制在[-π/2, π/2]的反函数,定义域区间为 [-1, 1],关于原点对称,为奇函数。其麦克劳林展开的无穷级数表示为:
除此之外,它还满足:
方法1:区间映射
由于 y = arcsin x 在零点附近收敛很快,拟合精度很高,因此可以考虑利用公式将零点附近的区间映射到x=1附近的区间。经过分析arcsin x的相关公式,可用于进行区间映射过程。将区间分界点选在 的时候,正好可以利用上述公式将区间的麦克劳林展开的拟合结果映射到区间。如下图所示为拟合的结果:
但当区间麦克劳林展开阶数小于等于13阶(7个系数)时,x在0.68到0.73左右有精度问题(即不满足万分之一的要求),如下图所示:
这时候我们首先可以考虑直接提高麦克劳林展开阶数从而降低误差。
方法2:提高泰勒展开阶数
一般情况下,我们可以直接先通过MATLAB或者OCTAVE等工具先仿真最少需要用多少阶展开可以达到精度要求,虽然展开阶数越多精度越高,但也会带来更多的乘加操作使得运行性能下降,因此需要选择满足精度要求的条件下更小的展开阶数。
在进行OCTAVE仿真的时候,如下图所示,可以看到当麦克劳林展开15阶(8个系数)时,误差全都小于万分之一的要求。
但针对有些函数在某些区间难以收敛,即使提高泰勒展开阶数也无法满足精度要求,可以再次通过区间映射方法将精度较高区间的计算结果映射到精度不达标区间(比如可以通过公式 将区间[0, 0.5]的麦克劳林展开结果映射到区间),或者在不同的展开点进行泰勒展开。接下来就介绍分区间泰勒展开的方法。
方法3:分区间泰勒展开
当对arcsin x在处进行泰勒展开时,其泰勒展开的无穷级数可以表示为:
我们可以考虑在区间[0, 0.5]继续采用麦克劳林展开来拟合,针对直接采用麦克劳林展开拟合精度较差的区间用处的泰勒展开来近似,区间的结果依旧采用将区间的麦克劳林展开结果映射得到。如下图所示红线是泰勒展开的曲线,可以看到其在0.6邻域的拟合效果很好。
通过octave分析这种方法的最大相对误差,可以得到最大误差为0.000070770,因此该方法的拟合结果均满足双万分之一的要求。
# y为arcsin x的真实值,z为拟合值
>> max(abs(y-z)./z)
ans = 0.000070770
或者我们也可以通过octave画图来看相应的误差曲线,具体代码如下:
# x是区间[0,1]上的自变量,y为arcsin x的真实值,z为拟合值,m是值全为0.0001的向量
figure
plot(x,abs(y-z)./z)
hold on
plot(x,m)
更多精彩内容可以访问昇腾开发者社区
- 点赞
- 收藏
- 关注作者
评论(0)