2016-12-28 26 views
0

我想重現使用scipy,不使用erf方法的錯誤函數。集成使用四方法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)的值。如果你想定義映射ynp.exp(-y**2)的功能,最簡單的方法是用lambda語法:

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

您有其他問題,但:

(y)args=(y)元組;它只是y分組括號。一個元素元組將是(y,)

另外,無論如何,您不應該將args參數傳遞給quad,因爲您的函數除了我們正在整合的參數之外不需要任何其他參數。

最後,您的集成範圍是錯誤的;您應該將0集成到錯誤函數的參數中:

def error_func(x): 
    return 2/math.sqrt(np.pi) * quad(lambda y: np.exp(-y**2), 0, x)[0] 
+0

非常感謝!它有很大幫助! – Monica