2012-11-11 72 views
2

我试图用Python2.7在数值上求解一个方程。这是整个代码:Python属性错误: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 

,这是我必须回溯:

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函数的问题。任何帮助?

+2

请包括完整的追溯;在这里没有任何属性访问*引起异常,所以我们也可能会丢失一些代码。 –

+0

对不起,我认为我包含的代码是足够的。我编辑帖子以包含整个代码和回溯。 – aymenbh

+0

修复导入后,IndexError可能会消失,因为它具有相同的原因。如果它不只是让我知道在评论! – jorgeca

回答

7

问题是使用星形导入,而不是在不同名称空间下导入每个软件包。

cos名此导入功能sympy.functions.elementary.trigonometric.cos

from sympy import * 

之后,导入<ufunc 'cos'>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功能?这是math模块

from math import cos 

同样的事情sin

+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,无) IndexError:列表分配索引超出范围“ – aymenbh

+0

他导入了4次...(同名3个)。修复后,他留下了其他问题(IndexError),但也许这应该是一个不同的问题? – jorgeca