aW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKCiMgPT09PT0g5Y+C5pWwID09PT09CmEgPSAyM2UtMyAgICAgICAgICAjIG0KYiA9IDEwZS0zICAgICAgICAgICMgbQpmID0gMzZlOSAgICAgICAgICAgIyBIegpjID0gM2U4ICAgICAgICAgICAgIyBtL3MKbSwgbiA9IDIsIDEgICAgICAgICMgVE0yMQoKIyA9PT09PSDorqHnrpfluLjmlbAgPT09PT0KZmMgPSBjLzIgKiBucC5zcXJ0KChtL2EpKioyICsgKG4vYikqKjIpCmxhbSA9IGMvZgpsYW1fZyA9IGxhbSAvIG5wLnNxcnQoMSAtIChmYy9mKSoqMikKYmV0YSA9IDIqbnAucGkgLyBsYW1fZwprYyA9IG5wLnBpICogbnAuc3FydCgobS9hKSoqMiArIChuL2IpKioyKQpvbWVnYSA9IDIqbnAucGkqZgplcHMwID0gOC44NTRlLTEyCkUwID0gMSAgIyDlvZLkuIDljJYKCiMgPT09PT0g5Zy65YiG6YeP5YWs5byP77yIVE0yMe+8jOWPluWunumDqO+8jHQ9MO+8iSA9PT09PQpkZWYgZ2V0X2ZpZWxkcyh4LCB5LCB6KToKICAgICMgeCx5LHog5Y2V5L2N5Z2H5Li6IG0KICAgIHNpbl9tID0gbnAuc2luKG0qbnAucGkqeC9hKQogICAgc2luX24gPSBucC5zaW4obipucC5waSp5L2IpCiAgICBjb3NfbSA9IG5wLmNvcyhtKm5wLnBpKngvYSkKICAgIGNvc19uID0gbnAuY29zKG4qbnAucGkqeS9iKQogICAgcGhhc2UgPSBucC5jb3MoYmV0YSp6KSAgIyDlj5blrp7pg6gKCiAgICBFeiA9IEUwICogc2luX20gKiBzaW5fbiAqIHBoYXNlCiAgICBFeCA9IC0xaiAqIChiZXRhICogbSpucC5waS9hKSAvIGtjKioyICogRTAgKiBjb3NfbSAqIHNpbl9uCiAgICBFeCA9IG5wLnJlYWwoRXggKiBucC5leHAoLTFqKmJldGEqeikpCiAgICBFeSA9IC0xaiAqIChiZXRhICogbipucC5waS9iKSAvIGtjKioyICogRTAgKiBzaW5fbSAqIGNvc19uCiAgICBFeSA9IG5wLnJlYWwoRXkgKiBucC5leHAoLTFqKmJldGEqeikpCiAgICBIeCA9IDFqICogKG9tZWdhKmVwczAgKiBuKm5wLnBpL2IpIC8ga2MqKjIgKiBFMCAqIHNpbl9tICogY29zX24KICAgIEh4ID0gbnAucmVhbChIeCAqIG5wLmV4cCgtMWoqYmV0YSp6KSkKICAgIEh5ID0gLTFqICogKG9tZWdhKmVwczAgKiBtKm5wLnBpL2EpIC8ga2MqKjIgKiBFMCAqIGNvc19tICogc2luX24KICAgIEh5ID0gbnAucmVhbChIeSAqIG5wLmV4cCgtMWoqYmV0YSp6KSkKICAgIEh6ID0gbnAuemVyb3NfbGlrZSh4KSAgIyBUTeaooSBIej0wCiAgICByZXR1cm4gRXgsIEV5LCBFeiwgSHgsIEh5LCBIegoKIyA9PT09PSDnvZHmoLwgPT09PT0KTiA9IDEwMAp4ID0gbnAubGluc3BhY2UoMCwgYSwgTikKeSA9IG5wLmxpbnNwYWNlKDAsIGIsIE4pClgsIFkgPSBucC5tZXNoZ3JpZCh4LCB5KQoKIyA9PT09PSDku7vliqEy77yaeHnmqKrmiKrpnaLliZbpnaLlm77vvIh6PTAsICZsYW1iZGE7LzgsICZsYW1iZGE7LzQsICZsYW1iZGE7LzLvvIkgPT09PT0Kel9saXN0ID0gWzAsIGxhbS84LCBsYW0vNCwgbGFtLzJdCnRpdGxlczIgPSBbJ3o9MCcsICd6PSZsYW1iZGE7LzgnLCAnej0mbGFtYmRhOy80JywgJ3o9JmxhbWJkYTsvMiddCmNvbXBfbmFtZXMgPSBbJ0V4JywgJ0V5JywgJ0V6JywgJ0h4JywgJ0h5JywgJ0h6J10KCmZvciBpZHgsIHogaW4gZW51bWVyYXRlKHpfbGlzdCk6CiAgICBFeCwgRXksIEV6LCBIeCwgSHksIEh6ID0gZ2V0X2ZpZWxkcyhYLCBZLCB6KQogICAgZmlnLCBheGVzID0gcGx0LnN1YnBsb3RzKDIsIDMsIGZpZ3NpemU9KDEyLCA4KSkKICAgIGZpZy5zdXB0aXRsZShmJ+S7u+WKoTLvvJp4eeaoquaIqumdouWJlumdouWbviAge3RpdGxlczJbaWR4XX0nLCBmb250c2l6ZT0xNCkKICAgIGNvbXBzID0gW0V4LCBFeSwgRXosIEh4LCBIeSwgSHpdCiAgICBmb3IgaSwgYXggaW4gZW51bWVyYXRlKGF4ZXMuZmxhdCk6CiAgICAgICAgaW0gPSBheC5jb250b3VyZihYKjEwMDAsIFkqMTAwMCwgY29tcHNbaV0sIGxldmVscz0yMCwgY21hcD0namV0JykKICAgICAgICBheC5zZXRfdGl0bGUoY29tcF9uYW1lc1tpXSkKICAgICAgICBheC5zZXRfeGxhYmVsKCd4IChtbSknKQogICAgICAgIGF4LnNldF95bGFiZWwoJ3kgKG1tKScpCiAgICAgICAgcGx0LmNvbG9yYmFyKGltLCBheD1heCkKICAgIHBsdC50aWdodF9sYXlvdXQoKQogICAgcGx0LnNob3coKQoKIyA9PT09PSDku7vliqEz77ya5aSn5bC65a+45Zy65YiG5biD5Zu+77yIfEV8IOaIliBFeiDliIbluIPvvIkgPT09PT0KIyDov5nph4znlLsgfEV8ID0gc3FydChFeF4yK0V5XjIrRXpeMinvvIzmm7Tnm7Top4LlsZXnpLrmgLvlnLoKIyAxLiB4eeW5s+mdou+8mno9MCwgJmxhbWJkYTsvOCwgJmxhbWJkYTsvNCwgJmxhbWJkYTsvMgp6X2xpc3QgPSBbMCwgbGFtLzgsIGxhbS80LCBsYW0vMl0KZmlnLCBheGVzID0gcGx0LnN1YnBsb3RzKDIsIDIsIGZpZ3NpemU9KDEyLCAxMCkpCmZpZy5zdXB0aXRsZSgn5Lu75YqhM++8mnh55bmz6Z2i5aSn5bC65a+45Zy65YiG5biDICh8RXwpJywgZm9udHNpemU9MTYpCmZvciBpLCBheCBpbiBlbnVtZXJhdGUoYXhlcy5mbGF0KToKICAgIHogPSB6X2xpc3RbaV0KICAgIEV4LCBFeSwgRXosIEh4LCBIeSwgSHogPSBnZXRfZmllbGRzKFgsIFksIHopCiAgICBFbWFnID0gbnAuc3FydChFeCoqMiArIEV5KioyICsgRXoqKjIpCiAgICBpbSA9IGF4LmNvbnRvdXJmKFgqMTAwMCwgWSoxMDAwLCBFbWFnLCBsZXZlbHM9MjAsIGNtYXA9J2luZmVybm8nKQogICAgYXguc2V0X3RpdGxlKGYneiA9IHt6X2xpc3RbaV0vbGFtOi4yZn0mbGFtYmRhOycpCiAgICBheC5zZXRfeGxhYmVsKCd4IChtbSknKQogICAgYXguc2V0X3lsYWJlbCgneSAobW0pJykKICAgIHBsdC5jb2xvcmJhcihpbSwgYXg9YXgpCnBsdC50aWdodF9sYXlvdXQoKQpwbHQuc2hvdygpCgojIDIuIHh65bmz6Z2i77yIeT0wLCBiLzgsIGIvNCwgYi8y77yJCnlfbGlzdCA9IFswLCBiLzgsIGIvNCwgYi8yXQp4X3ogPSBucC5saW5zcGFjZSgwLCBhLCBOKQp6X3h6ID0gbnAubGluc3BhY2UoMCwgbGFtLzIsIE4pICAjIOWPluWNiuS4quazoumVv+mVv+W6pgpYX3h6LCBaX3h6ID0gbnAubWVzaGdyaWQoeF96LCB6X3h6KQoKZmlnLCBheGVzID0gcGx0LnN1YnBsb3RzKDIsIDIsIGZpZ3NpemU9KDEyLCAxMCkpCmZpZy5zdXB0aXRsZSgn5Lu75YqhM++8mnh65bmz6Z2i5aSn5bC65a+45Zy65YiG5biDICh8RXwpJywgZm9udHNpemU9MTYpCmZvciBpLCBheCBpbiBlbnVtZXJhdGUoYXhlcy5mbGF0KToKICAgIHl5ID0geV9saXN0W2ldCiAgICAjIOmHjeaWsOiuoeeul++8iHl55Zu65a6a77yJCiAgICBzaW5fbSA9IG5wLnNpbihtKm5wLnBpKlhfeHovYSkKICAgIHNpbl9uID0gbnAuc2luKG4qbnAucGkqeXkvYikKICAgIGNvc19tID0gbnAuY29zKG0qbnAucGkqWF94ei9hKQogICAgY29zX24gPSBucC5jb3MobipucC5waSp5eS9iKQogICAgcGhhc2UgPSBucC5jb3MoYmV0YSpaX3h6KQogICAgRXogPSBFMCAqIHNpbl9tICogc2luX24gKiBwaGFzZQogICAgRXggPSBucC5yZWFsKC0xaiAqIChiZXRhICogbSpucC5waS9hKSAvIGtjKioyICogRTAgKiBjb3NfbSAqIHNpbl9uICogbnAuZXhwKC0xaipiZXRhKlpfeHopKQogICAgRXkgPSBucC5yZWFsKC0xaiAqIChiZXRhICogbipucC5waS9iKSAvIGtjKioyICogRTAgKiBzaW5fbSAqIGNvc19uICogbnAuZXhwKC0xaipiZXRhKlpfeHopKQogICAgRW1hZyA9IG5wLnNxcnQoRXgqKjIgKyBFeSoqMiArIEV6KioyKQogICAgaW0gPSBheC5jb250b3VyZihYX3h6KjEwMDAsIFpfeHoqMTAwMCwgRW1hZywgbGV2ZWxzPTIwLCBjbWFwPSdpbmZlcm5vJykKICAgIGF4LnNldF90aXRsZShmJ3kgPSB7eXkvYjouMmZ9YicpCiAgICBheC5zZXRfeGxhYmVsKCd4IChtbSknKQogICAgYXguc2V0X3lsYWJlbCgneiAobW0pJykKICAgIHBsdC5jb2xvcmJhcihpbSwgYXg9YXgpCnBsdC50aWdodF9sYXlvdXQoKQpwbHQuc2hvdygpCgojIDMuIHp55bmz6Z2i77yIeD0wLCBhLzgsIGEvNCwgYS8y77yJCnhfbGlzdCA9IFswLCBhLzgsIGEvNCwgYS8yXQp5X3p5ID0gbnAubGluc3BhY2UoMCwgYiwgTikKel96eSA9IG5wLmxpbnNwYWNlKDAsIGxhbS8yLCBOKQpZX3p5LCBaX3p5ID0gbnAubWVzaGdyaWQoeV96eSwgel96eSkKCmZpZywgYXhlcyA9IHBsdC5zdWJwbG90cygyLCAyLCBmaWdzaXplPSgxMiwgMTApKQpmaWcuc3VwdGl0bGUoJ+S7u+WKoTPvvJp6eeW5s+mdouWkp+WwuuWvuOWcuuWIhuW4gyAofEV8KScsIGZvbnRzaXplPTE2KQpmb3IgaSwgYXggaW4gZW51bWVyYXRlKGF4ZXMuZmxhdCk6CiAgICB4eCA9IHhfbGlzdFtpXQogICAgc2luX20gPSBucC5zaW4obSpucC5waSp4eC9hKQogICAgc2luX24gPSBucC5zaW4obipucC5waSpZX3p5L2IpCiAgICBjb3NfbSA9IG5wLmNvcyhtKm5wLnBpKnh4L2EpCiAgICBjb3NfbiA9IG5wLmNvcyhuKm5wLnBpKllfenkvYikKICAgIHBoYXNlID0gbnAuY29zKGJldGEqWl96eSkKICAgIEV6ID0gRTAgKiBzaW5fbSAqIHNpbl9uICogcGhhc2UKICAgIEV4ID0gbnAucmVhbCgtMWogKiAoYmV0YSAqIG0qbnAucGkvYSkgLyBrYyoqMiAqIEUwICogY29zX20gKiBzaW5fbiAqIG5wLmV4cCgtMWoqYmV0YSpaX3p5KSkKICAgIEV5ID0gbnAucmVhbCgtMWogKiAoYmV0YSAqIG4qbnAucGkvYikgLyBrYyoqMiAqIEUwICogc2luX20gKiBjb3NfbiAqIG5wLmV4cCgtMWoqYmV0YSpaX3p5KSkKICAgIEVtYWcgPSBucC5zcXJ0KEV4KioyICsgRXkqKjIgKyBFeioqMikKICAgIGltID0gYXguY29udG91cmYoWV96eSoxMDAwLCBaX3p5KjEwMDAsIEVtYWcsIGxldmVscz0yMCwgY21hcD0naW5mZXJubycpCiAgICBheC5zZXRfdGl0bGUoZid4ID0ge3h4L2E6LjJmfWEnKQogICAgYXguc2V0X3hsYWJlbCgneSAobW0pJykKICAgIGF4LnNldF95bGFiZWwoJ3ogKG1tKScpCiAgICBwbHQuY29sb3JiYXIoaW0sIGF4PWF4KQpwbHQudGlnaHRfbGF5b3V0KCkKcGx0LnNob3coKQoKcHJpbnQoZiZxdW90O+aIquatoumikeeOhyBmYyA9IHtmYy8xZTk6LjJmfSBHSHomcXVvdDspCnByaW50KGYmcXVvdDvoh6rnlLHnqbrpl7Tms6Lplb8gJmxhbWJkYTsgPSB7bGFtKjEwMDA6LjJmfSBtbSZxdW90OykKcHJpbnQoZiZxdW90O+azouWvvOazoumVvyAmbGFtYmRhO19nID0ge2xhbV9nKjEwMDA6LjJmfSBtbSZxdW90Oyk=
import numpy as np
import matplotlib.pyplot as plt
# ===== 参数 =====
a = 23e-3 # m
b = 10e-3 # m
f = 36e9 # Hz
c = 3e8 # m/s
m, n = 2, 1 # TM21
# ===== 计算常数 =====
fc = c/2 * np.sqrt((m/a)**2 + (n/b)**2)
lam = c/f
lam_g = lam / np.sqrt(1 - (fc/f)**2)
beta = 2*np.pi / lam_g
kc = np.pi * np.sqrt((m/a)**2 + (n/b)**2)
omega = 2*np.pi*f
eps0 = 8.854e-12
E0 = 1 # 归一化
# ===== 场分量公式(TM21,取实部,t=0) =====
def get_fields(x, y, z):
# x,y,z 单位均为 m
sin_m = np.sin(m*np.pi*x/a)
sin_n = np.sin(n*np.pi*y/b)
cos_m = np.cos(m*np.pi*x/a)
cos_n = np.cos(n*np.pi*y/b)
phase = np.cos(beta*z) # 取实部
Ez = E0 * sin_m * sin_n * phase
Ex = -1j * (beta * m*np.pi/a) / kc**2 * E0 * cos_m * sin_n
Ex = np.real(Ex * np.exp(-1j*beta*z))
Ey = -1j * (beta * n*np.pi/b) / kc**2 * E0 * sin_m * cos_n
Ey = np.real(Ey * np.exp(-1j*beta*z))
Hx = 1j * (omega*eps0 * n*np.pi/b) / kc**2 * E0 * sin_m * cos_n
Hx = np.real(Hx * np.exp(-1j*beta*z))
Hy = -1j * (omega*eps0 * m*np.pi/a) / kc**2 * E0 * cos_m * sin_n
Hy = np.real(Hy * np.exp(-1j*beta*z))
Hz = np.zeros_like(x) # TM模 Hz=0
return Ex, Ey, Ez, Hx, Hy, Hz
# ===== 网格 =====
N = 100
x = np.linspace(0, a, N)
y = np.linspace(0, b, N)
X, Y = np.meshgrid(x, y)
# ===== 任务2:xy横截面剖面图(z=0, λ/8, λ/4, λ/2) =====
z_list = [0, lam/8, lam/4, lam/2]
titles2 = ['z=0', 'z=λ/8', 'z=λ/4', 'z=λ/2']
comp_names = ['Ex', 'Ey', 'Ez', 'Hx', 'Hy', 'Hz']
for idx, z in enumerate(z_list):
Ex, Ey, Ez, Hx, Hy, Hz = get_fields(X, Y, z)
fig, axes = plt.subplots(2, 3, figsize=(12, 8))
fig.suptitle(f'任务2:xy横截面剖面图 {titles2[idx]}', fontsize=14)
comps = [Ex, Ey, Ez, Hx, Hy, Hz]
for i, ax in enumerate(axes.flat):
im = ax.contourf(X*1000, Y*1000, comps[i], levels=20, cmap='jet')
ax.set_title(comp_names[i])
ax.set_xlabel('x (mm)')
ax.set_ylabel('y (mm)')
plt.colorbar(im, ax=ax)
plt.tight_layout()
plt.show()
# ===== 任务3:大尺寸场分布图(|E| 或 Ez 分布) =====
# 这里画 |E| = sqrt(Ex^2+Ey^2+Ez^2),更直观展示总场
# 1. xy平面:z=0, λ/8, λ/4, λ/2
z_list = [0, lam/8, lam/4, lam/2]
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
fig.suptitle('任务3:xy平面大尺寸场分布 (|E|)', fontsize=16)
for i, ax in enumerate(axes.flat):
z = z_list[i]
Ex, Ey, Ez, Hx, Hy, Hz = get_fields(X, Y, z)
Emag = np.sqrt(Ex**2 + Ey**2 + Ez**2)
im = ax.contourf(X*1000, Y*1000, Emag, levels=20, cmap='inferno')
ax.set_title(f'z = {z_list[i]/lam:.2f}λ')
ax.set_xlabel('x (mm)')
ax.set_ylabel('y (mm)')
plt.colorbar(im, ax=ax)
plt.tight_layout()
plt.show()
# 2. xz平面(y=0, b/8, b/4, b/2)
y_list = [0, b/8, b/4, b/2]
x_z = np.linspace(0, a, N)
z_xz = np.linspace(0, lam/2, N) # 取半个波长长度
X_xz, Z_xz = np.meshgrid(x_z, z_xz)
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
fig.suptitle('任务3:xz平面大尺寸场分布 (|E|)', fontsize=16)
for i, ax in enumerate(axes.flat):
yy = y_list[i]
# 重新计算(yy固定)
sin_m = np.sin(m*np.pi*X_xz/a)
sin_n = np.sin(n*np.pi*yy/b)
cos_m = np.cos(m*np.pi*X_xz/a)
cos_n = np.cos(n*np.pi*yy/b)
phase = np.cos(beta*Z_xz)
Ez = E0 * sin_m * sin_n * phase
Ex = np.real(-1j * (beta * m*np.pi/a) / kc**2 * E0 * cos_m * sin_n * np.exp(-1j*beta*Z_xz))
Ey = np.real(-1j * (beta * n*np.pi/b) / kc**2 * E0 * sin_m * cos_n * np.exp(-1j*beta*Z_xz))
Emag = np.sqrt(Ex**2 + Ey**2 + Ez**2)
im = ax.contourf(X_xz*1000, Z_xz*1000, Emag, levels=20, cmap='inferno')
ax.set_title(f'y = {yy/b:.2f}b')
ax.set_xlabel('x (mm)')
ax.set_ylabel('z (mm)')
plt.colorbar(im, ax=ax)
plt.tight_layout()
plt.show()
# 3. zy平面(x=0, a/8, a/4, a/2)
x_list = [0, a/8, a/4, a/2]
y_zy = np.linspace(0, b, N)
z_zy = np.linspace(0, lam/2, N)
Y_zy, Z_zy = np.meshgrid(y_zy, z_zy)
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
fig.suptitle('任务3:zy平面大尺寸场分布 (|E|)', fontsize=16)
for i, ax in enumerate(axes.flat):
xx = x_list[i]
sin_m = np.sin(m*np.pi*xx/a)
sin_n = np.sin(n*np.pi*Y_zy/b)
cos_m = np.cos(m*np.pi*xx/a)
cos_n = np.cos(n*np.pi*Y_zy/b)
phase = np.cos(beta*Z_zy)
Ez = E0 * sin_m * sin_n * phase
Ex = np.real(-1j * (beta * m*np.pi/a) / kc**2 * E0 * cos_m * sin_n * np.exp(-1j*beta*Z_zy))
Ey = np.real(-1j * (beta * n*np.pi/b) / kc**2 * E0 * sin_m * cos_n * np.exp(-1j*beta*Z_zy))
Emag = np.sqrt(Ex**2 + Ey**2 + Ez**2)
im = ax.contourf(Y_zy*1000, Z_zy*1000, Emag, levels=20, cmap='inferno')
ax.set_title(f'x = {xx/a:.2f}a')
ax.set_xlabel('y (mm)')
ax.set_ylabel('z (mm)')
plt.colorbar(im, ax=ax)
plt.tight_layout()
plt.show()
print(f"截止频率 fc = {fc/1e9:.2f} GHz")
print(f"自由空间波长 λ = {lam*1000:.2f} mm")
print(f"波导波长 λ_g = {lam_g*1000:.2f} mm")