角錐ホーンのユニバーサルパターン

モジュールのインポート

import numpy as np
import scipy as sp
from scipy.integrate import quad
import matplotlib.pyplot as plt
import scienceplots
#Warning : As of version 2.0.0, you need to add import scienceplots before setting the style (plt.style.use('science')).
plt.style.use(['science', 'notebook'])

ユーザ関数

可変長引数**kwargsを使えば,複数のキーワード引数を辞書として受け取ることができ,被積分関数が複素数の場合に,積分変数以外の変数を引数とする場合の数値積分の関数を,
def complex_quadrature(func, a, b, **kwargs):
    def real_func(x):
        return np.real(func(x))
    def imag_func(x):
        return np.imag(func(x))
    real_integral = quad(real_func, a, b, **kwargs)
    imag_integral = quad(imag_func, a, b, **kwargs)
    return (real_integral[0] + 1j*imag_integral[0], real_integral[1:], imag_integral[1:])
dB値と位相の計算は,
def dbdeg(z): # 電磁界の複素係数から絶対値,デジベル(dB),偏角(deg)の計算
    q = 180.0/np.pi
    amp = np.abs(z)
    db = 20.0*np.log10(amp)
    rad = np.angle(z)
    rad = np.unwrap(rad, discont=0.95*np.pi)
    deg = rad*q
    return amp,db,deg
E面パターンを計算する場合の被積分関数は,
def func_ge(x):# E面パターンの被積分関数
    return np.exp(-1j*2*np.pi*t*x**2 + 1j*np.pi*u*x)/2
また,H面パターンを計算する場合の被積分関数は,
def func_gh(x):# H面パターンの被積分関数
    return np.cos(np.pi*x/2.0)*np.exp(-1j*2*np.pi*t*x**2 + 1j*np.pi*u*x)*np.pi/4

角錐ホーンの開き角による利得低下量

ttt = np.linspace(0.0, 1.0, 41)# tパラメータ
u = 0
eta_db = np.empty([2,len(ttt)])
print(f"{'t':>10s} {'eta_e(t)':>10s} {'eta_h(t)':>10s}")
for j,t in enumerate(ttt):
    eta_e = complex_quadrature(func_ge, -1, 1)[0]
    eta_h = complex_quadrature(func_gh, -1, 1)[0]
    eta_db[:,j] = 20*np.log10(np.abs([eta_e, eta_h]))
    print(f"{t:10.4f} {eta_db[0,j]:10.4f} {eta_db[1,j]:10.4f}")
t   eta_e(t)   eta_h(t)
0.0000     0.0000     0.0000
0.0250    -0.0095    -0.0046
0.0500    -0.0381    -0.0184
0.0750    -0.0858    -0.0413
0.1000    -0.1528    -0.0733
0.1250    -0.2391    -0.1145
0.1500    -0.3448    -0.1647
0.1750    -0.4703    -0.2238
0.2000    -0.6157    -0.2919
0.2250    -0.7813    -0.3688
0.2500    -0.9674    -0.4543
0.2750    -1.1744    -0.5485
0.3000    -1.4025    -0.6511
0.3250    -1.6522    -0.7619
0.3500    -1.9240    -0.8807
0.3750    -2.2181    -1.0074
0.4000    -2.5350    -1.1417
0.4250    -2.8750    -1.2832
0.4500    -3.2386    -1.4317
0.4750    -3.6258    -1.5868
0.5000    -4.0369    -1.7481
0.5250    -4.4715    -1.9151
0.5500    -4.9292    -2.0873
0.5750    -5.4089    -2.2643
0.6000    -5.9090    -2.4453
0.6250    -6.4268    -2.6297
0.6500    -6.9585    -2.8168
0.6750    -7.4985    -3.0059
0.7000    -8.0393    -3.1961
0.7250    -8.5710    -3.3866
0.7500    -9.0812    -3.5765
0.7750    -9.5552    -3.7650
0.8000    -9.9767    -3.9510
0.8250   -10.3300    -4.1337
0.8500   -10.6016    -4.3122
0.8750   -10.7831    -4.4856
0.9000   -10.8728    -4.6531
0.9250   -10.8764    -4.8141
0.9500   -10.8054    -4.9679
0.9750   -10.6752    -5.1140
1.0000   -10.5021    -5.2521
プロットして,
fig = plt.figure() # グラフ領域の作成
plt.grid(color = "gray", linestyle="--")
plt.plot(ttt, eta_db[0,:], label="E-plane")
plt.plot(ttt, eta_db[1,:], label="H-plane")
plt.xlim(0.0, 0.8) # x軸範囲の設定
plt.ylim(-10.0, 0.0) # y軸範囲の設定
plt.xlabel(r"$t_e, t_h$") # y軸のラベル設定
plt.ylabel("Gain loss [dB]") # x軸のラベル設定
plt.legend(ncol=1, loc='lower left', fancybox=False, frameon = True, fontsize=10)
fig.savefig('p3_ap_s2_1.pdf')

