我有以下等式:
result = (A * np.exp(b * (t - t0))) / (1 + np.exp(c * (t - t0)))
我输入t值的数组以得出结果。 A, b, c, t0
都是常数(b
和c
很大,t0
很小,但不比b和c大)。问题是,由于指数值很快变得太大而无法容纳超过t
的一定范围的float64,所以我遇到了溢出错误。我正在尝试找到一种解决方法,同时仍保持适当的精度。 result
的值很好地位于float64容器的范围内,但是np.exp
计算的中间值过大阻止了我深入研究结果。
我有一些想法:
但是,我不确定如何实现这些想法,或者它们是否会真正起作用。
本质上讲,这个问题可以归结为result = np.exp(a) / np.exp(b)
,其中a和b在100-1000的范围内。 np.exp(709)
的结果为8.2e307,恰好是float64的上限,但是我需要输入更大的值。虽然两个指数的比较产生了一个合理的值,但指数本身太大而无法计算。
答案 0 :(得分:1)
将所有内容保持在对数范围内是解决此类问题的常见方法。至少这是我们在统计中所做的,您经常处于1e-10000范围内,尤其是在开始接近收敛之前。例如,所有scipy
概率密度函数都有logpdf
变体,它们在对数刻度上起作用。
我认为您的表情将被重写为:
d = t - t0
log_result = (np.log(A) + (b * d)) - np.logaddexp(0, c * d)
(未经测试)