少模光纤模式场的计算

光纤模式图仿真

  贵有恒,何必三更起五更睡;最无益,只怕一日曝十日寒。
       考虑到后续工作方便,将欧攀老师的《高等光学仿真MATLAB版》上关于光纤模场分布计算的Matlab代码用python重写,并补入了一些自己的工作。

原理

    弱导光纤线偏振模式的理论,具体参考光纤有关的工具书。
归一化频率V与模式U、W参数的关系:
V 2 = U 2 + W 2 V^2=U^2+W^2
LP0m ( l = 0 ) \left(l=0\right) 的特征方程如下:
  U J 1 ( U ) J 0 ( U ) = W K 1 ( W ) K 0 ( W ) \ \frac{UJ_1\left(U\right)}{J_0\left(U\right)}=\frac{WK_1\left(W\right)}{K_0\left(W\right)}\,
LP1m ( l = 1 ) \left(l=1\right) 的特征方程如下:
  U J 0 ( U ) J 1 ( U ) = W K 0 ( W ) K 1 ( W ) \ \frac{UJ_0\left(U\right)}{J_1\left(U\right)}=-\frac{WK_0\left(W\right)}{K_1\left(W\right)}\,
LPLm ( l 2 ) \left(l\geq2\right) 的特征方程如下:

  U J l 1 ( U ) J l ( U ) = W K l 1 ( W ) K l ( W ) \ \frac{UJ_{l-1}\left(U\right)}{J_l\left(U\right)}=-\frac{WK_{l-1}\left(W\right)}{K_l\left(W \right)}\,
我们定义X为:
[ U W ] = [ X [ 0 ] X [ 1 ] ] \begin{bmatrix}U\\W\end{bmatrix}=\begin{bmatrix}X\left[0\right]\\X\left[1\right]\end{bmatrix}

代码如下

  这里选择芯径为25 μ m \mu m ,NA为0.08,工作波长工作在 1064 n m 1064nm 的阶跃折射率光纤进行数值模拟。初步计算,该少模光纤的归一化频率大约为5.91,可支持10种模式,依次为LP01, LP11e,LP11o,
LP21e,LP21o, LP02, LP31e,LP31o以及LP12e,LP12o。
首先,利用scipy中最小二乘法函数leastsq求解各个模式的U、W值。因为没找到其他更好方式计算了,如果您有更好方法请及时交流,谢谢。

# 导包
import math
import numpy as np
from scipy import special
from scipy.optimize import leastsq
%matplotlib inline
# 光纤参数
Lamda = 1.064e-6 # 波长 1064nm
NA = 0.08  #数值孔径
a_core = 25e-6 / 2 #纤芯半径 25um
# 计算归一化频率
V = 2 * np.pi * a_core / Lamda * NA
print('归一化频率:%.4f'%V) # 归一化频率:5.9052

# 计算LP_0m 
def fun_0m(X):
    global V
    return[V**2-X[0]**2-X[1]**2,
          (X[0]*special.jv(1, X[0]))/special.jv(0, X[0]) - (X[1]*special.kv(1, X[1]))/special.kv(0, X[1]) ]
# 计算LP_1m
def fun_1m(X):
    global V
    return[V**2-X[0]**2-X[1]**2,
          (X[0]*special.jv(0, X[0]))/special.jv(1, X[0]) + (X[1]*special.kv(0, X[1]))/special.kv(1, X[1]) ]
# 计算LP_2m及以上
def fun_Lm(X):
    global L # L>=2, L代表阶数
    global V 
    return[V**2-X[0]**2-X[1]**2,
          (X[0]*special.jv(L-1, X[0]))/special.jv(L, X[0]) + (X[1]*special.kv(L-1, X[1]))/special.kv(L, X[1]) ]

计算LP_0m

# 计算LP_0m
LP_0m = []
for i in range(1,math.ceil(V)):
    #print(i)
    sol = leastsq(fun_0m,[i,i])
    tt = sol[0].round(4).tolist()
    #print(sol[0])
    if tt not in LP_0m:
        LP_0m.append(tt)
print("LP_0m存在两个解,分别对应LP_01和LP_02模")
print(LP_0m) # [[2.05, 5.538], [4.6202, 3.6778]]
U_01 = LP_0m[0][0]
W_01 = LP_0m[0][1]
U_02 = LP_0m[1][0]
W_02 = LP_0m[1][1]

计算LP_1m

# 计算LP_1m
LP_1m = []
for i in range(1,math.ceil(V)):
    #print(i)
    sol = leastsq(fun_1m,[i,i])
    tt = sol[0].round(4).tolist()
    #print(sol[0])
    if tt not in LP_1m:
        LP_1m.append(tt)
print("LP_1m存在两个解,分别对应LP_11和LP_12模")
print(LP_1m) # [[3.2507, 4.93], [5.7146, 1.4885]]
U_11 = LP_1m[0][0]
W_11 = LP_1m[0][1]
U_12 = LP_1m[1][0]
W_12 = LP_1m[1][1]

计算LP_2m

# 计算LP_2m
L = 2
LP_2m = []
for i in range(1,math.ceil(V)):
    #print(i)
    sol = leastsq(fun_Lm,[i,i])
    #print(sol)
    tt = sol[0].round(4).tolist()
    if tt not in LP_2m:
        LP_2m.append(tt)
print("LP_2m存在一个解,对应LP_21模")
print(LP_2m) # [[4.3295, 4.0159]]
U_21 = LP_2m[0][0]
W_21 = LP_2m[0][1]

计算LP_3m

# 计算LP_3m
L = 3
LP_3m = []
for i in range(1,math.ceil(V)):
    #print(i)
    sol = leastsq(fun_Lm,[i,i])
    #print(sol)
    tt = sol[0].round(4).tolist()
    if tt not in LP_3m:
        LP_3m.append(tt)
print("LP_3m存在一个解,对应LP_31模")
print(LP_3m) # [[5.3311, 2.54]]
U_31 = LP_3m[0][0]
W_31 = LP_3m[0][1]

计算各个模式场

  这里计算光纤的纤芯及部分包层,初步设定网格为128*128,可以根据图像分辨率调整。

# 网格设定为128*128并计算各个模式电场
Npoint  = 128
Rcore = 1 # 归一化纤芯直径为1
Rclad = 1.2 # 取部分包层
def LP(V, U, W, L, even=True):
    # 网格设定及计算
    global Npoint
    global Rcore
    global Rclad
    X = np.linspace(-Rclad, Rclad, Npoint)
    Y = X
    Theta = np.zeros([Npoint, Npoint])
    X, Y = np.meshgrid(X, Y)
    R = np.sqrt(X**2 + Y**2)
    for i in range(Npoint):
        for j in range(Npoint):
            Theta[i, j] = np.arctan2(Y[i, j], (X[i, j] + np.spacing(1)))
    E1 = np.zeros((Npoint, Npoint))
    E2 = E1.copy()
    I1 = E1.copy()
    I2 = E1.copy()
    # 光场分布
    if L == 0: # 阶数为0时不区分奇偶模
        # 纤芯中光场分布
        E1 = special.jv(L,U*R)
        # 包层中的光场分布
        E2 = special.jv(L,U)*special.kv(L,W*R)/special.kv(L,W)
    elif even==True: #偶模
        # 纤芯中光场分布
        E1 = special.jv(L,U*R)*np.cos(L * Theta)
        # 包层中的光场分布
        E2 = special.jv(L,U)*special.kv(L,W*R)/special.kv(L,W)*np.cos(L*Theta)
    else: # 奇模
        # 纤芯中光场分布
        E1 = special.jv(L,U*R)*np.sin(L * Theta)
        # 包层中的光场分布
        E2 = special.jv(L,U)*special.kv(L,W*R)/special.kv(L,W)*np.sin(L*Theta)
    # 合并E1中单位圆内电场与E2单位圆外电场
    E = E1.copy()
    I = E1.copy()
    # 电场分布
    E[R>=1]= E2[R>=1]
    # 光强分布
    I = E**2
    # 归一化处理
    E = E/E.max()
    I = I/I.max()
    return X, Y, E, I
# 得到模式电场和光强
l_1 = 1 # 模式场阶数
X, Y, E_11e, I_11e = LP(V, U_11, W_11, l_1, even=True)
X, Y, E_11o, I_11o = LP(V, U_11, W_11, l_1, even=False)
X, Y, E_12e, I_12e = LP(V, U_12, W_12, l_1)
l_2 = 2
X, Y, E_21e, I_21e = LP(V, U_21, W_21, l_2)
X, Y, E_21o, I_21o = LP(V, U_21, W_21, l_2, even=False)
l_3 = 3
X, Y, E_31e, I_31e = LP(V, U_31, W_31, l_3)
l_0 = 0
X, Y, E_01, I_01 = LP(V, U_01, W_01, l_0)
X, Y, E_02, I_02 = LP(V, U_02, W_02, l_0)
import matplotlib.pyplot as plt
cm=plt.cm.get_cmap('Spectral_r')
fig,axes = plt.subplots(ncols=2, nrows=3, figsize=(12,16))
im1 = axes[0, 0].pcolormesh(X, Y, I_11e, cmap=cm)
fig.colorbar(im1, ax=axes[0, 0])
axes[0, 0].set_title('LP11e')
im2 = axes[0][1].pcolormesh(X, Y, I_12e, cmap=cm)
fig.colorbar(im2, ax=axes[0, 1])
axes[0][1].set_title('LP12e')
im3 = axes[1][0].pcolormesh(X, Y, I_01, cmap=cm)
axes[1][0].set_title('LP01')
im4 = axes[1][1].pcolormesh(X, Y, I_02, cmap=cm)
axes[1][1].set_title('LP02')
im5 = axes[2][0].pcolormesh(X, Y, I_21e, cmap=cm)
axes[2][0].set_title('LP21e')
im6 = axes[2][1].pcolormesh(X, Y, I_31e, cmap=cm)
axes[2][1].set_title('LP31e')
fig.colorbar(im1, ax=axes[1, 0])
fig.colorbar(im1, ax=axes[1, 1])
fig.colorbar(im1, ax=axes[2, 0])
fig.colorbar(im1, ax=axes[2, 1])

模式图,只显示偶模

结尾

这是写的第一篇文章,待后续

扫描二维码关注公众号,回复: 9924876 查看本文章
发布了3 篇原创文章 · 获赞 0 · 访问量 95

猜你喜欢

转载自blog.csdn.net/weixin_43271235/article/details/103916350