复杂函数 3D 绘图

A complex function 3D plot

提问人:SAHAR GOHARSHENASAN 提问时间:10/3/2023 最后编辑:Trenton McKinneySAHAR GOHARSHENASAN 更新时间:10/3/2023 访问量:85

问:

我有一个复杂的函数,想使用 Matplotlib 绘制 3D 图形。 这是我的代码:

import numpy as np
from mpl_toolkits import mplot3d
import matplotlib.pyplot as plt
plt.style.use('seaborn-poster')
fig = plt.figure(figsize = (10,10))
ax = plt.axes(projection='3d')
           
x = np.arange(-23, 23, 0.1)
y = np.arange(-23, 23, 0.1)           


x1=25
y1=22
x2=15
y2=17
x3=25
y3=12
A1=np.exp(np.deg2rad(0.0) * 1j)
A2=np.exp(np.deg2rad(10.) * 1j)
A3=np.exp(np.deg2rad(20.) * 1j)
z=(((2*A1*(y1-y))/((x1-x)**2+(y1-y)**2))+((2*A2*(y2-y))/((x2-x)**2+(y2-y)**2))+((2*A3*(y3-y))/((x3-x)**2+(y3-y)**2)))
z_abs=np.abs(z)

X, Y = np.meshgrid(x, y)
Z = z_abs(X, Y)

surf = ax.plot_surface(X, Y, Z, cmap = plt.cm.cividis)
# Set axes label
ax.set_xlabel('x', labelpad=20)
ax.set_ylabel('y', labelpad=20)
ax.set_zlabel('z', labelpad=20)

fig.colorbar(surf, shrink=0.5, aspect=8)

plt.show()

但是在运行代码时,我收到以下错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[5], line 22
     19 z_abs=np.abs(z)
     21 X, Y = np.meshgrid(x, y)
---> 22 Z = z_abs(X, Y)
     24 surf = ax.plot_surface(X, Y, Z, cmap = plt.cm.cividis)
     25 # Set axes label

TypeError: 'numpy.ndarray' object is not callable

我认为函数的虚部是问题所在。

python numpy 复数 matplotlib-3d

评论

4赞 Trenton McKinney 10/3/2023
Z = z_abs(X, Y)鉴于? 只是一个数组。z_abs=np.abs(z)z_abs(460,)
0赞 SAHAR GOHARSHENASAN 10/3/2023
对不起,我不明白。我只是想删除虚构的部分,使其成为一个真正的功能。

答:

0赞 jared 10/3/2023 #1

正如错误所说,是一个 numpy 数组。您正在尝试通过执行 来调用该数组,这是不可能的。相反,您可能希望创建与创建方式类似的创建方式,但使用 and 而不是 和 。然后,您可以获取该结果的绝对值进行绘图。z_absz_abs(X, Y)ZzXYxy

Z = (((2*A1*(y1-Y))/((x1-X)**2+(y1-Y)**2))+((2*A2*(y2-Y))/((x2-X)**2+(y2-Y)**2))+((2*A3*(y3-Y))/((x3-X)**2+(y3-Y)**2)))
Z_abs = np.abs(Z)

这是我在进行这些更改后得到的:

1赞 Davide_sd 10/3/2023 #2

@jared正确地识别了问题:U 已经是一个 Numpy 数组,无法调用(它不是一个函数)。您可以像以下示例中一样定义复杂函数:z_abs

import numpy as np
from mpl_toolkits import mplot3d
import matplotlib.pyplot as plt
# plt.style.use('seaborn-poster')

fig = plt.figure()
ax = plt.axes(projection='3d')

x1=25
y1=22
x2=15
y2=17
x3=25
y3=12
A1=np.exp(np.deg2rad(0.0) * 1j)
A2=np.exp(np.deg2rad(10.) * 1j)
A3=np.exp(np.deg2rad(20.) * 1j)

# this lambda function represents your "complex function"
z = lambda x, y: (((2*A1*(y1-y))/((x1-x)**2+(y1-y)**2))+((2*A2*(y2-y))/((x2-x)**2+(y2-y)**2))+((2*A3*(y3-y))/((x3-x)**2+(y3-y)**2)))
# this lambda function represents the absolute value of your complex function
z_abs = lambda x, y: np.abs(z(x, y))

n = 250
x = np.linspace(13, 18, n)
y = np.linspace(15, 20, n)  
X, Y = np.meshgrid(x, y)
# now you can evaluate the absolute value
Z = z_abs(X, Y)

surf = ax.plot_surface(X, Y, Z, cmap = plt.cm.cividis)
# Set axes label
ax.set_xlabel('x', labelpad=20)
ax.set_ylabel('y', labelpad=20)

fig.colorbar(surf, shrink=0.5, aspect=8, label='abs(z)')

plt.show()

enter image description here

上面的图片不是很好。当然,你可以在某个地方看到一根杆子,但别无他物。如果我是你,我会绘制你的复函数的绝对值:log10

n = 250
x = np.linspace(13, 18, n)
y = np.linspace(15, 20, n)  
X, Y = np.meshgrid(x, y)
Z = np.log10(z_abs(X, Y))

fig = plt.figure()
ax = plt.axes(projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap = plt.cm.cividis)
ax.set_xlabel('x', labelpad=20)
ax.set_ylabel('y', labelpad=20)
fig.colorbar(surf, shrink=0.5, aspect=8, label='abs(z)')
plt.show()

enter image description here