光纤LP模式图仿真

为了后续工作方便,将欧攀老师的《高等光学仿真MATLAB版》上关于光纤模场分布计算的Matlab代码用python重写,并补入了一些自己的工作。

模式原理

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

UJl−1(U)Jl(U)=−WKl−1(W)Kl(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)}\,  Jl​(U)UJl−1​(U)​=−Kl​(W)WKl−1​(W)​
为了方便解析,定义X为:
[UW]=[X[0]X[1]]\begin{bmatrix}U\\W\end{bmatrix}=\begin{bmatrix}X\left[0\right]\\X\left[1\right]\end{bmatrix}[UW​]=[X[0]X[1]​]

Python代码如下

  这里选择芯径为25μm\mu mμm,NA为0.08,工作波长工作在1064nm1064nm1064nm的阶跃折射率光纤进行数值模拟。初步计算,该少模光纤的归一化频率大约为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 Vreturn[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 Vreturn[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 Npointglobal Rcoreglobal RcladX = np.linspace(-Rclad, Rclad, Npoint)Y = XTheta = 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)

关于下标符号显示问题解决思路参考如下:
1、Python Matplotlib中坐标轴标题中各种特殊符号的显示
2、解决plt.title()下角标及空格显示问题

import matplotlib.pyplot as plt
cm=plt.cm.get_cmap('Spectral_r')
fig,axes = plt.subplots(ncols=2, nrows=3, figsize=(9,12))im1 = axes[0][0].pcolormesh(X, Y, I_01, cmap=cm)
axes[0][0].set_title("$LP_{01}$")im2 = axes[0][1].pcolormesh(X, Y, I_02, cmap=cm)
axes[0][1].set_title('$LP_{02}$')im3 = axes[1, 0].pcolormesh(X, Y, I_11e, cmap=cm)
axes[1, 0].set_title('$LP_{11}$')im4 = axes[1][1].pcolormesh(X, Y, I_12e, cmap=cm)
axes[1][1].set_title('$LP_{12}$')im5 = axes[2][0].pcolormesh(X, Y, I_21e, cmap=cm)
axes[2][0].set_title('$LP_{21}$')im6 = axes[2][1].pcolormesh(X, Y, I_31e, cmap=cm)
axes[2][1].set_title('$LP_{31}$')fig.colorbar(im1, ax=axes[0, 0])
fig.colorbar(im2, ax=axes[0, 1])
fig.colorbar(im3, ax=axes[1, 0])
fig.colorbar(im4, ax=axes[1, 1])
fig.colorbar(im5, ax=axes[2, 0])
fig.colorbar(im6, ax=axes[2, 1])

待续

少模光纤模式场的计算相关推荐

  1. RSA签名算法,计算调用加密报文,安全传输

    RSA签名算法 1. 获取当前的时间戳参数 2. 计算参数签名 3. 获取请求对象的MD5密文 4. 通过私钥计算某个参数的RSA签名 5. 转换字符集到utf8 6. MD5加密字符串 7. bas ...

  2. HJ75 公共字符串计算

    描述 给定两个只包含小写字母的字符串,计算两个字符串的最大公共子串的长度. 注:子串的定义指一个字符串删掉其部分前缀和后缀(也可以不删)后形成的字符串. 输入描述: 输入两个只包含小写字母的字符串 输 ...

  3. 数据结构(01)— 算法复杂度概念及常见的复杂度计算

    1. 大 O 表示法 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度.大 O 表示法指出了最糟情况下的运行时间.大 O 表示法在讨论运行时间时, ...

  4. 一道有意思的阶乘计算题

    文章目录 1 题目描述 2 分析 2.1 基本做法 1 题目描述 输入n, 计算 下面公式的末六位(不含前导0).n<=10^6,n!表示前n个正整数之积 S=1!+2!+3!+4!+5!+.. ...

  5. 使用余弦相似度算法计算文本相似度-数学

    20211201 也就是效果 皮尔逊>余弦>欧式 余弦相似度的局限 皮尔逊的优势,相当于是改进版余弦相似度 欧式与 余弦 欧式侧重于直线距离 归一化之后的欧式和余弦的效果也不同 比如 0, ...

  6. 卷积神经网络之卷积计算、作用与思想 深度学习

    博客:blog.shinelee.me | 博客园 | CSDN 卷积运算与相关运算 在计算机视觉领域,卷积核.滤波器通常为较小尺寸的矩阵,比如3×33×3.从这个角度看,多层卷积是在进行逐层映射,整 ...

  7. 未授予用户在此计算机上的请求登陆类型处理办法

    未授予用户在此计算机上的请求登陆类型处理办法 听语音 原创 | 浏览:62154 | 更新:2013-08-23 15:21 | 标签:计算机 返回 暂停 重播 播放 x <div class= ...

  8. 卷积神经网络(CNN)张量(图像)的尺寸和参数计算(深度学习)

    卷积神经网络(CNN)张量(图像)的尺寸和参数计算(深度学习) 分享一些公式计算张量(图像)的尺寸,以及卷积神经网络(CNN)中层参数的计算. 以AlexNet网络为例,以下是该网络的参数结构图. A ...

  9. LeetCode简单题之二进制表示中质数个计算置位

    题目 给你两个整数 left 和 right ,在闭区间 [left, right] 范围内,统计并返回 计算置位位数为质数 的整数个数. 计算置位位数 就是二进制表示中 1 的个数. 例如, 21 ...

  10. 智能驾驶计算平台算力技术

    智能驾驶计算平台算力技术 域控制器:高算力平台助推高级别智能驾驶,高通布局加速 英伟达仍是高算力平台首选,2022年开启量产周期.根据我们的统计,英伟达仍是高算力平台首选,目前主打高级别智能驾驶的厂商 ...

最新文章

  1. JavaWeb之Servlet学习-----实现文件动态下载功能 手写servlet 手动构建web程序
  2. synergy在Windows和Linux下使用全攻略(多台PC共享一套键盘鼠标)
  3. python蓝牙上位机开发_python做上位机 - osc_2frv0wjp的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. 前端学习(1984)vue之电商管理系统电商系统之完成静态属性
  5. python的数据库_python数据库操作-mysql数据库
  6. 一瓦同城-给新人第四天培训
  7. maven添加子工程_Maven建立父子项目和跨项目调用内容的步骤—佳佳小白
  8. Linux认证复习题100道含答案
  9. 蓝桥杯 PREV-32 历届试题 分糖果
  10. as工程放到源码编译_「Do.016」AndroidStudio不用编译,阅读Android源码
  11. Atitit 存储与数据库性能调优流程目录1. 数据库出现性能瓶颈,对外表现有几个方面:
  12. 我的Android之路
  13. Python爬虫:对Uniqlo、Zara、HM等快销品牌的门店数量作统计并展示
  14. 推荐我看过的几本好书给大家
  15. 老徐和阿珍的故事:Runnable和Callable有什么不同?
  16. Save More Mice (贪心 二分)
  17. web漏洞之sql注入
  18. 【Java SE】抽象类和接口
  19. 开启十日内 阿维塔11首批用户锁单突破5000台
  20. flutter web 微信公众号开发记录

热门文章

  1. 澳洲计算机信息安全专业,澳洲网络信息安全专业有哪些牛校?本科硕士有哪些方向可以选择?...
  2. RUOK的完整形式是什么?
  3. FPGA的学习:TFT_LCD液晶屏字符显示
  4. ArcMap下停靠栏的设计与实现
  5. android 屏幕orientation,关于屏幕旋转而orientation值不改变的问题
  6. Navicat的常用的使用技巧
  7. 现代信息检索——基本概念
  8. 前端读取服务器文件,js读取服务器端的txt文件
  9. 软件及系统开发项目可行性分析报告-样例
  10. php的电阻率是多少,PTF65517KBT-10B14