ベッセル関数とその導関数の零点

モジュールのインポート

import numpy as np
from scipy.special import jv, yv # ベッセル関数
from scipy.special import jn_zeros, jnp_zeros, jnjnp_zeros # ベッセル関数の零点
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'])

ユーザ関数

第1種ベッセル関数の導関数は,
def dbesj(m,x): # 第1種ベッセル関数の導関数
    f = (jv(m-1,x)-jv(m+1,x))*0.5
    return f
フォーマット付出力のために,
def table2(sx,sy1,sy2,x,y1,y2):
    nx = len(x)
    print(f"{sx:>8s}",f"{sy1:>8s}",f"{sy2:>8s}")
    for i in range(nx):
        print(f'{x[i]:8.3f}',f'{y1[i]:8.3f}',f'{y2[i]:8.3f}')
    return

ベッセル関数の計算

0次および1次の第1種ベッセル関数を計算すると,
x_min, x_max, n_x = 0.0, 30.0, 11
x = np.linspace(x_min, x_max, n_x)
y0 = jv(0,x) # 0次の第1種ベッセル関数
y1 = jv(1,x) # 1次の第1種ベッセル関数
table2('x','J_0(x)','J_1(x)', x, y0, y1)
     x   J_0(x)   J_1(x) 
 0.000    1.000    0.000
 3.000   -0.260    0.339
 6.000    0.151   -0.277
 9.000   -0.090    0.245
12.000    0.048   -0.223
15.000   -0.014    0.205
18.000   -0.013   -0.188
21.000    0.037    0.171
24.000   -0.056   -0.154
27.000    0.073    0.137
30.000   -0.086   -0.119
1次の第1種ベッセル関数とその導関数を計算すると,
y2 = dbesj(1,x) # 1次の第1種ベッセル関数の導関数 (TE1m-mode)
table2('x','J_1(x)','dJ_1(x)/dx', x, y1, y2)
     x   J_1(x) dJ_1(x)/dx
 0.000    0.000    0.500
 3.000    0.339   -0.373
 6.000   -0.277    0.197
 9.000    0.245   -0.118
12.000   -0.223    0.066
15.000    0.205   -0.028
18.000   -0.188   -0.003
21.000    0.171    0.028
24.000   -0.154   -0.050
27.000    0.137    0.068
30.000   -0.119   -0.082
プロットして,
fig = plt.figure() # グラフ領域の作成
x = np.linspace(0.0, 30.0, 151)
plt.grid(color = "gray", linestyle="--")
plt.minorticks_on() # #補助目盛りをつける
plt.xlabel(r"$x$") # x軸のラベル設定
plt.ylabel(r"Bessel functions") # y軸のラベル設定
plt.ylim(-1.0, 1.0) # y軸範囲の設定
plt.plot(x, jv(1,x), label=r"$J_1(x)$")
plt.plot(x, dbesj(1,x), label=r"$J_1'(x)$")
plt.legend(ncol=1, loc='upper right', fancybox=False, frameon=True)
fig.savefig('p3_tlt_s14_1.pdf')
plt.show()

ベッセル関数の零点

整数次$n$の第1種ベッセル関数の零点$J_n(x)=0$ は, https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.jn_zeros.html
nt = 10
n_max = 3
for n in range(n_max+1):
    print(n, jn_zeros(n ,nt))
0 [ 2.40482556  5.52007811  8.65372791 11.79153444 14.93091771 18.07106397
 21.21163663 24.35247153 27.49347913 30.63460647]
1 [ 3.83170597  7.01558667 10.17346814 13.32369194 16.47063005 19.61585851
 22.76008438 25.90367209 29.04682853 32.18967991]
2 [ 5.1356223   8.41724414 11.61984117 14.79595178 17.95981949 21.11699705
 24.27011231 27.42057355 30.5692045  33.71651951]
3 [ 6.3801619   9.76102313 13.01520072 16.22346616 19.40941523 22.58272959
 25.7481667  28.90835078 32.06485241 35.21867074]
整数次$n$($n\le 1200$)までの第1種ベッセル関数および導関数の零点 $J_n(x)=0$,$J_n'(x)=0$ は, https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.jnjnp_zeros.html
nt = 31
zo, n_, m_, t_ = jnjnp_zeros(nt)
n_ # 次数
array([0, 1, 0, 2, 1, 0, 3, 2, 4, 1, 0, 3, 5, 2, 1, 0, 6, 4, 3, 2, 1, 7,
       0, 5, 4, 8, 3, 6, 2, 1, 0], dtype=int32)
m_ # m番目の零点
array([0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1, 1, 2, 2, 3, 1,
       3, 1, 2, 1, 2, 1, 3, 3, 3], dtype=int32)
t_ # Jn(x)=0のとき0, Jn'(x)=0のとき1
array([1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1,
       0, 0, 1, 1, 0, 0, 1, 0, 1], dtype=int32)
