2016-12-28 6 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,)입니다. 함수는 우리가 이상 통합하고있는 하나 이상 추가 인수를 필요로하지 않기 때문에

또한, 당신은, 어쨌든 quadargs 인수를 전달해서는 안된다.

마지막으로 통합 경계가 잘못되었습니다. 당신은 오류 함수의 인수에 0에서 통합되어야한다 : 당신이 게시

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

대단히 감사합니다! 그것은 많은 도움이됩니다! – Monica