计算高斯函数时Python溢出

时间:2019-01-22 12:53:53

标签: python math gaussian

我正在尝试使用以下定义来计算高斯函数的值

from math import e

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

但是我得到的值为20000、30000、1000000等的溢出。 您知道解决方法 谢谢!

2 个答案:

答案 0 :(得分: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)编写16.0以防止整数除法。

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

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

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

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

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

    在极端情况下,这将下溢而不是溢出。在这种情况下,下溢的行为要好得多–您将得到零而不是OverflowError

答案 1 :(得分:1)

我的建议是通过取公式的对数来重新构造公式(即,将公式与项的乘积转换为每个项的对数之和),然后取结果的指数。