1

我正在尝试使用 MATLAB 计算一个相当难看的积分。我遇到的问题是我将一个非常大的数字(> 10 ^ 300)与一个非常小的数字(< 10 ^ -300)相乘。MATLAB 为此返回“inf”,即使它应该在 0-0.0005 的范围内。这就是我所拥有的

    besselFunction = @(u)besseli(qb,2*sqrt(lambda*(theta + mu)).*u);
    exponentFuncion = @(u)exp(-u.*(lambda + theta + mu));

其中 qb = 5,lambda = 12,theta = 10,mu = 3。我想找到的是

    besselFunction(u)*exponentFunction(u)

对于 u 的所有真实值。问题是,每当 u>28 时,它都会被评估为“inf”。我听说过并尝试过使用 MATLAB 函数“vpa”,但是当我想使用函数时它似乎效果不佳......

在这一点上,任何提示将不胜感激!

4

2 回答 2

5

我会使用对数。

x = Bessel function of uy = x*exp(-u)(比你的方程简单,但类似)。

既然log(v*w) = log(v) + log(w),那么log(y) = log(x) + log(exp(-u))

这简化为

log(y) = log(x) - u

这将在数​​字上表现得更好。

另一个关键是不要评估变成大数的贝塞尔函数并将其传递给数学函数以获取日志。最好自己编写,直接返回 Bessel 函数的对数。查看像 Abramowitz 和 Stegun 这样的参考文献,尝试找到一个。

于 2012-05-09T09:58:48.543 回答
0

如果您正在进行积分,请考虑使用Gauss–Laguerre 求积。基本思想是,对于形式 的方程,exp(-x)*f(x)从 0 到 inf 的积分可以近似为sum(w(X).*f(X))其中的值X是拉盖尔多项式的零点并且W(X)是特定的权重(参见 Wikipedia 文章)。有点像一个非常先进的辛普森规则。由于您的方程式已经有exp(-x)一部分,因此它特别适合。

为了找到多项式的根,MATLAB Central 上有一个名为LaguerrePoly的函数,从那里计算权重非常简单。

于 2013-03-21T21:39:54.843 回答