【问题标题】:Inf*0 in MatlabMatlab中的Inf * 0
【发布时间】:2016-02-20 09:31:47
【问题描述】:

我的代码中有以下行:

 1 - sqrt(pi/2)*sig*sqrt(Eb)*theta_l*exp(theta_l^2*sig^2*Eb/2).*(1 + erf(-theta_l*sig*sqrt(Eb)/sqrt(2)));

当我针对以下参数评估此表达式时: Eb = 6324.6; sig = 1/sqrt(2); theta = 0.7;,我明白了南。我知道这来自 Infinity 乘以 0 的乘积。

但是,当我在 Mathematica 中测试同一行时,结果是一个有限值。我该如何解决这个问题?谢谢。

【问题讨论】:

    标签: matlab nan infinity


    【解决方案1】:

    你的函数有问题的部分是exp(Eb/2)。 Eb 的值太大了,它的取幂结果不能用双精度浮点数表示(Mathematica 中的数值精度显然更高,或者动态可能以性能为代价),所以你得到Inf .

    但是,您只需将输入单位更改为您的函数即可阻止这种情况发生。例如,如果我们将您的函数定义为匿名函数...

    funky = @(Eb, sig, theta_l) ...
             1 - sqrt(pi/2)*sig*sqrt(Eb)*theta_l*exp(theta_l^2*sig^2*Eb/2) .* ...
             (1 + erf(-theta_l*sig*sqrt(Eb)/sqrt(2)));
    

    然后

    funky(6324.6 / 1000, (1/sqrt(2))/1000, 0.7 / 1000) == ...
    funky(6324.6 / 1e6, (1/sqrt(2))/1e6, 0.7 / 1e6) == ...
    funky(6324.6 / 1e10, (1/sqrt(2))/1e10, 0.7 / 1e10) % etc
    

    【讨论】:

    • 感谢 learnvst 的回答。问题是我稍后会需要这个值,所以我希望是否可以通过某种方式进行一些修改以获得有限值。
    • @kagami 如果您的值大于基本 MATLAB(和/或您的计算机)可以处理的值,您必须查看扩展精度库,例如 gmp
    • @CarlWitthoft,我需要将此库与 MATLAB 结合使用,还是使用其他语言?
    • 您需要安装库并安装调用它的 MATLAB 包。我忘记了名字,但它在 FileExchange 上。
    猜你喜欢
    • 2017-04-13
    • 2016-08-23
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    相关资源
    最近更新 更多