sympy属性错误:' Pow'对象没有属性' sin'

时间:2017-04-09 14:32:07

标签: python numpy sympy

我已阅读this SO post,其中称命名空间冲突是导致此错误的原因之一。我经常遇到这个错误。那么,我想学习这里到底发生了什么?图书馆的期望是什么?

编辑:fun = lambda x: 4*x*(np.sin(x**2) - 3)*np.cos(x**2)来自一个测试用例,所以实际上我一定会将它用作函数' fun'。很抱歉错过了这些信息。请讨论尊重这种约束。

EDIT2:这是重现代码的错误,而不是完整的脚本。 任务用于计算输入函数的微分,该函数可以通过使用具有扰动Δ= 10 -8的前向差分近似来评估numpy数组。

代码:

import sympy
import numpy as np 

# TESTING...
x = sympy.Symbol('x')
fun = lambda x:  4*x*(np.sin(x**2) - 3)*np.cos(x**2)  
print fun
h = 10e-8  #perturbation
print fun(x)
print fun(x+h)
df = (fun(x+h) - fun(x)) / h
print "diff is:", df

错误:

<function <lambda> at 0x000000001068E2E8>
Traceback (most recent call last):

  File "<ipython-input-75-0582d8ebb11b>", line 1, in <module>
    runfile('D:/test_hw3.py', wdir='D:')

  File "D:\anaconda\lib\site-packages\spyder\utils\site\sitecustomize.py", line 866, in runfile
    execfile(filename, namespace)

  File "D:\anaconda\lib\site-packages\spyder\utils\site\sitecustomize.py", line 87, in execfile
    exec(compile(scripttext, filename, 'exec'), glob, loc)

  File "D:/test_hw3.py", line 23, in <module>
    print fun(x)

  File "D:/test_hw3.py", line 20, in <lambda>
    fun = lambda x:  4*x*(np.sin(x**2) - 3)*np.cos(x**2)
AttributeError: 'Pow' object has no attribute 'sin'

2 个答案:

答案 0 :(得分:2)

您应该使用sympy.sin / cos代替np.sin / cos。 Numpy不知道如何处理同情表达。

fun = lambda x: 4 * x * (sympy.sin(x**2) - 3) * sumpy.cos(x**2)  

另一方面,如果您必须保留np.sin,那么您应该fun发送一个sympy变量。相反,df应该成为一个函数。

fun = lambda x:  4*x*(np.sin(x**2) - 3)*np.cos(x**2)  
h = 1e-8

df = lambda x: (fun(x+h) - fun(x)) / h

# usage:
df( np.array([1.0, 2.0, 3.0, 4.0]) )

BTW,sympy已经有diff函数来计算导数。

df = sympy.diff(fun(x), x)

答案 1 :(得分:0)

函数fun使用np.sinnp.cos,它们是numpy函数,只接受numpy识别的data types参数。当你执行fun(x)时,你给numpy函数提供了一个sympy对象,numpy无法识别,提出这个“神秘”的错误信息。

请注意,使用语句fun定义lambda x:...时,x在定义中被视为有效数据类型的虚拟变量名称(即使您已定义{{ 1}}以上作为同情符号)。