我正在应用欧拉方法来求解微分方程。这是我的代码:
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()"
我想现在如何解决它并让它发挥作用。
答案 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
你得到这个(显然有意义的)曲线,而不是平坦的情节。
希望这有帮助!