光學現象的Python實現(Understanding optics with Python)

來自:知乎

本文轉載自:https://zhuanlan.zhihu.com/p/104457445

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

“你終將於黑暗中觸摸白晝,它將如影般隨行。”

如果說20世紀是電子的世界,那麼21世紀就是光學的舞臺。

光學和光子學無處不在:智能手機和計算設備上的顯示方式,互聯網中承載信息的光纖,先進的精密製造,大量的生物醫學應用終端,全光衍射神經網絡等。對光學的深入理解為每一個學習物理和工程的同學帶來了機遇的同時也帶來了挑戰。

光學現象的Python實現(Understanding optics with Python)

難懂晦澀,佶屈聱牙,這是大家對光學知識的看法。在這個層面上,掌握光學仿真就尤為重要。

為什麼要學習光學仿真?

為什麼選擇Python?Python是一種可解釋性的、交互式的、面向對象的編程語言,它是開源的、易於學習的。此外,它有非常簡單和優雅的語法,適用於初學者。同時,與許多其他腳本語言一樣,Python是免費的,甚至可以用於商業目的,並且幾乎可以在任何現代計算機上運行的語言。Python程序由解釋器自動編譯成與平臺無關的代碼,然後進行解釋。不同的操作系統以相同的方式理解完全相同的源代碼,從而確保了完美的跨平臺兼容性。

目前,有大量的光學仿真模塊或光學應用程序是用Python編寫的,這些模塊使得光學仿真變得極為便利,下面具體介紹兩例:

貝塞爾函數

Scipy.sepcial模塊包含了大量的貝塞爾函數。在這裡,我們將使用函數jn和yn,這是第一/第二類貝塞爾函數和實值函數。函數jn_zeros和yn_zeros分別給出了函數jn和yn的零點

光學現象的Python實現(Understanding optics with Python)

源代碼如下:

<code>from scipy.special import jn, yn, jn_zeros , yn_zerosimport matplotlib.pyplot as pltimport numpy as npn = 0x = 0#第一類貝塞爾函數print ("J_%d(%f) = %f" % (n, x, jn(n, x)))#第二類貝塞爾函數x = 1print ("Y_%d(%f) = %f" % (n, x, yn(n, x)))# zeros of Bessel functionsn = 0 # orderm = 4 # number of roots to computeprint("zeros of Bessel functions are: ", jn_zeros(n, m))# Plot Bessel fonctionsx = 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()/<code>

2. 菲涅耳積分

Scipy.special.fresnel 模塊返回兩個菲涅耳函數,順序是(FS, FC),其中FS表示菲涅耳正弦積分,FC表示菲涅耳餘弦積分。菲涅耳積分與cornu spiral關係密切。

光學現象的Python實現(Understanding optics with Python)

源代碼如下:

<code>from scipy.special import fresnelfrom scipy import linspaceimport matplotlib.pyplot as pltt = 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()/<code>

這些適用於光學仿真的Python模塊還在持續大量更新中。相信Python的出現,會使光學仿真變得更加便捷、高效,直至推動光學學科的飛速進步。


分享到:


相關文章: