如何从数学公式的角度优化算子精度

举报
kourei 发表于 2020/03/31 10:52:18 2020/03/31
【摘要】 对于一些数学算子,常常采用泰勒级数用无限项连加式来拟合,这些相加的项由函数在某一点的导数求得,通过函数在自变量零点的导数求得的泰勒级数又叫做麦克劳林级数。在数学上,对于一个在实数或复数邻域上,以实数作为变量或以复数作为变量、无穷可微的函数f(x),它的泰勒级数是以下这种形式的幂级数:这里,表示n的阶乘,而表示函数在点处的n阶导数。对于函数f(x),虽然它们的展开式会收敛,但函数与其泰勒级数也...

对于一些数学算子,常常采用泰勒级数用无限项连加式来拟合,这些相加的项由函数在某一点的导数求得,通过函数在自变量零点的导数求得的泰勒级数又叫做麦克劳林级数。在数学上,对于一个在实数或复数0.png邻域上,以实数作为变量或以复数作为变量、无穷可微的函数f(x),它的泰勒级数是以下这种形式的幂级数:

1.jpg

这里,1.png表示n的阶乘,而3.png表示函数在点4.png处的n阶导数。

对于函数f(x),虽然它们的展开式会收敛,但函数与其泰勒级数也可能不相等。实际应用中,泰勒级数需要截断,只取有限项,可以用根据误差的上限选取泰勒展开的阶数。函数f(x)在进行泰勒展开的时候,在展开点附近拟合误差比较小,一般定义域离展开点越远,收敛越慢,误差越大。为了简化级数表达式,一般函数往往采用在5.png处进行泰勒展开(即麦克劳林展开)来拟合,例如:

6.jpg

6.png

它们分别采用6阶麦克劳林展开和7阶麦克劳林展开即可达到精度要求。

而有些函数在某些区间的收敛十分缓慢,如下图所示为arcsin函数的拟合曲线,当x接近1的时候拟合误差很大,无法直接采用麦克劳林展开来近似表示(由于收敛过慢即使提高展开阶数也达不到精度要求),因此需要针对这类函数进行分区间拟合。因此针对这种情况,为了达到精度的要求,可以采用分区间在不同的展开点进行泰勒展开,或者将精度达标的展开区间的拟合结果通过数学公式映射到其他区间。

7.png

接下来以arcsin函数为例,介绍了三种解决拟合精度问题的方法。

关于arcsin x:                                                                        

反正弦函数arcsin x是正弦函数sin x将值域限制在[-π/2, π/2]的反函数,定义域区间为 [-1, 1],关于原点对称,为奇函数。其麦克劳林展开的无穷级数表示为:

8.jpg

除此之外,它还满足:

9.png

  10.png

方法1:区间映射

由于 y = arcsin x 在零点附近收敛很快,拟合精度很高,因此可以考虑利用公式将零点附近的区间映射到x=1附近的区间。经过分析arcsin x的相关公式,11.png可用于进行区间映射过程。将区间分界点选在12.png 的时候,正好可以利用上述公式将区间14.png的麦克劳林展开的拟合结果映射到区间15.png。如下图所示为拟合的结果:

16.jpg

但当区间17.png麦克劳林展开阶数小于等于13阶(7个系数)时,x0.680.73左右有精度问题(即不满足万分之一的要求),如下图所示:

18.jpg

这时候我们首先可以考虑直接提高麦克劳林展开阶数从而降低误差。

方法2:提高泰勒展开阶数

一般情况下,我们可以直接先通过MATLAB或者OCTAVE等工具先仿真最少需要用多少阶展开可以达到精度要求,虽然展开阶数越多精度越高,但也会带来更多的乘加操作使得运行性能下降,因此需要选择满足精度要求的条件下更小的展开阶数。

在进行OCTAVE仿真的时候,如下图所示,可以看到当麦克劳林展开15阶(8个系数)时,误差全都小于万分之一的要求。

19.jpg

但针对有些函数在某些区间难以收敛,即使提高泰勒展开阶数也无法满足精度要求,可以再次通过区间映射方法将精度较高区间的计算结果映射到精度不达标区间(比如可以通过公式20.png 将区间[0, 0.5]的麦克劳林展开结果映射到区间21.png),或者在不同的展开点进行泰勒展开。接下来就介绍分区间泰勒展开的方法。

 

方法3:分区间泰勒展开

当对arcsin x22.png处进行泰勒展开时,其泰勒展开的无穷级数可以表示为:

23.png    

     我们可以考虑在区间[0, 0.5]继续采用麦克劳林展开来拟合,针对直接采用麦克劳林展开拟合精度较差的区间24.png25.png处的泰勒展开来近似,区间26.png的结果依旧采用将区间27.png的麦克劳林展开结果映射得到。如下图所示红线是泰勒展开的曲线,可以看到其在0.6邻域的拟合效果很好。

28.png

通过octave分析这种方法的最大相对误差,可以得到最大误差为0.000070770,因此该方法的拟合结果均满足双万分之一的要求。

# yarcsin x的真实值,z为拟合值

>> max(abs(y-z)./z)

ans =  0.000070770

或者我们也可以通过octave画图来看相应的误差曲线,具体代码如下:

# x是区间[0,1]上的自变量,yarcsin x的真实值,z为拟合值,m是值全为0.0001的向量

figure

plot(x,abs(y-z)./z)

hold on

plot(x,m)

更多精彩内容可以访问昇腾开发者社区

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。