【问题标题】:Python AttributeError:cosPython 属性错误:cos
【发布时间】:2012-10-31 10:10:53
【问题描述】:

我正在尝试使用 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 函数的问题。有什么帮助吗?

【问题讨论】:

  • 请包含完整的回溯;这里没有属性访问导致异常,所以我们也可能遗漏了一些代码。
  • 对不起,我认为我包含的代码已经足够了。我编辑了帖子以包含整个代码和回溯。
  • 修复导入后,IndexError 可能会消失,因为它具有相同的原因。如果它不只是让我在评论中知道!

标签: python nonlinear-functions


【解决方案1】:

您是否导入了cos 函数?它在math 模块中

from math import cos

sin 也是如此。

【讨论】:

  • 当我尝试从数学模块导入函数时,我得到了几乎相同的回溯,并出现此错误:“文件”/usr/lib64/python2.7/site-packages/sympy/core/ expr.py",第 221 行,在 float 中引发 TypeError("can't convert expression to float") TypeError: can't convert expression to float"。但是当我从 sympy 导入它们时,我得到了这个:“文件”/usr/lib64/python2.7/site-packages/numpy/lib/function_base.py”,第 984 行,在 diff slice1[axis] = slice(1 , None) IndexError: list assignment index out of range"
  • 他导入了4次...(3次同名)。解决这个问题后,他还有其他问题(IndexError),但也许这应该是一个不同的问题?
【解决方案2】:

问题在于使用星号导入,而不是在不同的命名空间下导入每个包。

这会在 cos 名称下导入函数 sympy.functions.elementary.trigonometric.cos

from sympy import *

之后,你在cos这个名字下导入&lt;ufunc 'cos'&gt;,覆盖之前的定义:

from scipy import *

然后,它用完全相同的函数的另一个副本(来自 matplotlib 包)覆盖以前的 cos 函数:

from pylab import *

这也会导入相同的 &lt;ufunc 'cos'&gt;,但名称为 np.cos这是导入东西的正确方法

import numpy as np

最后,你会得到一份 cos 函数的副本,它知道如何将自身应用于浮点数,而不是 sympy 对象。当您尝试将该函数应用于像phi 这样的sympy 对象时,您会得到AttributeError。总而言之,这个特定问题的解决方案是修复导入并知道您是想要来自 sympy 的函数还是来自 numpy 的函数。

【讨论】:

  • 我只是保留了 sympy 的导入,IndexError 消失了,但我仍然有一个问题,我将在另一篇文章中解决。
猜你喜欢
  • 2014-03-21
  • 2013-07-01
  • 2011-10-12
  • 1970-01-01
  • 2016-05-01
  • 2021-07-24
  • 2018-10-29
  • 2015-11-20
  • 2017-06-16
相关资源
最近更新 更多