Python f(x,y,t)dt积分的三维图形绘制问题

Python f(x,y,t)dt积分的三维图形绘制问题,python,matplotlib,plot,spyder,integral,Python,Matplotlib,Plot,Spyder,Integral,我已经定义了一个函数I(a,b)=积分f(a,b,t)dt,并想要绘制它,看看它如何依赖于变量a和b。我第一次写了一个程序,把y=I(k,x)绘成图形,它工作得很好,但我想看看它是如何依赖于这两个变量的,所以我试着写一个程序,用3D绘制它 该程序适用于三角函数和多项式等更简单的函数,但当我尝试绘制i(x,y)时,它只会给我一个错误:“具有多个元素的数组的真值不明确。请使用a.any()或a.all() 这是代码,我最初编写了自己的程序来近似积分,但后来使用了scipy from mpl_tool

我已经定义了一个函数I(a,b)=积分f(a,b,t)dt,并想要绘制它,看看它如何依赖于变量a和b。我第一次写了一个程序,把y=I(k,x)绘成图形,它工作得很好,但我想看看它是如何依赖于这两个变量的,所以我试着写一个程序,用3D绘制它

该程序适用于三角函数和多项式等更简单的函数,但当我尝试绘制i(x,y)时,它只会给我一个错误:“具有多个元素的数组的真值不明确。请使用a.any()或a.all()

这是代码,我最初编写了自己的程序来近似积分,但后来使用了scipy

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np
import scipy.integrate as integrate

def integral(x,y):
    return integrate.quad(lambda t: np.sqrt((x**2 + y**2 - 2*x*y*np.cos(np.pi*t*(np.sqrt(1/x**3) - np.sqrt(1/y**3))))/(x**3*y**3)), 0,  np.sqrt(x**3*y**3))

X = np.arange(0.1,5,0.1)
Y = np.arange(0.1,5,0.1)
X,Y = np.meshgrid(X, Y)
Z = integral(X,Y)


fig = plt.figure()
ax = plt.axes(projection="3d")
ax.plot_wireframe(X, Y, Z, color='green')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')


ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
                cmap='winter', edgecolor='none')
ax.set_title('copper');

plt.show()
'''


scipy.integrate.quad
返回一个元组。您只需要它的第一个值。您还需要对函数进行矢量化

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import scipy.integrate as integrate

def integral(x,y):
    return integrate.quad(lambda t: np.sqrt((x**2 + y**2 - 2*x*y*np.cos(np.pi*t*(np.sqrt(1/x**3) - np.sqrt(1/y**3))))/(x**3*y**3)), 0,  np.sqrt(x**3*y**3))[0]

X = np.arange(0.1,5,0.1)
Y = np.arange(0.1,5,0.1)
X,Y = np.meshgrid(X, Y)
Z = np.vectorize(integral)(X,Y)

fig = plt.figure()
ax = plt.axes(projection="3d")
ax.plot_wireframe(X, Y, Z, color='green')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')


ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
                cmap='winter', norm=plt.Normalize(np.nanmin(Z), np.nanmax(Z)), edgecolor='none')

plt.show()

所以我的原始代码(没有使用scipy)的问题是我没有将其矢量化?为什么我需要对这个函数进行向量化,而不需要对其他函数进行向量化,例如np.sin(x,y)?Numpy函数已经进行了向量化,即您可以计算
np.sin([1,2,3,4])