Ошибка атрибута Python: cos

Я пытаюсь численно решить уравнение, используя Python2.7. Это весь код:

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

и это трассировка, которая у меня есть:

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

Я использую библиотеки sympy, numpy и pylab. Итак, у меня нет проблем с функцией cos. Любая помощь?


person aymenbh    schedule 11.11.2012    source источник
comment
Пожалуйста, включите полную трассировку; здесь нет доступа к атрибуту, чтобы вызвать исключение, поэтому мы также, вероятно, упустили какой-то код.   -  person Martijn Pieters    schedule 12.11.2012
comment
Извините, я думал, что код, который я включил, был достаточным. Я отредактировал сообщение, включив в него весь код и трассировку.   -  person aymenbh    schedule 12.11.2012
comment
После исправления импорта IndexError, вероятно, исчезнет, ​​потому что у него та же причина. Если это не просто дайте мне знать в комментарии!   -  person jorgeca    schedule 12.11.2012


Ответы (2)


Проблема заключается в использовании звездочного импорта вместо импорта каждого пакета в другое пространство имен.

Это импортирует функцию sympy.functions.elementary.trigonometric.cos под именем cos:

from sympy import *

После этого вы импортируете <ufunc 'cos'> под именем cos, перезаписывая предыдущее определение:

from scipy import *

Затем он перезаписывает предыдущую функцию cos другой копией точно такой же функции (из пакета matplotlib):

from pylab import *

Это также импортирует тот же <ufunc 'cos'>, но под именем np.cos. Это правильный способ импорта вещей:

import numpy as np

В конце концов, у вас остается копия функции cos, которая знает, как применять себя к объектам с плавающей запятой, а не к объектам sympy. Когда вы пытаетесь применить эту функцию к объектам sympy, таким как phi, вы получаете ошибку AttributeError. В общем, решение этой конкретной проблемы состоит в том, чтобы исправить импорт и узнать, нужны ли вам функции из sympy или функции из numpy.

person jorgeca    schedule 12.11.2012
comment
Я просто сохранил импорт из sympy, ошибка IndexError исчезла, но у меня все еще есть проблема, о которой я расскажу в другом посте. - person aymenbh; 12.11.2012

Вы импортировали функцию cos? Он находится в модуле math

from math import cos

То же самое для sin.

person Óscar López    schedule 11.11.2012
comment
Когда я пытаюсь импортировать функции из математического модуля, я получаю почти такую ​​же трассировку с этой ошибкой: Файл /usr/lib64/python2.7/site-packages/sympy/core/expr.py, строка 221, в float поднять TypeError (невозможно преобразовать выражение в число с плавающей запятой) TypeError: невозможно преобразовать выражение в число с плавающей запятой. Но когда я импортирую их из sympy, я получаю следующее: Файл /usr/lib64/python2.7/site-packages/numpy/lib/function_base.py, строка 984, в diff slice1[ось] = slice(1, None) IndexError: индекс назначения списка вне допустимого диапазона - person aymenbh; 12.11.2012
comment
Он импортировал его 4 раза... (3 раза под одним и тем же именем). После исправления у него остались другие проблемы (IndexError), но, может быть, это должен быть другой вопрос? - person jorgeca; 12.11.2012