方法1. 对被积函数进行积化和大红鹰dhy8055com差

当前位置:大红鹰dhy8055com > 大红鹰dhy8055com > 方法1. 对被积函数进行积化和大红鹰dhy8055com差
作者: 大红鹰dhy8055com|来源: http://www.yanhuangipr.com|栏目:大红鹰dhy8055com

文章关键词:大红鹰dhy8055com,振荡积分

  最近得空读了一些高震荡函数积分的算法,你这个积分可以用 Levin 82 年一篇论文里的算法解决。论文在 23L ...

  Levin好像就有3篇关于振荡积分的,82年的是最早的,也是Levin方法的源头。

  看了82年的那篇文章。他指出,这个基函数的选取,除了要线性无关,还要求这些基函数所构成的逼近函数要与非振荡项 f 的振荡特性是相似的

  (these functions should be suitable for approximating functions with an oscillatory nature similar to that of f)。下文中他也指出了这一点的重要性,好的基函数对于大范围的积分或者无穷区间的积分有着较好的逼近效果(Inmanycasesaclever choiceofthebasisfunctions{Uk}canyieldaverygoodapproximationtothe integral overalargeoreveninfiniteinterval)。其实这句话很容易误解,我在注释中会加以说明一下

  。后面他又指出,基函数一般可以用多项式,或者B样条等有限支撑基。并且对于上面提到巧妙选取基函数的观点,他给出了一个例子(论文中的

  由于Levin的方法本质上是一种配置法,因此配置点的选取就显得较为重要了。由于无论什么配置法都有一个共同特性,那就是

  你就会明白这一点)——这也正是Levin方法的的原理所在。因此,如果配置点选取的地方恰好是

  ,那么效果就比其他平凡点要好了(这些特殊点左右附近都会出现振荡)。根据逼近函数论,一般来说Chebyshev多项式零点会是一个较好的选择。另外一个问题就是配置点的个数问题,一般我们会认为逼近的程度跟取的项数有关,那肯定会是节点越多,逼近程度越好啊。其实我个人认为,使用配置点法对振荡函数进行函数逼近,其逼近误差并不是随着节点增多而减少,而是振荡的(而且如果配置点选的不是“那么好”的话,误差反而会越来越大)。这说明,如果振荡函数振荡得很厉害(振幅),或是振荡频率很大,节点位置选取是最重要的,节点个数是第二重要的。注释:

  [2] 这里的“alargeoreveninfiniteinterval”指的是本质上的高速振荡范围,而不是单纯的表面上的积分区间。因为积分区间可以通过线性或非线性变换从无穷到有限进行转换的。比如本帖的第一个积分,积分区间(0,1)其实表面上不是无穷的,但是由于在0附近的振荡非常密集和快速(从解析或者绘图都能看出),进行指数变换x=exp(y)后,发现和无穷区间的积分是本质上一致的(这一过程就相当于将0附近的函数特性变换到无穷远处)。

  Levin好像就有3篇关于振荡积分的,82年的是最早的,也是Levin方法的源头。

  Levin 的确有 3 篇,分别发表于 82、96、97 年,其中,96 年那篇(就是kaaaf123提供的那篇)是对82年那篇的推广,适用的震荡因子变得更广,尤其是支持贝塞尔高震荡因子。97年那篇主要是对96年那篇的性能做了分析,主要是分析了精度。

  基函数的选取,确实很重要。最早有一个 Filon 算法,就是用的样条内插,再到后面,B 样条也用到了。Chebyshev多项式作为基函数应该是不错的选择,有专门针对 Chebyshev多项式的论文。

  关于你第二个积分,直接用Levin 法似乎很困难,因为你的积分是无穷积分,从 0~Inf。所以,需要做一个简单的变形。下面提供一点我的思路。可以先将积分写成

  其中,第一个积分可以直接计算,因为高震荡性源自无穷大处,所以,主要难点是计算第二个积分。第二个积分依然是无穷积分,依然不容易用 Levin 法。所以,再对第二个积分做 y=1/x的换元,得到的积分区间就变成了 0~1,且高震荡性从无穷大变换到了0点。剩下的就是对这个在0点高度震荡的积分的求解了。

  另外,在Levin后又出现了很多论文,应该有专门针对无穷远点高度震荡的积分

  Levin 的确有 3 篇,分别发表于 82、96、97 年,其中,96 年那篇(就是kaaaf123提供的那篇)是对82年那篇 ...

  而恰好上面的积分形式是含有三角函数项的,只是振荡项比较多,无法直接应用上述方法。所以我想到了两个办法:

  方法1. 对被积函数进行积化和差,这样就能将三角函数的乘积化成几项三角函数的和了,然后就变成了

  方法2. 由于被积函数是高振荡的,考虑进行傅里叶级数展开,或者在高振荡区间进行渐近展开。对展开级数中的慢振荡项直接常规积分,高振荡项取有限几项使用Levin方法积分。

  型)。所以分开来算的时候必须人工参与,而不是全程序自动化计算,因为——当涉及到无穷大的计算的时候,matlab认为结果是NaN,而这里情况很特殊,应该是个有限值。

  方法2展开项太少则结果不精确,太多则符号计算过程(傅里叶系数)耗时较大。

  针对上述不足,Levin的通用方法还是最好用的,只需要构造系数矩阵f,微分矩阵A,振荡核向量函数w,使得w=Aw即可。那么被积函数就是f*w。

  本质上就是一个级数的部分和(n个连续相邻零点之间的积分求代数和)。由于是高振荡积分,所以这个级数是交错级数,因此部分和Sn收敛很慢,所以我们可以使用加速技术(通过某种变换,仅仅需要少数几项就能快速收敛),比如常用的有Euler级数转换法,大红鹰dhy8055comAtiken

  法,Wynn 加速法。然而这种方法的关键还是在于非线性方程求根,matlab使用的是牛顿法,考虑求非线性周期函数(被积函数)的前20个根,不知道计算会不会很慢。

  你提到的数值解法依赖于被积函数0点的求取,但因为函数高震荡,零点实际上是很难求取的,尤其是接近于无穷大方向的高震荡区域时,零点极难获取。正如一个高震荡积分无法用普通数值方法求得一样,你同样无法用普通数值方法获取高震荡函数的零点。但你又不得不求解无穷远端的零点,因为高震荡函数的主要信息被包含了高震荡区域,这意味着依赖求零点的方法不太现实。而你提到的加速法是建立在这些零点已经获取的基础上,所以,零点的计算不解决的话后面无从实施。

  你提到的数值解法依赖于被积函数0点的求取,但因为函数高震荡,零点实际 ...

  只需要很少的零点,因为用了加速收敛技术。你可以看看 王勇.数值积分中加速收敛法的应用。或者Mathematica中“高等数值积分中关于积分策略和积分规则里面的内容”(它里面有这个方法)

上一篇:没有了

网友评论

我的2016年度评论盘点
还没有评论,快来抢沙发吧!