2017-04-09 103 views
-1

我已阅读this SO post其中说名称空间冲突是导致此错误的原因之一。我经常遇到这个错误。所以,我想了解究竟发生了什么?图书馆期望什么?sympy AttributeError:'Pow'对象没有属性'sin'

编辑:fun = lambda x: 4*x*(np.sin(x**2) - 3)*np.cos(x**2)来自一个测试案例,所以我几乎必须使用它作为'fun'函数。对不起,错过了这些信息。请讨论尊重这个约束。

编辑2:这是一个错误再现代码,而不是完整的脚本。 任务是通过使用扰动Δ= 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

你应该使用sympy.sin/cos而不是np.sin/cos。 Numpy不知道如何使用sympy表达式。

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

在另一方面,如果你必须保持np.sin,那么你应该一个sympy变量发送到fun。相反,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])) 

顺便说一句,已经sympy具有diff函数来计算的导数。

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

请问您可以根据我的编辑检查您的答案。谢谢。 – devautor

+0

@devautor你真的应该使用sympy吗? – kennytm

+0

是的,我是。你有其他选择吗? [虽然我的要求不会让我追求他们这个任务] – devautor

0

功能fun使用np.sinnp.cos,这是接受由numpy的认可参数仅data types numpy的功能。当你做fun(x)你给numpy函数一个sympy对象的参数,这个numpy不能识别,引发这个“神秘”的错误信息。

注意,当你使用语句lambda x:...定义funx在定义视为一个虚拟变量名称一个有效的数据类型(即使你在上面定义x为sympy符号)。