2012-11-11 8 views
2

파이썬 2.7을 사용하여 수치 적으로 방정식을 풀려고합니다. 이는 전체 코드입니다 :Python AttributeError : cos

from sympy import * 
from sympy import Symbol 
from sympy.solvers import nsolve 
from scipy import * 
from pylab import * 
import numpy as np 

# Symbols 
theta = Symbol('theta') 
phi = Symbol('phi') 
phi0 = Symbol('phi0') 
H0 = Symbol('H0') 
# Constants 
a = 0.05 
b = 0.05**2/(8*pi*1e-7) 
c= 0.001/(4*pi*1e-7) 
phi0 = 60*pi/180 
H0 = -0.03/(4*pi*1e-7) 
def m(theta,phi): 
    return np.array([sin(theta)*cos(phi), sin(theta)*cos(phi), cos(phi)]) 
def h(phi0): 
    return np.array([cos(phi0), sin(phi0), 0]) 
def k(theta,phi,phi0): 
    return np.vdot(m(theta,phi),h(phi0)) 
def F(theta,phi,phi0,H0): 
    return -(a*H0)*k(theta,phi,phi0)+b*(cos(theta)**2)+c*(sin(2*theta)**2)+sin(theta)**4*sin(2*phi)**2 
def F_phi(theta,phi,phi0,H0): 
    return simplify(diff(F(theta,phi,phi0,H0),phi)) 
def G(phi): 
    return F_phi(pi/2,phi,phi0,H0) 
solution = nsolve(G(phi), phi) 
print solution 

이것은 내가 가지고있는 역 추적입니다 : 나는 sympy, NumPy와 및 pylab 라이브러리를 사용하고

Traceback (most recent call last): 
File "Test.py", line 33, in <module> 
solution = nsolve(G(phi), phi) 
File "Test.py", line 32, in G 
return F_phi(pi/2,phi,phi0,H0) 
File "Test.py", line 30, in F_phi 
return simplify(diff(F(theta,phi,phi0,H0),phi)) 
File "Test.py", line 28, in F 
return -(a*H0)*k(theta,phi,phi0)+b*(cos(theta)**2)+c*(sin(2*theta)**2)+sin(theta)**4*sin(2*phi)**2 
File "Test.py", line 26, in k 
return np.vdot(m(theta,phi),h(phi0)) 
File "Test.py", line 22, in m 
return np.array([sin(theta)*cos(phi), sin(theta)*cos(phi), cos(phi)]) 
AttributeError: cos 

. 그래서 저는 cos 함수에 문제가 없습니다. 어떤 도움이 필요합니까?

+2

전체 추적을 포함하십시오. 예외를 발생시키는 속성 액세스가 여기에 없으므로 일부 코드가 누락되었을 수 있습니다. –

+0

죄송합니다. 포함 된 코드가 충분하다고 생각했습니다. 전체 코드와 추적 코드를 포함하도록 게시물을 편집했습니다. – aymenbh

+0

수입을 수정 한 후 IndexError는 아마도 같은 원인으로 인해 사라질 것입니다. 그것은 단지 내가 코멘트에 알려주지 않는 경우! – jorgeca

답변

7

다른 네임 스페이스에서 각 패키지를 가져 오는 대신 별표 가져 오기를 사용하는 것이 문제입니다.

cos 이름으로이 수입 기능 sympy.functions.elementary.trigonometric.cos : 그 후

from sympy import * 

, 이전의 정의 덮어 쓰기, 이름 cos에서 <ufunc 'cos'>를 가져옵니다 다음

from scipy import * 

를, 그것은 이전 cos을 덮어 씁니다 (matplotlib 패키지에서 가져온 것과 똑같은 함수의 다른 사본으로) :

from pylab import * 

이 또한 <ufunc 'cos'>이지만 np.cos 이름 아래에 가져옵니다. 이 적절한 물건을 가져 오는 방법입니다 : 결국

import numpy as np 

, 당신은 sympy 개체를 수레에 자신을 적용하지 않는 방법을 알고 코사인 함수의 복사본이 남아 있습니다. 이 함수를 phi과 같은 sympy 객체에 적용하려고하면 AttributeError이됩니다. 대체로이 특정 문제에 대한 해결책은 수입을 수정하고 sympy 또는 numpy의 함수를 원한다면 알 수 있습니다.

+0

방금 ​​sympy에서 가져온 것을 보관했지만 IndexError는 사라졌지 만 여전히 다른 게시물에서 해결할 문제가 있습니다. – aymenbh

1

cos 함수를 가져 왔습니까? 그것은 sinmath 모듈에

from math import cos 

같은 일입니다.

+0

수학 모듈에서 함수를 가져 오려고하면이 오류와 거의 동일한 추적 표시가 나타납니다. "File"/usr/lib64/python2.7/site-packages/sympy/core/expr.py ", 221 행 , in __float__ raise TypeError ("표현식을 부동 상태로 변환 할 수 없습니다.") TypeError : 표현식을 부동 상태로 변환 할 수 없습니다. " 하지만 sympy에서 가져올 때, 다음과 같이 나타납니다. "file"/usr/lib64/python2.7/site-packages/numpy/lib/function_base.py ", 984 줄, diff slice1 [axis] = slice (1, None) IndexError : 목록 할당 색인이 범위를 벗어남 " – aymenbh

+0

그는 4 번 가져 왔습니다 ... (같은 이름으로 3 번). 이 문제를 해결 한 후에 그는 다른 문제 (IndexError)를 남겼으나 다른 질문이되어야 할 것입니다. – jorgeca

관련 문제