Runtime error 不规则错误警告:RuntimeWarning:在双\u标量中遇到无效值

Runtime error 不规则错误警告:RuntimeWarning:在双\u标量中遇到无效值,runtime-error,Runtime Error,我的代码包含一些随机步骤和指数表达式(单调表达式),需要在末尾找到它的根。“RuntimeWarning:在双标量中遇到无效值”偶尔出现。例如,当我运行5次时,它出现了3到2次。你能告诉我这里发生了什么事吗?PS:每次我都能得到结果,但只是警告让我感到困惑。有两种可能的解决方法,取决于您的数据 1. 因为您正在处理一些巨大的数字,并且超出了double 要解决这个问题,这个方法实际上相当数学化 首先,当且仅当(T_数据[runs][0])*(np.exp(-(x)*(T_数据[runs][1])

我的代码包含一些随机步骤和指数表达式(单调表达式),需要在末尾找到它的根。
“RuntimeWarning:在双标量中遇到无效值”
偶尔出现。例如,当我运行5次时,它出现了3到2次。你能告诉我这里发生了什么事吗?PS:每次我都能得到结果,但只是警告让我感到困惑。

有两种可能的解决方法,取决于您的数据

1.

因为您正在处理一些巨大的数字,并且超出了
double

要解决这个问题,这个方法实际上相当数学化

首先,当且仅当
(T_数据[runs][0])*(np.exp(-(x)*(T_数据[runs][1])
总是小于
1.7976931348623157e+308

As
a*e^(-x*b)=e(ln(a)-xb)

因此,
(T_数据[runs][0])*(np.exp(-(x)*(T_数据[runs][1])=np.exp(T_数据[runs][0]-(x)*(T_数据[runs][1])

使用
np.exp(np.log(T_数据[runs][0])-(x)*(T_数据[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

伟大的密码?什么是双标量?什么是随机步骤?@MatrixTai问得很好。这太复杂了,无法在这里展示,遗憾的是,我没有找到任何简单的例子来展示。对于这种错误类型,有一些一般的想法或案例……仍然太缺乏信息。您是否在python中处理一些
double
?至少陈述一些背景。甚至只是给你几句警告。谢谢,这给了我一个提示。“指数+=(T_数据[runs][0])*(np.exp(-(x)*(T_数据[runs][1]))”此部分位于警告之后。[运行]是迭代。T_数据是一个列表,其中的数据以形状(1,2)排列。这对您有帮助吗?您似乎溢出了exp函数,在出现错误的地方打印
-(x)*(T_数据[runs][1])
。我已经使用了'index+=np.exp(np.log(T_数据[runs][0])-(x)*(T_数据[runs][1])尝试过这种情况,但这一次,错误警告变为“RuntimeWarning:除以在对数指数+=(T_数据[runs][0])*(np.exp(-(x)*(T_数据[runs][1]))中遇到的零”。所以很可能是你在情景2中说的情况。仍然需要你的建议,因为我不知道情况2的代码的含义。谢谢@IvyGao,在numpy中,exp和log实际上是用泰勒级数计算的,因此在某些情况下log可能会被零除。就是这样,不要使用方法1。非常感谢!我得到了它!