从公式到图形:用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

# 绘制阵列方向图...

在完成这些可视化后,你会发现教科书上的公式不再抽象。通过调整参数观察图形变化,能直观理解天线参数对辐射特性的影响。比如改变偶极子长度,方向图会如何变化?尝试修改代码中的参数,立即看到可视化结果,这是传统理论学习无法提供的即时反馈。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