分享

从「如何用多项式函数拟合ln(x)」到「泰勒展开」

 huyanluanyuya 2020-05-24

一、引言

让我们来看看下面几个多项式函数对  的拟合。

1、一号选手 

黑线为ln(x)

看起来一号选手仅在  拟合得比较好,其余地方便不尽如人意。

2、二号选手 

黑线为ln(x)

看起来二号选手在  都拟合得很好呢,其余地方也总体还行。

3、三号选手 

黑线为ln(x)

三号选手简直要逆天了,代入  ,得到  ,误差小于万分之一!

即使代入  这种远到逆天的值,误差也不超过1%的。

或许下一张图会让你感到更震撼一点:

红线为ln(x),蓝线为多项式3(是不是几乎看不到红线了吧)

啊,这个放缩太紧了……这样下去ln(x)会坏掉……这样不可以(划掉)

二、正文

0、前言

相信读者看到这里时,一定会对这些奇怪的系数感到迷惑,不知道这些系数是怎么构造出来的。但是放心,当你看完本文后,你就会明白这背后的原理竟然是如此地简单,你完全可以仿照我的方法,构造出精度更高(次数更高)的放缩。

1、引子

如果了解对数平均不等式(ALG不等式)的同学,想必不会对一号选手  陌生。因为我们证明ALG不等式时就构造出了  这个不等式。

那么,问题来了:为什么不是  呢?这个函数在  附近也有很高的精度啊。

事实上,需求决定工作。在讨论这个问题前,我们应该先弄清楚——我们究竟想要什么样的函数?然后对着需求找条件,问题自然迎刃而解了。

2、我们想要什么函数?

①首先,我们想要这个函数不出现ln()、e这种超越数、不好计算的东西,尽可能地只有整数相除这种简单的有理数计算。例如ln(2)是比较难计算的,ln(e)=1虽然是有理数,但是e不是。综上考虑,只有ln(1)=0既满足ln(1)=0是有理数,又满足自变量1是有理数。所以,我们选择在x=1附近找拟合函数。

②我们希望这个函数是「多项式除以多项式」型。

这样的话,我们计算时总是做有理数的加减乘除问题,比较简单。

③我们希望这个函数精度尽可能地高。

对于一个「n次多项式除以m次多项式」型的函数,一般形式是:

考虑到ln(x)增长是很缓慢地,所以我们希望分子次数与分母次数相等,即满足  ,这样增长趋势就会与ln(x)相接近。

④我们希望这个函数在比较远处依然能维持精度。

在前面说的n=m这个前提下,想要更高的精度,我们就应该引入一个叫「泰勒展开」的东西了。具体这是什么东西,请读者继续看下文详解。

3、泰勒展开

对于一个函数,我们想要找到其的一个近似函数,我们一个很自然的想法就是取切线。如下图,在x=0处取e^x的切线,其紧邻处拟合程度良好

但是这还远远不够,因为距离稍微大一点后,这个函数的拟合程度就相当地差了。

我们试图延续取切线的思想,这就自然地引入了泰勒展开。

注意到切线对应的是  的斜率为0,即一阶导数为0,那么我们如果构造一个函数,让其二阶导数也为0,那么精度会不会提高呢?

对此,有个直观的理解——如果两个函数[1]零阶导、一阶导、二阶导、……n阶导都相等,那么这两个函数至少在某个邻域内是十分近似的,而且随着n的增大,这个邻域会扩大(当然,不一定能无限扩大,有个叫收敛域的玩意)。就好比:如果你玩游戏,你的分段和某大佬一样,英雄胜率和他基本一样,英雄池和他基本一样,出装套路基本一样,操作意识基本一样,那么你和这个大佬的实力基本上是很相近的。

让我们试试:

设  ,其中a为待定常数,试求合适的a使得 

(因为取的是切线,所以  是显然地)

解:  ,故 

所以:  即为所求

让我们看看,如下图,确实精度有明显提高。

蓝线为1+x+x^2/2,显然精度提高了

虽然按照这个思路下去,我们可以求出任意项。而且可以预见的是:精度会随着项数的提升而提升。然而,一项一项地求总是一件很烦人的事情,我们试图归纳总结出一个通项。试试看:

(2.3.1)式是被人们称为「麦克劳林展开」的东西。如果要严格讨论这里的「≈」号的具体含义,我们会涉及到诸如「收敛域」、「余项」等繁琐的东西。因此,我们这里不去严格证明它,而是取从直观的角度说明它。

