2017-08-01 66 views
1

我正在爲多變量微積分課程開發一個項目,我的目標是繪製任意函數f(x,y),使用輪廓圖繪製偏導數(df/dx,df/dy)和函數梯度的抖動圖,但是在繪製更復雜的函數時我遇到了一個問題。對於像f(x,y)=(x + y)** 2這樣的函數輸入,程序工作正常並輸出圖形,但是當我使用需要更復雜數學概念的輸入時(即:f 。X,Y)= SIN(X * Y)我得到一個錯誤:嘗試繪製任意3d函數時出錯

類型錯誤:只有長度爲1的陣列可以被轉換到Python標量

有很多關於計算器的這個箱子,但它們似乎都是涉及numpy/sympy衝突的孤立事件,在我的程序中,我依賴創建任意函數的sympy和數組計算的numpy,所以我不知道如何解決這個問題。

''' 
Imports 
''' 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import axes3d 
import numpy as np 
from sympy import * 

x = Symbol('x') 
y = Symbol('y') 

lims = [-10, 10] 
function = sin(x+y) 
lam_function = lambdify((x,y),function) 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
gX, gY = np.meshgrid(np.arange(lims[0], lims[1], 0.05), 
        np.arange(lims[0], lims[1], 0.05)) 
z = lam_function(gX, gY) 
plot = ax.plot_surface(gX, gY, z, cmap=plt.cm.jet, linewidth=0) 
plt.colorbar(plot, cmap=plt.cm.jet) 
plt.show() 
+0

你可以調整你的示例代碼,不依賴用戶輸入嗎?事實上,我不能嘗試重現你的錯誤,因爲我不知道你給代碼輸入了什麼。您還正在導入很多您似乎沒有使用的內容,這使得很難看到代碼中會發生什麼。 – Blckknght

+0

@Blckknght我編輯了代碼來顯示引發錯誤的確切函數,並刪除了所有無用的導入。 – BooleanDesigns

回答

1

解決辦法很簡單:你需要指定其包裝與lambdify

lam_function = sym.lambdify((x,y), function, "numpy") 

這使用將確保生成的功能將是numpy的兼容。這適用於sin, cos, atan, log等基本功能,但對於更復雜的功能可能會失敗,例如sympy.lowergamma

現在至於爲什麼polinamials工作沒有指定"numpy"很容易理解,如果我們仔細看sympy的documentation。如果沒有指定包裝,sympy將按此順序嘗試python-math,numpympmath。現在python-math x與numpy x並沒有太大差別,但python-math sin與它無法處理numpy數組有很大不同。

最後一件事:較新版本的sympy(1.1.1+)表現爲differently。在這些新版本中,sympy.lambdify將嘗試使用numpy作爲默認值,如果未安裝,則請求math, mpmath, sympy