请教一个数值积分问题,怎样用matlab的quadgk函数来计算

这个积分属于高震荡积分,用经典的高斯积分公式难以奏效,而 MATLAB 核心数值积分函数 quadgk、integral 都是采用传统的高斯积分方法(Gauss-Kronrod quadrature),所以,计算结果不可靠。此处应该以符号积分的结果为准,好在这个积分有解析表达式,你从文献中看到的那个表达式是正确的。实际上,这个解析表达式实际上还有另外一种更简洁的表达式形式:
请教一个数值积分问题,怎样用matlab的quadgk函数来计算

而你在文献中看到的解析解可以从上述结果中利用下列关系式导出:
【请教一个数值积分问题,怎样用matlab的quadgk函数来计算】 请教一个数值积分问题,怎样用matlab的quadgk函数来计算

所以,你也可以按下列方式直接计算:-pi/2*bessely(0,k*R)
如果要用数值方法的话,需要采用专门适用于高震荡积分的方法,比如 Levin 算法,可惜MATLAB中没有现成的函数使用,需要自己实现算法。




■网友
现在新版本的matlab,比如R2016,都已经用integral函数来替代之前的积分函数吧。它所用的算法是可以计算振荡积分的,文献可以用matlab的help查看。我经常用integral,很强大,速度慢了但精度还可以,建议楼主试一下~
■网友
楼主不妨这样试一下,可以得到正确答案的
k0=10; R=6; p_f=@(s)(s).*besselj(0,s*R)./(s.^2-k0^2);eps=1e-8;p1=quadgk(p_f,0,k0-eps);p2=quadgk(p_f,k0+eps,inf);p_incN=p1+p2将奇异点附近的部分,在略微截断下


    推荐阅读