角錐ホーンのE面ユニバーサルパターン

$t$ パラメータのデータは,
tt = np.linspace(0.0, 1.0, 6)
uu = np.linspace(0, 5, 501)
ff = np.empty((len(tt),len(uu)), dtype=complex)
tt
array([0. , 0.2, 0.4, 0.6, 0.8, 1. ])
変数 $u$ に対してE面ユニバーサルパターンを求めると,
for j,t in enumerate(tt):
    u = 0
    f0 = complex_quadrature(func_ge, -1, 1)[0]
    for i,u in enumerate(uu):
        ff[j,i] = complex_quadrature(func_ge, -1, 1)[0]/f0
amp, db, deg = dbdeg(ff)
計算値を出力して,
print(f"{'u/pi':>8s} {'t=0.0':>8s} {'t=0.2':>8s} {'t=0.4':>8s}")
for i in range(0,len(uu),25):
    print(f"{uu[i]:8.2f} {db[0,i]:8.3f} {db[1,i]:8.3f} {db[2,i]:8.3f}")
u/pi    t=0.0    t=0.2    t=0.4
0.00    0.000    0.000    0.000
0.25   -0.912   -0.866   -0.691
0.50   -3.922   -3.599   -2.529
0.75  -10.455   -8.320   -4.346
1.00 -323.174  -11.622   -4.775
1.25  -14.891  -10.483   -5.077
1.50  -13.465  -11.166   -6.850
1.75  -17.814  -15.547  -10.471
2.00 -327.611  -22.444  -13.020
2.25  -19.997  -17.618  -11.948
2.50  -17.902  -16.447  -12.347
2.75  -21.740  -20.236  -15.946
3.00 -336.261  -29.816  -20.449
3.25  -23.191  -21.706  -17.367
3.50  -20.824  -19.760  -16.483
3.75  -24.434  -23.301  -19.860
4.00     -inf  -35.023  -26.111
4.25  -25.521  -24.403  -20.992
4.50  -23.007  -22.118  -19.350
4.75  -26.487  -25.537  -22.614
5.00 -319.999  -39.010  -30.415
プロットして,
fig = plt.figure() # グラフ領域の作成
plt.grid(color = "gray", linestyle="--")
for j,t in enumerate(tt):
    plt.plot(uu, db[j,:], label=r"$t=$"+f"{t:.1f}")
plt.xlim(0.0, 5.0) # x軸範囲の設定
plt.ylim(-50.0, 5.0) # y軸範囲の設定
plt.xlabel(r"$u/\pi$ with $u = \frac{\pi D}{\lambda} \sin \theta$") # y軸のラベル設定
plt.ylabel("Relative power [dB]") # x軸のラベル設定
plt.legend(ncol=1, loc='lower left', fancybox=False, frameon = True, fontsize=10)
fig.savefig('p3_ap_s2_2.pdf')

開口面振幅分布(基本モード)によ利得低下量を求めると,
G_loss_amp = 10*np.log10(8/np.pi**2)# 開口面振幅分布(基本モード)によ利得低下量
G_loss_amp
-0.912097583963241
同様にして,変数 $u$ に対してH面ユニバーサルパターンを求めると,
for j,t in enumerate(tt):
    u = 0
    f0 = complex_quadrature(func_gh, -1, 1)[0]
    for i,u in enumerate(uu):
        ff[j,i] = complex_quadrature(func_gh, -1, 1)[0]/f0
amp, db, deg = dbdeg(ff)
プロットして,
fig = plt.figure() # グラフ領域の作成
plt.grid(color = "gray", linestyle="--")
for j,t in enumerate(tt):
    plt.plot(uu, db[j,:], label=r"$t=$"+f"{t:.1f}")
plt.xlim(0.0, 5.0) # x軸範囲の設定
plt.ylim(-50.0, 5.0) # y軸範囲の設定
plt.xlabel(r"$u/\pi$ with $u = \frac{\pi D}{\lambda} \sin \theta$") # y軸のラベル設定
plt.ylabel("Relative power [dB]") # x軸のラベル設定
plt.legend(ncol=1, loc='upper right', fancybox=False, frameon = True, fontsize=10)
fig.savefig('p3_ap_s2_3.pdf')