我的代码包含一些随机步骤和指数表达式(单调表达式),需要在末尾找到其根。 "RuntimeWarning: invalid value encountered in double_scalars"
偶尔出现。例如,当我跑步5次时,它会出现3或2次。你能告诉我这是怎么回事吗? PS:每次都能得到结果,但这只是警告让我感到困惑。
答案 0 :(得分:0)
有两种解决方法,取决于您的数据。
1。
当您处理大量数字并且超出了double
的限制
要解决此问题,该方法实际上是相当数学的。
首先,当且仅当 (T_data[runs][0])*(np.exp(-(x)*(T_data[runs][1])))
始终小于1.7976931348623157e+308
。
为a*e^(-x*b) = e(ln(a)-xb)
因此,(T_data[runs][0])*(np.exp(-(x)*(T_data[runs][1]))) = np.exp(T_data[runs][0]-(x)*(T_data[runs][1]))
改为使用np.exp(np.log(T_data[runs][0])-(x)*(T_data[runs][1]))
。
2。
但是,正如您所说的,每次都会得到结果,(T_data[runs][0])*(np.exp(-(x)*(T_data[runs][1])))
可能接近零,该值太小以至于不能再保留double值,但另存为0
也不会造成损害。
您应该像这样更改代码,以避免出现警告。
temp = (x)*(T_data[runs][1])) > 709 ? 0 : np.exp(-(x)*(T_data[runs][1]))
exponential += (T_data[runs][0]) * temp
## As ln(1.7976931348623157e+308) ~= 709.78