我试图绘制一个具有轨道角动量的LG激光脉冲,方程依赖于柱坐标中的3个变量r
,theta
和z
,激光脉冲的场依赖于这3个坐标,并且随着它在介质中传播而旋转。
为了将该字段绘制为彩色Map,我使用r
,theta
和z
坐标创建了一个3D meshgrid
,但生成的图看起来不像是旋转的。我卡住了,不明白这个问题。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
# Defined Parameters
p = 1 # The order of the Laguerre polynomial
m = 1 #The azimuthal order of the pulse
theta0 = 0
r0 = 20e-6
E0 = 1.22e+12 #V/m
k0 = 536625
r = np.linspace(0, 20e-6, 100)
theta = np.linspace(0, np.pi, 100)
z = np.linspace(-3, 0, 100)
f = np.sqrt(np.math.factorial(p)/(np.math.factorial(m+p)))*((np.sqrt(2)*r/r0)**m)*(2*r**2/r0**2)*np.cos(m*(theta-theta0))
# Define the equation E = f(r, theta, z)
def equation(r, theta, z):
return E0*f*np.exp(-r**2/r0**2)*np.cos(k0*z)
# Generate data for the plot
X, Y, Z = np.meshgrid(r, theta, z)
E = equation(X, Y, Z)
# Create a 3D density plot
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# Plot the density using a colormap
density_plot = ax.scatter(Z, Y, X, c=E, cmap='plasma', s=1)
# Add a colorbar to the plot
cbar = plt.colorbar(density_plot)
cbar.set_label('E Value')
# Set axis labels
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
# Show the plot
plt.show()
生成的图是这样的:
然而,它应该看起来像这样,旋转r
,theta
和z
。
1条答案
按热度按时间vsdwdz231#
解决方案
有几个不同的事情,你需要改变,以修复你的代码。主要问题是,当你绘制你使用的数据不转换为carnival坐标。
ax.scatter(...)
函数采取的位置参数为x,y,z
而不是r,θ,z
。此外,你的θ
的边界是错误的,需要移动几行代码来使它全部工作。第一步
你应该做的第一件事是将
f = np.sqrt(...)
移动到def equation(...)
函数中。这是因为f
的值会随着theta
的值而变化,而theta
在函数中并不是恒定的。修改后的输出。x1c 0d1x
第二步
将您的圆柱坐标值转换为直角坐标!这使得
ax.scatter(...)
可以适当地绘制您的数据。修改后的输出。
第三步
更改
θ
的边界以创建完整的圆柱体而不是半个(2π
而不是π
)。修改后的输出。
最终产品
即使解决了阴谋问题,您的输出将不会像上面的图像。这是因为您用于计算
E
的公式是不正确的。这里是我尝试修复错误的一些代码。我还更改了E
的公差级别,以便只绘制极值,更容易看到螺旋线。请参阅Laser Resonators and Beam Propagation的第222页Hodgson和Weber对所用方程的完整描述。代码