大数乘以小数

时间:2012-05-09 08:38:58

标签: matlab math numbers largenumber

我正在尝试使用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)

表示你的所有真实价值。问题是,只要你> 28,它就会被评估为'inf'。我已经听过并尝试过使用MATLAB函数'vpa',但是当我想使用函数时它似乎不能正常工作......

此时任何提示都将受到赞赏!

2 个答案:

答案 0 :(得分: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

这将更好地用数字表示。

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

答案 1 :(得分:0)

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

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