zo # 零点の値の配列
array([ 0.        ,  1.84118378,  2.40482556,  3.05423693,  3.83170597,
        3.83170597,  4.20118894,  5.1356223 ,  5.31755313,  5.33144277,
        5.52007811,  6.3801619 ,  6.41561638,  6.70613319,  7.01558667,
        7.01558667,  7.50126614,  7.58834243,  8.0152366 ,  8.41724414,
        8.53631637,  8.57783649,  8.65372791,  8.77148382,  9.28239629,
        9.64742165,  9.76102313,  9.93610952,  9.96946782, 10.17346814,
       10.17346814])
a = 14.3
dpi = 2*np.pi*a
wlc = dpi/zo[1:]
fc = 300/wlc
print("a=",a,'[mm]')
print(f"{'No.':>7s}",f"{'mode':>7s}",f"{'xi':>10s}",\
      f"{'wlc[mm]':>10s}",f"{'fc[GHz]':>10s}")
for i in range(1,nt):
    print(f'{i:6.0f}',end='  ')
    if t_[i]==1:
          print(f'{"TE":2s}',end=' ')
    elif t_[i]==0:
          print(f'{"TM":2s}',end=' ')
    print(f'{n_[i]:2.0f}',f'{m_[i]:2.0f}',f'{zo[i]:10.6f}',\
          f'{wlc[i-1]:10.6f}',f'{fc[i-1]:10.6f}')
a= 14.3 [mm]
    No.    mode         xi    wlc[mm]    fc[GHz]
     1  TE  1  1   1.841184  48.799881   6.147556
     2  TM  0  1   2.404826  37.362190   8.029508
     3  TE  2  1   3.054237  29.418003  10.197837
     4  TM  1  1   3.831706  23.448968  12.793740
     5  TE  0  1   3.831706  23.448968  12.793740
     6  TE  3  1   4.201189  21.386696  14.027412
     7  TM  2  1   5.135622  17.495358  17.147406
     8  TE  4  1   5.317553  16.896785  17.754857
     9  TE  1  2   5.331443  16.852765  17.801234
    10  TM  0  2   5.520078  16.276862  18.431071
    11  TM  3  1   6.380162  14.082644  21.302818
    12  TE  5  1   6.415616  14.004820  21.421197
    13  TE  2  2   6.706133  13.398116  22.391208
    14  TM  1  2   7.015587  12.807133  23.424447
    15  TE  0  2   7.015587  12.807133  23.424447
    16  TE  6  1   7.501266  11.977918  25.046089
    17  TM  4  1   7.588342  11.840471  25.336830
    18  TE  3  2   8.015237  11.209844  26.762193
    19  TM  2  2   8.417244  10.674462  28.104462
    20  TE  1  3   8.536316  10.525565  28.502034
    21  TE  7  1   8.577836  10.474617  28.640666
    22  TM  0  3   8.653728  10.382757  28.894061
    23  TM  5  1   8.771484  10.243370  29.287238
    24  TE  4  2   9.282396   9.679564  30.993131
    25  TE  8  1   9.647422   9.313323  32.211920
    26  TM  3  2   9.761023   9.204932  32.591225
    27  TM  6  1   9.936110   9.042729  33.175824
    28  TE  2  3   9.969468   9.012472  33.287205
    29  TM  1  3  10.173468   8.831752  33.968344
    30  TE  0  3  10.173468   8.831752  33.968344
これより,遮断周波数が最も低いTE$_{11}$モードが基本モードであることがわかる. この計算例では,円形導波管の半径が $a=14.3$ [mm]の場合を求めており,この形状の導波管では,一つのモードのみが伝搬する周波数帯域は,6.15 GHzから8.03 GHzである. ただし,円形導波管の形状が軸対称の変化のみであれば,基本モードに対して,TM$_{01}$,TE$_{21}$モードは発生しないため,第一次高次モードはTM$_{11}$モードとなり,シングルモードとなる周波数帯域は,6.15 GHz から12.79 GHzとなり,これはX帯(8.2-12.5GHz)に適した標準的な円形導波管といえよう.

円形導波管モードの遮断波数の計算

# imode = 1 (TE), -1 (TM)
def circular_waveguide_xi2(imode,m, n):
    if imode == 1:
        print('TE mode:',end=' ')
        xi = jnp_zeros(m,n)
    elif imode == -1:
        print('TM mode:',end=' ')
        xi = jn_zeros(m,n)
    print(xi)
    return xi[n-1]
circular_waveguide_xi2(imode=1, m=1, n=6)
TE mode: [ 1.84118378  5.33144277  8.53631637 11.7060049  14.86358863 18.01552786]
18.015527862681804
circular_waveguide_xi2(imode=-1, m=1, n=6)
TM mode: [ 3.83170597  7.01558667 10.17346814 13.32369194 16.47063005 19.61585851]
19.615858510468243