2017-04-09 104 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符號)。