【问题标题】:MATLAB - solving the integral with bessel functionMATLAB - 用贝塞尔函数求解积分
【发布时间】:2018-01-06 08:57:47
【问题描述】:

我正在尝试求解变量 x(从 0 到 Inf)的积分,它是变量 S 的函数。我想求解这个积分并找到依赖于变量 S 的结果向量。integral

然后我想通过 polyfit 来近似这个函数(得到一个函数 E(S))

nu=0; int_val=zeros([255,1]); for i=1:10
S=i/100;
%besselj(0,S*2)
fun = @(x)log(abs(x-(pi/2)^2.*(-S.^2/2))).*x.*exp((x.^2+S.^2)/2).*besselj(nu,S.*x);
int_val(i) = integral(fun,0,Inf); end

不幸的是,MATBAL 只计算 NaN 数。这对我来说很重要。请帮忙。

【问题讨论】:

  • 有没有可能应该是.* besselj 而不是*besselj
  • 您是否仔细检查过您在fun 中定义的函数是否真的是您要评估的被积函数?对于较大的 x,该函数似乎正在增长到非常大的数字,因此积分无法收敛。
  • 截图中的公式并不是真正的有效表达式。什么是 S(x)?日志的参数是什么(只有 x?)?
  • 因此,作为一般提示,每当您想对一个函数进行数值积分并遇到某种麻烦时,请务必将被积函数绘制为 x 的函数,看看它是否符合您的预期......
  • 另一条评论:符号 I_0 经常用于修改后的贝塞尔函数,而不是通常的贝塞尔函数,请参阅wikipedia。也许你混淆了贝塞尔函数的种类?

标签: matlab integral


【解决方案1】:

正如我在 cmets 中所写的,对于大 x,您的被积函数正在增长到无穷大。因此,积分不能收敛。

以下代码

nu=0; 
int_val=zeros([255,1]); 
i = 1;
S=i/100;
fun = @(x)log(abs(x-(pi/2)^2.*(-S.^2/2))).*x.*exp((x.^2+S.^2)/2).*besselj(nu,S.*x);
x = 0:0.1:100;
semilogy(x, fun(x))

这个情节的结果:

您不能将这样的函数从 0 积分到无穷大,因为结果不会收敛到有限数。

在您的上述答案中,您声明 S(x) 取决于 x。但是,在您的代码中 S 是一个常数。也许这就是问题所在 - 如果您将 S 替换为 x 的实际函数,该函数在 x 到无穷大时变为零,您最终可能会得到一个收敛积分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多