MATLAB计算besselj贝塞尔函数定积分结果不符的原因及解决方法
MATLAB贝塞尔函数积分计算结果偏差排查
问题描述
使用MATLAB符号计算工具求解贝塞尔函数相关定积分时,输出结果与个人预期不符,用到的计算代码如下:
syms x a int(besselj(1,a*x)*x^2,0,1)
代码运行后MATLAB返回的结果为:
(2*besselj(1, a))/a^2 - besselj(0, a)/a
个人预期的正确结果为(- besselj(0, a)/a),需要明确偏差出现的原因,以及得到正确积分结果的操作方式。
偏差原因
- 结果偏差来自于预期结果错误,MATLAB返回的积分结果在数学上完全正确,不存在计算错误。
- 预期结果漏算了分部积分的边界项:对被积函数做分部积分推导时,错误将上下限代入后的边界值判定为0,才得到了缺项的错误结果。
- 可以通过基本性质快速验证预期结果的矛盾:当a为正实数时,被积函数
besselj(1,a*x)*x^2在积分区间[0,1]上取值恒为非负,定积分结果必然为非负值;但预期结果-besselj(0,a)/a在a取较小正实数时为负值,和定积分的基本性质直接矛盾,显然不成立。
正确操作方法
- 无需调整现有积分代码,直接使用MATLAB返回的
(2*besselj(1, a))/a^2 - besselj(0, a)/a作为该定积分的解析结果即可。 - 如果需要确认结果正确性,可通过两种方式交叉校验:
- 代入具体的a取值,用数值积分函数
integral做数值计算,对比数值结果和解析表达式的计算值,二者会完全匹配 - 对MATLAB返回的解析结果关于x求导,经过贝塞尔函数递推公式化简后,会和原被积函数完全一致
- 代入具体的a取值,用数值积分函数
内容的提问来源于stack exchange,提问作者maryem Mery
相关产品推荐
相关产品推荐

