Sympy에서 lambdify name error 어떻게 해결하나요?

조회수 1078회

Sympy로 fourier_transform을 돌린 객체를 lambdify로 받을 시 module에도 numpy와 sympy를 적용했는데도, FourierTransform이 정의되어 있지 않다는 name error가 뜹니다.

import sympy as sym
t,pw,f=sym.symbols('t,pw,f')
Ori=sym.exp(-(t**2)/(pw**2))
FT=sym.fourier_transform(Ori,t,f)
F=sym.lambdify([pw,f],FT,modules=['numpy', 'sympy'])
print(F(1,2))

Output으로 NameError: name 'FourierTransform' is not defined 가 나옵니다.

Error전체내용은 이렇습니다. Traceback (most recent call last):

File "", line 1, in runfile('G:/test.py', wdir='G://')

File "C:\Users\76rbn\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 704, in runfile execfile(filename, namespace)

File "C:\Users\76rbn\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile exec(compile(f.read(), filename, 'exec'), namespace)

File "G:/test.py", line 6, in print(F(1,2))

File "", line 2, in _lambdifygenerated return (1.73205080756888e-5*sqrt(1/pw)FourierTransform(exp(-4*t2*log(2)/pw*2), t, f))

NameError: name 'FourierTransform' is not defined

현재 저는 sympy는 1.3, python은 3.7.1, conda는 4.6.1을 사용 중입니다. 어떻게 해결할 수 있을까요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 일단 2가지 정도 살펴봐야 합니다.

    FourierTransform 문제는 모듈에서 찾지 못하는 문제니 modules=[numpy, sym] 이렇게 명시적으로 선언해주면 됩니다.

    그래도 에러가 발생할겁니다.

          1 def _lambdifygenerated(pw, f):
    ----> 2     return (FourierTransform(exp(-t**2/pw**2), t, f))
    
    AttributeError: 'Mul' object has no attribute 'exp'
    

    상기의 에러는 변수 t가 없기 때문에 나타나는 오류입니다. 펑션에서는 2개의 항목만 받고 있지만 실제 함수내에서는 t, pw, f 3개의 변수가 필요함을 알 수 있습니다.

    아래와 같이 명시적으로 3개 변수를 넣는 형태로 수정하면 됩니다.

    F=sym.lambdify([t, pw, f], FT, modules=[numpy, sym])
    
    In [6]:import numpy 
       ...: import sympy as sym
       ...: t,pw,f=sym.symbols('t,pw,f')
       ...: Ori=sym.exp(-(t**2)/(pw**2))
       ...: FT=sym.fourier_transform(Ori,t,f)
       ...: F=sym.lambdify([t, pw, f], FT, modules=[numpy, sym])
    
    In [7]: print(F(1,2,3))
    FourierTransform(0.778800783071405, 1, 3)
    
    • Ori가 t와 pw에 대한 함수고, FT는 Ori를 fourier transform 시켰으므로 f와 pw에 대한 함수라고 생각합니다. 각각의 f와 pw에서 FT의 valus를 얻기위해 FT에 대하여 lambdify를 했는데 FourierTransform(0.778800783071405, 1, 3)가 아니라 정확한 값을 얻는 방법은 없을까요?? 알 수 없는 사용자 2019.1.31 15:52
  • https://docs.sympy.org/latest/_modules/sympy/integrals/transforms.html

    우선 상기 링크의 코드를 보세요. F(1,2,3)는 FourierTransform 라는 클래스의 객체에요

    예를들어 아래와 같이 하면 됩니다만...ValueError: Invalid limits given: ((1, -oo, oo),) 라는 오류가 발생하네요. 푸리에변환 관련한 수식을 살펴보세요.

    f = F(1,2,3)
    f.doit()
    ValueError: Invalid limits given: ((1, -oo, oo),)
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)