2016-12-28 14 views
0

erfメソッドを使用せずに、scipyを使ってエラー関数を再現しようとしています。quadメソッドのpythonを使った統合

これは私のコードです:

#!/usr/bin/env python 
import numpy as np 
import math 
from scipy.integrate import quad 

def error_func(y): 
    return 2/math.sqrt(np.pi)*quad(np.exp(-y**2), 1, np.inf, args=(y))[0] 

g = [error_func(x) for x in np.arange(-1,1,0.2)] 

print g 

このコードは、次のエラーメッセージが返されます:

File "./test.py", line 9, in <module> 
    g = [error_func(x) for x in np.arange(-1,1,0.2)] 
    File "./test.py", line 7, in error_func 
    return 2/math.sqrt(np.pi)*quad(np.exp(-y**2), 1, np.inf, args=(y))[0] 
    File "/usr/local/lib/python2.7/site-packages/scipy/integrate/quadpack.py", line 316, in quad 
    points) 
    File "/usr/local/lib/python2.7/site-packages/scipy/integrate/quadpack.py", line 383, in _quad 
    return _quadpack._qagie(func,bound,infbounds,args,full_output,epsabs,epsrel,limit) 
quadpack.error: quad: first argument is not callable 

を私が正しく理解していれば、クワッドの最初の引数は関数でなければなりません。私はそれを正しく伝えます。 私のコードで何が問題になっていますか?

+3

投稿したコードは、スタックトレースのコードとははっきりと異なっています。スタックトレースのコードには 'lambda y'はありません。あなたが思っているコードを実行していることを確認してください。 – user2357112

+2

あなたの投稿を編集したのを見ましたが、あなたのコードはまだ目に見えてスタックトレースと一致していないので、私が指摘した部分をただちに修正しようとしました。それをしないでください。コードを実行してエラーメッセージを表示し、実行したコードと正確なエラーメッセージをコピーして質問に貼り付けます。他のものはバグを隠し、他のバグを導入し、一般的に誰かがあなたを助けることをより困難にします。 – user2357112

+0

'scipy.integrate.quad'は関数を最初の引数として想定しています。あなたはそれを 'np.exp(-y ** 2)'とします。これは数字です。 'lambda x:np.exp(-x ** 2)'と置き換えてみてください。また、 'scipy.integrate.quad'の文書を読んでください:https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.integrate.quad.html –

答えて

1

あなたの最初の問題は、

np.exp(-y**2) 

は関数ではないということです。それは数字です。具体的には、e ^( - y^2)の値です。しかし、あなたが他の問題を抱えている

lambda y: np.exp(-y**2) 

:あなたはnp.exp(-y**2)yをマップする関数を定義したい場合は、最も簡単な方法は、lambda構文である

(y)

args=(y)でタプルではありません。グループを小括弧で囲んだのはちょうど yです。 1要素タプルは (y,)です。

また、args引数をquadに渡すべきではありません。なぜなら、あなたの関数は、統合している引数以外の追加引数を必要としないからです。

最後に、統合の境界が間違っています。 0からエラー関数の引数に統合する必要があります。

+0

ありがとう!それは多くの助けになります! – Monica

関連する問題