从公式到图形:用Python+Matplotlib亲手绘制你的第一个天线方向图
·
从公式到图形:用Python+Matplotlib亲手绘制你的第一个天线方向图
天线方向图是理解天线辐射特性的关键工具,但教科书上的数学公式往往让初学者望而生畏。本文将带你用Python和Matplotlib,从零开始构建一个偶极子天线的二维和三维方向图,让抽象的方向性函数F(θ,φ)变得触手可及。
1. 环境准备与基础理论
在开始编码前,我们需要搭建开发环境并理解几个核心概念。推荐使用Anaconda创建Python 3.8+的虚拟环境,安装以下包:
conda create -n antenna python=3.8
conda activate antenna
pip install numpy matplotlib scipy ipykernel
关键概念速览 :
- 方向性函数F(θ,φ) :描述天线辐射场强在空间中的相对分布
- 方向性系数D :表征天线在特定方向的辐射强度与理想全向天线的比值
- 增益G :考虑天线效率的方向性系数
对于半波偶极子天线,其方向性函数可简化为:
def F_theta(theta):
return np.abs(np.cos(np.pi/2 * np.cos(theta)) / np.sin(theta))
2. 二维方向图绘制实战
让我们先从简单的二维极坐标图开始。在Jupyter Notebook中新建单元格,输入以下代码:
import numpy as np
import matplotlib.pyplot as plt
theta = np.linspace(0, 2*np.pi, 361) # 0-360度,1度间隔
F = np.abs(np.cos(np.pi/2 * np.cos(theta)) / np.sin(theta))
F = np.nan_to_num(F) # 处理θ=0和θ=π时的奇异点
plt.figure(figsize=(8,8))
ax = plt.subplot(111, projection='polar')
ax.plot(theta, F, linewidth=2)
ax.set_title("半波偶极子天线二维方向图", pad=20)
ax.grid(True)
plt.show()
关键参数解析 :
| 参数 | 说明 | 典型值 |
|---|---|---|
| theta | 极角(弧度) | 0-2π |
| F | 方向性函数值 | 0-1.64 |
| projection | 坐标系类型 | 'polar' |
运行后会得到一个典型的"8字形"方向图,这正是偶极子天线的特征辐射模式。
3. 三维方向图进阶实现
要更全面地观察天线辐射特性,我们需要绘制三维方向图。首先扩展我们的函数:
from mpl_toolkits.mplot3d import Axes3D
def F_3d(theta, phi):
"""三维方向性函数"""
return F_theta(theta) # 偶极子天线φ对称
theta = np.linspace(0, np.pi, 91) # 0-180度
phi = np.linspace(0, 2*np.pi, 361)
Theta, Phi = np.meshgrid(theta, phi)
F = F_3d(Theta, Phi)
# 转换为笛卡尔坐标用于3D绘图
X = F * np.sin(Theta) * np.cos(Phi)
Y = F * np.sin(Theta) * np.sin(Phi)
Z = F * np.cos(Theta)
然后绘制三维图形:
fig = plt.figure(figsize=(12,10))
ax = fig.add_subplot(111, projection='3d')
# 绘制表面图
surf = ax.plot_surface(X, Y, Z, cmap='jet',
rstride=5, cstride=5,
linewidth=0, antialiased=False)
# 美化图形
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')
ax.set_title('半波偶极子天线三维方向图')
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.tight_layout()
提示:在Jupyter中运行3D绘图时,记得使用
%matplotlib widget魔法命令获得交互式旋转视图。
4. 方向性系数与增益计算
理解了方向图后,我们可以进一步计算方向性系数D。根据理论:
from scipy.integrate import dblquad
# 计算分母积分
def integrand(theta, phi):
return F_3d(theta, phi)**2 * np.sin(theta)
integral, _ = dblquad(integrand, 0, 2*np.pi, lambda x: 0, lambda x: np.pi)
D_max = 4 * np.pi / integral
print(f"最大方向性系数D_max = {D_max:.2f} (约2.15 dBi)")
效率与增益的关系 :
- 辐射效率η = P_radiated / P_input
- 增益G = η × D
假设我们的天线效率为90%,则:
eta = 0.9
G_max = eta * D_max
print(f"最大增益G_max = {G_max:.2f} (约1.84 dB)")
5. 高级可视化技巧
为了让图形更具专业感,我们可以添加以下增强功能:
多子图对比 :
fig = plt.figure(figsize=(16,6))
# 直角坐标系方向图
ax1 = fig.add_subplot(131)
ax1.plot(np.degrees(theta), F_theta(theta))
ax1.set_xlabel('θ (度)')
ax1.set_ylabel('F(θ)')
ax1.grid(True)
# 极坐标方向图
ax2 = fig.add_subplot(132, projection='polar')
ax2.plot(theta, F_theta(theta))
ax2.set_title("极坐标视图")
# 3D方向图
ax3 = fig.add_subplot(133, projection='3d')
ax3.plot_surface(X, Y, Z, cmap='jet', alpha=0.7)
ax3.set_title("3D辐射模式")
plt.tight_layout()
添加等高线 :
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')
# 绘制表面
surf = ax.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8)
# 添加等高线
cset = ax.contour(X, Y, Z, zdir='z', offset=-1.5, cmap='coolwarm')
cset = ax.contour(X, Y, Z, zdir='x', offset=-1.5, cmap='coolwarm')
cset = ax.contour(X, Y, Z, zdir='y', offset=1.5, cmap='coolwarm')
# 设置视角
ax.view_init(elev=30, azim=45)
ax.set_box_aspect([1,1,1])
plt.colorbar(surf, ax=ax, shrink=0.5)
6. 实际应用与扩展
掌握了基础绘图方法后,我们可以进一步探索:
不同天线类型的实现 :
- 抛物面天线:方向性函数更尖锐
- 八木天线:具有更强的方向性
- 贴片天线:适合特定极化方向
方向图参数提取 :
# 计算3dB波束宽度
max_F = np.max(F)
half_power = max_F / np.sqrt(2)
idx = np.where(F >= half_power)[0]
beamwidth = np.degrees(theta[idx[-1]] - theta[idx[0]])
print(f"3dB波束宽度 = {beamwidth:.1f}°")
天线阵列可视化 : 通过叠加多个天线单元的方向图,可以构建更复杂的辐射模式。例如2元阵列:
# 阵列因子
d = 0.5 # 半波长间距
beta = 0 # 相位差
AF = 2 * np.cos((np.pi*d*np.sin(Theta)*np.cos(Phi) + beta)/2)
# 总方向图
F_array = F * AF
# 绘制阵列方向图...
在完成这些可视化后,你会发现教科书上的公式不再抽象。通过调整参数观察图形变化,能直观理解天线参数对辐射特性的影响。比如改变偶极子长度,方向图会如何变化?尝试修改代码中的参数,立即看到可视化结果,这是传统理论学习无法提供的即时反馈。
更多推荐
所有评论(0)