【问题标题】:RuntimeWarning: invalid value encountered in double_scalars app.launch_new_instance()RuntimeWarning:在 double_scalars app.launch_new_instance() 中遇到无效值
【发布时间】:2016-10-13 08:13:42
【问题描述】:

我正在应用欧拉方法来求解微分方程。这是我的代码:

def f(x, y):
    return ((x**(2))*y)/((x**(4)) + (y**(4)))

di = 0.01
I = 100

x = np.linspace(-I, I, int(I/di) + 1)
w = np.zeros(len(x))

x[0], w[0]
for i in range(1, len(w)):
    w[i] = w[i - 1] + f(x[i - 1], w[i - 1])*di

plt.plot(x, w, label='approximation' )
plt.xlabel("x") 
plt.ylabel("y")
plt.show()

当我运行代码时,我有这个警告:

“C:\Users\USER\Anaconda3\lib\site-packages\ipykernel__main__.py:3: RuntimeWarning: 在 double_scalars app.launch_new_instance() 中遇到无效值”

我现在想知道如何解决它并让它发挥作用。

【问题讨论】:

    标签: python numpy warnings


    【解决方案1】:

    您的代码运行到除以零错误。试试这个来说服自己:

    >>> def f(x, y):
    ...     return ((x**(2))*y)/((x**(4))+(y**(4)))
    ...
    >>> I, di = 100, 0.01
    >>> x = np.linspace(-I, I, int(I/di) + 1)
    >>> w = np.zeros(len(x))
    >>> i = len(x)//2 + 1
    >>> i
    5001
    >>> f(x[i-1], w[i-1])
    nan
    

    从上面的交互式会话中可以清楚地看出,当 i 在 for 循环中取值 5001 时,f(x[i-1], w[i-1]) 产生 nan。这个问题有几种解决方案。例如,为了避免NaN 值,您可以在执行除法之前检查f() 返回的分数的分母是否为零。如果是,您应该返回您选择的常规值(例如0)而不是除法的结果。以下 sn-p 通过conditional expression 实现了这种方法:

    def f(x, y):
        return (0 if x==0 and y==0 else float(x**2*y)/(x**4 + y**4))
    

    或者,您可以通过在脚本中包含以下代码来禁用运行时警告(但如果这样做,您需要注意潜在风险):

    import warnings
    
    def f(x, y):
        with warnings.catch_warnings():
            warnings.simplefilter('ignore')        
            return ((x**(2))*y)/((x**(4)) + (y**(4)))
    

    建议的解决方法避免了 RuntimeWarning,但不会让您的代码按预期工作。实际上,计算得到的解w 是一个所有元素都为零的向量。我猜您的代码无法正常工作的原因是您错过了为w[0] 分配一个不同于0初始值

    例如,如果您只是在 for 循环之前添加此行:

    w[0] = 0.5
    

    你会得到这个(显然是有意义的)曲线而不是平面图。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 2019-05-20
      • 2015-03-03
      • 1970-01-01
      • 2019-05-08
      • 2020-12-01
      相关资源
      最近更新 更多