尝试绘制任意三维函数时出错

2024-04-29 07:19:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为我的多元微积分课程做一个项目,我的目标是绘制一个任意函数f(x,y),使用等高线图绘制偏导数(df/dx,df/dy)和函数梯度的箭图,但是我在绘制更复杂的函数时遇到了一个问题。你知道吗

对于函数输入,如f(x,y)=(x+y)**2,程序运行良好,输出图形,但当我使用需要更复杂数学概念的输入时(即:f(x,y)=sin(x*y))。我得到一个错误:

TypeError:只有length-1数组可以转换为Python标量。你知道吗

stackoverflow上有很多这样的案例,但它们似乎都是涉及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()

Tags: 函数importnumpydfplotnp绘制function
1条回答
网友
1楼 · 发布于 2024-04-29 07:19:43

解决方案很简单:您需要指定与lambdify一起使用的包

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

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

如果我们仔细看一下sympy的documentation,就很容易理解为什么polinamals不指定"numpy"就可以工作了。如果没有指定包,sympy将按此顺序尝试python-mathnumpympmath。现在python数学x与numpy x并没有什么不同,但是python数学sin有很大的不同,因为它不能处理numpy数组。你知道吗

最后一件事:sympy(1.1.1+)的更新版本表现为differently。在这些新版本中,sympy.lambdify将尝试使用numpy作为默认值,如果安装时不使用math, mpmath, sympy。你知道吗

相关问题 更多 >