观察(2.3.1)式,代入x=0,含  的项都为0,发现左右两端是相等的。

而左右求一阶导后,左右都是  ,也是相等……

求n次导后,  求n次导为  (这也是分母凑  的原因),左右依然相等。

因此,我们可以认为(2.3.1)式是f(x)的一个近似展开式。

推广地,在  处展开,有:

其中(2.3.2)式被人们称为「泰勒展开」。它能够满足尽可能高精度地拟合函数的要求。

4、尝试构造

学会了泰勒展开后,我们很兴奋,事实上,容易证明(2.4.1)式是成立的:

因此,我们尝试对ln(x)进行泰勒展开——

我们发现效果非常不理想,这个函数非常地“飘”,这是因为泰勒展开  幂越来越高,函数就会越来越“不稳定”。事实上,可以证明这一泰勒展开式的收敛域只有  ,大于2后,函数就飘走了……

为了克服这一困难,想到之前需求②,我们使用形如(2.2.1)的「多项式除以多项式」函数,并且结合我们的需求③,我们要求它分子分母次数相同(这样就近似于常数,函数就不会“飘”),即满足下式子——

5、一种思路

形式的确找到了,但是我们这里有一串待定系数,这一点是十分烦人的。回想起前面泰勒展开的知识,我们只能将其展成一串次数越来越高的多项式,如何才能展开成这种形式呢?

我们想到一个方法(虽然不是最终方法):

作一个分式线性映射: 

易见这一分式线性映射将 

就有 

将其用(2.4.1)式展开,就有

3阶展开效果如下图所示——

(上方红线为ln(x),黄线为最终思路展开2阶  ,下方红线为本思路展开3阶  )

上方红线为ln(x),黄线为最终思路展开2阶,下方红线为本思路展开3阶。可以看出:本思路虽然简单,但精度略逊一筹

6、另一种更好的思路(最终思路)

事实上,上式采用分式线性映射换元是具有技巧性的,其实也是本文写到一半(都把最终结果图做出来了)突发奇想做出来的。虽然最终结果容易计算出一般地表达式,但是精度不足。我们希望找到一个最高精度的逼近方式,这也是开头引言用的那三个函数的构造方式。

我们知道,(常规方法)泰勒展开无法得到分母上有东西的情形,那么思路就很简单了——我同时乘以分母多项式的话,不就能够和泰勒展开式匹配上了吗?

试试看:

推出:

只要将(2.6.2)左式展开,匹配系数即可。

为了方便计算,可以不妨令  ,这是因为n次多项式有n个自由系数。

让我们拿n=1的情况练练手——

考虑 

自然有: 

易推知: 

因为n=1,这是在x=1的一阶泰勒展开。但是问题来了——

p是个未知数啊!

p是个未知数啊!

p是个未知数啊!

是的,p是一个未知数。那么我们该怎么办呢?其实很简单——

回归到一阶泰勒展开的几何意义,一阶泰勒展开相当于求切线。我们自然希望切线越直越好,也就是说,如果能取一个合适的p,使得其二阶导为0的话,这个切线就会很直,那么就最满足我们的需求。

回归到这个问题:本质上就是令  ,解出  。

将  回代,得到  。

根据公式(2.3.2),我们得到了 

即:

相信你有些明白了,让我们试试n=2——

考虑 

自然有: 

易推知: 

因n=2,泰勒展开2阶,有两个未知数p、q,令3、4阶导为0,即:

容易解出:p=4,q=1

得: 

故: 

即:

对于任意正整数n——

这个思路的缺点就在于——虽然有着较高精度,但是n比较大时计算起来很复杂。下面的推导给出了一个通过计算机求系数的办法,不过手算起来比较难受。可以使用网上一些软件辅助求解会相对简单。总得来说意义不大,如果要比较高的精度,推荐使用上一个思路多展开几阶。

考虑:

 ,其中 

令  ,则为 

第一部分:

其中 

第二部分:

两者相乘,计算  项:

①若 

 系数为 

交换一下求和顺序: 

②若 

 系数为 

交换一下求和顺序: 

令  项到  项为0,即可得到各项系数。

总而言之,分母系数由n元方程组(不妨设  )确定:

分子系数则是:

总之,这个计算量很大,如果不借助计算机的话,建议使用2.5的思路。

原文地址:https://zhuanlan.zhihu.com/p/106034544?utm_source=wechat_session&utm_medium=social&utm_oi=995745436036141056

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多