尝试绘制任意3d函数时出错

时间:2017-08-01 20:48:33

标签: python numpy matplotlib sympy

我正在研究我的多变量微积分类的项目,我的目标是绘制任意函数f(x,y),使用等高线图来绘制偏导数(df / dx,df / dy)和a函数渐变的箭头图,但在绘制更复杂的函数时我遇到了问题。

对于像f(x,y)=(x + y)** 2这样的函数输入,程序可以很好地输出图形,但是当我使用需要更复杂数学概念的输入时(即:f(x) ,y)= sin(x * y)。我收到错误:

TypeError:只能将length-1数组转换为Python标量。

在stackoverflow上有很多这种情况,但它们似乎都是涉及numpy / 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()

1 个答案:

答案 0 :(得分:1)

解决方案很简单:您需要指定要与lambdify

一起使用的包
lam_function = sym.lambdify((x,y), function, "numpy")

这将确保生成的函数与numpy兼容。这适用于sin, cos, atan, log等基本功能,但对于sympy.lowergamma等更复杂的功能可能会失败。

现在,如果我们仔细研究一下同情的documentation,为什么polinamials在没有指定"numpy"的情况下工作很容易理解。如果未指定任何包,则sympy将按此顺序尝试python-mathnumpympmath。现在python-math x与numpy x并没有什么不同,但是python-math sin有很多不同,因为它无法处理numpy数组。

最后一件事:较新版本的sympy(1.1.1+)表现为differently。在这些新版本中sympy.lambdify会尝试使用numpy作为默认设置(如果不安装,请使用math, mpmath, sympy