2016-06-13 9 views
1

私は、微分方程式を解くためにオイラー法を適用しています。これは私のコードです。 。3:RuntimeWarning:double_scalarsに遭遇した無効な値 app.launch_new_instance RuntimeWarning:double_scalarsでオーバーフローが発生しました

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:\ USER \ Anaconda3 \ libに\のsite-packages \ ipykernel__main __ PY \ユーザー() "

これを解決して動作させる方法をご希望です。ありがとう。

答えて

0

コードはになります。ゼロ誤差で除算。自分を納得させるために、これを試してみてください:

>>> 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)を返す必要があります。あなたは実行時の警告を無効にすることができ、また

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

(しかし、あなたがそうするならば、あなたは、潜在的なリスクを認識する必要があります)、スクリプトでこのコードを含むによって:次のスニペットは、conditional expressionしかし、このようなアプローチを実装し

import warnings 
warnings.simplefilter('ignore') 

提案回避策はRuntimeWarningを避けるが、あなたが期待するとして働いてあなたのコードを得ることはありません。実際、計算された解wは、すべての要素がゼロであるベクトルです。あなたのコードが正しく動作していない理由は、w[0]の初期値0と異なるように割り当てられなかったことです。

たとえば、あなたは、単にだけforループの前に次の行を追加した場合:

w[0] = 0.5 

あなたは、この(明らかに意味のある)カーブではなく、フラットなプロットを取得します。

Plot of w(x)

は、この情報がお役に立てば幸い!

関連する問題