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

Jua*_*ada 6 python warnings numpy

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

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()
Run Code Online (Sandbox Code Playgroud)

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

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

我想现在如何解决它并使其工作.

Ton*_*has 8

您的代码遇到了Divide by Zero Error.试试这说服自己:

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

import warnings

def f(x, y):
    with warnings.catch_warnings():
        warnings.simplefilter('ignore')        
        return ((x**(2))*y)/((x**(4)) + (y**(4)))
Run Code Online (Sandbox Code Playgroud)

建议的变通方法避免了RuntimeWarning,但是没有让您的代码按预期运行.实际上,计算的解w是一个向量,其中所有元素都是零.我猜你的代码无法正常工作的原因是你错过了分配不同w[0]初始值0.

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

w[0] = 0.5
Run Code Online (Sandbox Code Playgroud)

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

w(x)的情节

希望这可以帮助!