2017-08-01 61 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