RuntimeWarning:double_scalars中遇到的值无效app.launch_new_instance()

时间:2016-06-13 01:39:48

标签: python numpy warnings

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

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()"

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

1 个答案:

答案 0 :(得分:6)

您的代码遇到除以零错误。试着这样说服自己:

>>> 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)而不是除法的结果。以下代码段通过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

你得到这个(显然有意义的)曲线,而不是平坦的情节。

Plot of w(x)

希望这有帮助!