计算高斯函数时Python溢出

2024-04-20 08:52:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用下面的定义来计算高斯函数的值

from math import e

def function(x):
    return 100 / (e**((x-2000)**2))**1/16

但是我得到了一个溢出值20000,30000,1000000,等等。 你知道解决办法吗 谢谢!你知道吗


Tags: 函数fromimportreturn定义deffunctionmath
2条回答
  1. 使用math.exp

    100 / math.exp((x-2000)**2))**1/16
    

    这比e**在性能和数值上更精确。

  2. 请注意,...**1/16可能并不是您想要的。**/具有higher operator precedence,因此上述等价于(...**1)/16。将分数用括号括起来:

    100 / math.exp((x-2000)**2)**(1/16.0)
    

    以浮点格式(16.0)写入16以防止整数除法。

  3. 使用指数规则合并1/16

    100 / math.exp((x-2000)**2/16.0)
    

    这减少了大参数,有助于提高精度。

  4. 翻转参数的符号并将除法改为乘法:

    100 * math.exp(-(x-2000)**2/16.0)
    

    在极端情况下,这将是下溢而不是溢出。在这种情况下,下溢的表现要好得多–只会得到0而不是OverflowError

我的建议是重新修改这个公式,取它的对数(也就是说,把公式和项的乘积转换成每个项的对数之和),然后取结果的指数。你知道吗

相关问题 更多 >