Python计算高斯函数时溢出
Python overflow when calculating Gaussian function
我正在尝试使用以下定义计算高斯函数的值
from math import e
def function(x):
return 100 / (e**((x-2000)**2))**1/16
但是我得到了 20000、30000、1000000 等值的溢出。
你知道解决方法吗
谢谢!
使用math.exp
:
100 / math.exp((x-2000)**2))**1/16
这比 e**
.
性能更高,数值更准确
请注意,...**1/16
可能无法满足您的要求。 **
比/
有higher operator precedence,所以上面等价于(...**1)/16
。将分数括在括号中:
100 / math.exp((x-2000)**2)**(1/16.0)
以浮点格式 (16.0
) 写入 16
以防止整数除法。
使用指数规则合并 1/16
:
100 / math.exp((x-2000)**2/16.0)
这减少了大参数,有助于提高精度。
翻转参数的符号并将除法更改为乘法:
100 * math.exp(-(x-2000)**2/16.0)
这在极端情况下会下溢而不是上溢。在这种情况下,下溢表现得更好——你只会得到零而不是 OverflowError
.
我的建议是通过取对数来修改公式(即将公式与项的乘积转换为每项的对数之和),然后取结果的指数。
我正在尝试使用以下定义计算高斯函数的值
from math import e
def function(x):
return 100 / (e**((x-2000)**2))**1/16
但是我得到了 20000、30000、1000000 等值的溢出。 你知道解决方法吗 谢谢!
使用
math.exp
:100 / math.exp((x-2000)**2))**1/16
这比
e**
. 性能更高,数值更准确
请注意,
...**1/16
可能无法满足您的要求。**
比/
有higher operator precedence,所以上面等价于(...**1)/16
。将分数括在括号中:100 / math.exp((x-2000)**2)**(1/16.0)
以浮点格式 (
16.0
) 写入16
以防止整数除法。使用指数规则合并
1/16
:100 / math.exp((x-2000)**2/16.0)
这减少了大参数,有助于提高精度。
翻转参数的符号并将除法更改为乘法:
100 * math.exp(-(x-2000)**2/16.0)
这在极端情况下会下溢而不是上溢。在这种情况下,下溢表现得更好——你只会得到零而不是
OverflowError
.
我的建议是通过取对数来修改公式(即将公式与项的乘积转换为每项的对数之和),然后取结果的指数。