(一)光学现象的Python实现(Understanding optics with Python)

本小妞迷上赌 提交于 2020-08-16 10:21:40

“You will see light in the darkness。You will make some sense of this.”

“你终将于黑暗中触摸白昼,它将如影般随行。”

如果说20世纪是电子的世界,那么21世纪就是光学的舞台。

光学和光子学无处不在:智能手机和计算设备上的显示方式,互联网中承载信息的光纤,先进的精密制造,大量的生物医学应用终端,全光衍射神经网络等。对光学的深入理解为每一个学习物理和工程的同学带来了机遇的同时也带来了挑战。

难懂晦涩,佶屈聱牙,这是大家对光学知识的看法。在这个层面上,掌握光学仿真就尤为重要。

为什么要学习光学仿真?作为一个科研工作者本身,我希望自身理解物理,特别是光学,这不应该仅仅局限于对一组方程的理解,更应该对看得见摸得着的光学现象进行理解。除此之外,考虑到那些或没有充足实验设备的情况,或时间有限无法进行实验室验证的情况,仿真就变得尤为重要。可以说,仿真训练是主动学习的重要组成部分;有相当多的证据表明,主动学习(动手仿真)的效果要优于传统的教学方式(上课-听课模式)。

为什么选择Python?Python (https://www.python.org/)是一种可解释性的、交互式的、面向对象的编程语言,它是开源的、易于学习的。此外,它有非常简单和优雅的语法,适用于初学者。同时,与许多其他脚本语言一样,Python是免费的,甚至可以用于商业目的,并且几乎可以在任何现代计算机上运行的语言。Python程序由解释器自动编译成与平台无关的代码,然后进行解释。不同的操作系统以相同的方式理解完全相同的源代码,从而确保了完美的跨平台兼容性。

目前,有大量的光学仿真模块或光学应用程序是用Python编写的,这些模块使得光学仿真变得极为便利,下面具体介绍两例:

  1. 贝塞尔函数

Scipy.sepcial模块包含了大量的贝塞尔函数。在这里,我们将使用函数jn和yn,这是第一/第二类贝塞尔函数和实值函数。函数jn_zeros和yn_zeros分别给出了函数jn和yn的零点

源代码如下:

from scipy.special import jn, yn, jn_zeros , yn_zeros
import matplotlib.pyplot as plt
import numpy as np

n = 0
x = 0

#第一类贝塞尔函数
print ("J_%d(%f) = %f" % (n, x, jn(n, x)))

#第二类贝塞尔函数
x = 1
print ("Y_%d(%f) = %f" % (n, x, yn(n, x)))

# zeros of Bessel functions
n = 0 # order
m = 4 # number of roots to compute
print("zeros of Bessel functions are: ", jn_zeros(n, m))

# Plot Bessel fonctions
x = np.linspace(0, 10, 50)
markers=['o','s','*','+']
lines=['-','--','-.',':']

fig, ax = plt.subplots()
for n in range(4):
    ax.plot(x, jn(n, x),ls=str(lines[n]),marker=str(markers[n]),label=r"$J_%d(x)$" % n)
ax.legend()
plt.show()

2. 菲涅耳积分

Scipy.special.fresnel 模块返回两个菲涅耳函数,顺序是(FS, FC),其中FS表示菲涅耳正弦积分,FC表示菲涅耳余弦积分。菲涅耳积分与cornu spiral关系密切。

源代码如下:

from scipy.special import fresnel
from scipy import linspace
import matplotlib.pyplot as plt
t = linspace(-10, 10, 1000)
FS, FC = fresnel(t)
fig1=plt.figure(figsize=(10,5))
ax1=plt.subplot(1, 2, 1)
ax1.plot(FC, FS, linewidth=2)
ax1.set_xlabel("C(t)", fontsize=14, weight='bold')
ax1.set_ylabel("S(t)", fontsize=14, weight='bold')
ax1.set_title("Cornu spiral", fontsize=16, weight='bold')

ax2=plt.subplot(1, 2, 2)
ax2.plot(t, FS, ls='--',linewidth=2,label="S(t)", alpha=.8)
ax2.plot(t, FC,ls='-',linewidth=2,label="C(t)", alpha=.8)
ax2.set_xlabel("t", fontsize=14, weight='bold')
ax2.set_title("Fresnel integrals", fontsize=16, weight='bold')
plt.legend()
plt.show()

这些适用于光学仿真的Python模块还在持续大量更新中。相信Python的出现,会使光学仿真变得更加便捷、高效,直至推动光学学科的飞速进步。


【1】注:此为武汉肺炎期间闲来无事宅家之作,也为我的假期学习笔记,希望该专栏不会烂尾,能够持续更新,直至将光学领域的现象介绍完毕敬请关注。同时,本文相关内容致敬经典书籍《Understanding optics with Python》,作者:Vasudevan Lakshminarayanan等。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!