光的世界︰【□○閱讀】薄透鏡組合之計算

我們已經討論過鏡頭或眼睛藉著近攝鏡或放大鏡觀物的現象。通常是以『有』、『無』輔助設備來作對照立論。如此方能避開特定的人與相機,彰顯那個設備之功用與目的。由於這個模式

X_o →人眼或相機 f_o →像 I_o

物  X_c →裝置 f_c → 距離 L →人眼或相機 f_o → 像 I_c = I_o

常見且重要,所以在此專章說說。或許在經歷複雜數學計算之後,讀者得以體會 SymPy 符號運算的好處。

pi@raspberrypi:~ ipython3 Python 3.4.2 (default, Oct 19 2014, 13:31:11)  Type "copyright", "credits" or "license" for more information.  IPython 2.3.0 -- An enhanced Interactive Python. ?         -> Introduction and overview of IPython's features. %quickref -> Quick reference. help      -> Python's own help system. object?   -> Details about 'object', use 'object??' for extra details.  In [1]: from sympy import *  In [2]: from sympy.physics.optics import FreeSpace, FlatRefraction, ThinLens, GeometricRay, CurvedRefraction, RayTransferMatrix  In [3]: init_printing()  In [4]: fc, L, fo, Xo, Io, Ic, Xc = symbols('fc, L, fo, Xo, Io, Ic, Xc')  # 物 Xo →人眼或相機 fo →像 Io In [5]: olens = FreeSpace(Io) * ThinLens(fo) * FreeSpace(Xo)  In [6]: olens Out[6]:  ⎡  Io              ⎛  Io    ⎞⎤ ⎢- ── + 1  Io + Xo⋅⎜- ── + 1⎟⎥ ⎢  fo              ⎝  fo    ⎠⎥ ⎢                            ⎥ ⎢  -1             Xo         ⎥ ⎢  ───          - ── + 1     ⎥ ⎣   fo            fo         ⎦   # 成像位置 In [7]: oImg = solve(olens.B, Io)[0]  In [8]: oImg Out[8]:   Xo⋅fo  ─────── Xo - fo  # 組合透鏡 In [9]: clens = ThinLens(fo) * FreeSpace(L) * ThinLens(fc)  In [10]: clens Out[10]:  ⎡     L                   ⎤ ⎢   - ── + 1         L    ⎥ ⎢     fc                  ⎥ ⎢                         ⎥ ⎢         L               ⎥ ⎢       - ── + 1          ⎥ ⎢  1      fo        L     ⎥ ⎢- ── - ────────  - ── + 1⎥ ⎣  fo      fc       fo    ⎦  # 組合焦距 feq. = - 1/C In [11]: clens.C.simplify() Out[11]:  L - fc - fo ───────────    fc⋅fo      # 物 Xc →裝置 fc → 距離 L →人眼或相機 fo → 像 Ic = Io In [12]: cImg = FreeSpace(Ic) * clens * FreeSpace(Xc)  In [13]: Sol = solve(cImg.B, Xc)  In [14]: Sol Out[14]:  ⎡     fc⋅(-Ic⋅L + Ic⋅fo + L⋅fo)      ⎤ ⎢────────────────────────────────────⎥ ⎣-Ic⋅L + Ic⋅fc + Ic⋅fo + L⋅fo - fc⋅fo⎦   # 同一成像位置 oImg 條件下的物距 Xc In [15]: Sol[0].subs(Ic, oImg).simplify() Out[15]:  fc⋅(L - Xo) ─────────── L - Xo - fc  In [16]:  </pre>    <span style="color: #003300;">經過一番計算後,得到</span>  <span style="color: #003300;">【沒有輔助設備時】</span>  <span style="color: #003300;">位於X_o之物將成像於I_o,此像距稱作oImg以X_o來表示為</span>\frac{X_o f_o}{X_o - f_o}。  <span style="color: #003300;">若果聚焦成像,I_o > 0 ,意味著X_o > f_o。</span>  <span style="color: #003300;">【有輔助設備時】</span>  <span style="color: #003300;">在同一成像位置oImg條件下,對應的物距X_c將是</span>\frac{f_c \cdot (L - X_o)}{L - X_o - f_c}。  <span style="color: #003300;">當然X_c > 0,否則物將位於輔助設備與人眼或相機之間了。因此L < X_o或</span>  <span style="color: #003300;">L > X_o + f_c。</span>  <span style="color: #003300;">※X_c = 0有什麼意義嗎??此時L = X_o,此物在輔助設備f_c之端點面上!!是否物距\to 0^+時,像距\to 0^-的呢??!!</span>  <span style="color: #003300;">所以當L \to 0,<a style="color: #003300;" href="http://www.freesandal.org/?p=60369">薄透鏡緊貼</a>條件下︰</span>  <span style="color: #003300;">X_c_{(L \to 0)} = \frac{- f_c X_o}{-(X_o +f_c)} = \frac{X_o}{\frac{X_o}{f_c} + 1}。</span>  <span style="color: #003300;">也可推演相對放大率為</span>  <span style="color: #003300;">\frac{X_o}{f_c} + 1 也。</span> <pre class="lang:python decode:true "># 人眼或鏡頭的放大率 In [16]: oMx = oImg / Xo  In [17]: oMx Out[17]:     fo   ─────── Xo - fo   #相同條件下,組合系統之放大率 In [18]: cM = oImg / Sol[0].subs(Ic, oImg).simplify()  In [19]: cM Out[19]:   Xo⋅fo⋅(L - Xo - fc)  ───────────────────── fc⋅(L - Xo)⋅(Xo - fo)  # 緊貼時之相對放大率 In [20]: (cM.subs(L,0)/oMx).simplify() Out[20]:  Xo + fc ───────    fc    In [21]:  </pre>    <span style="color: #003300;">當L > X_o + f_c時,組合焦距f_{eq.} = \frac{f_c f_o}{(f_c + f_o) -L}$ 會是『負』的??難道發散亦能成『實像』的耶!!

若說事因不同參考系而起,何不親自動手驗證看看呢!!??
# 前主平面
In [21]: p1 = (1-clens.D.simplify())/clens.C.simplify()

In [22]: p1
Out[22]: 
      ⎛    -L + fo⎞
fc⋅fo⋅⎜1 - ───────⎟
      ⎝       fo  ⎠
───────────────────
    L - fc - fo    


# 後主平面
In [23]: p2 = (1-clens.A.simplify())/clens.C.simplify()

In [24]: p2
Out[24]: 
      ⎛    -L + fc⎞
fc⋅fo⋅⎜1 - ───────⎟
      ⎝       fc  ⎠
───────────────────
    L - fc - fo    


# 主平面參考系之物距 Xc'
In [25]: (Sol[0].subs(Ic, oImg).simplify() - p1).simplify()
Out[25]: 
fc⋅(L⋅(-L + Xo + fc) - (L - Xo)⋅(-L + fc + fo))
───────────────────────────────────────────────
         (-L + Xo + fc)⋅(-L + fc + fo)         


# 主平面參考系之像距 oImg'
In [26]: (oImg - p2).simplify()
Out[26]: 
fo⋅(L⋅(Xo - fo) + Xo⋅(-L + fc + fo))
────────────────────────────────────
      (Xo - fo)⋅(-L + fc + fo)      


# 手動簡化?
In [27]: E = fc*(L*(-L + Xo + fc) - (L - Xo)*(-L + fc + fo))

In [28]: E.expand().simplify()
Out[28]: fc⋅(-L⋅fo + Xo⋅fc + Xo⋅fo)

In [29]: F = fo*(L*(Xo - fo) + Xo*(-L + fc + fo))

In [30]: F.expand().simplify()
Out[30]: fo⋅(-L⋅fo + Xo⋅fc + Xo⋅fo)


# 主平面成像公式驗證。 Xc' = E/E1 , oImg' = F/F1
In [31]: E = E.expand().simplify()

In [32]: F = F.expand().simplify()

In [33]: E1 = (-L + Xo + fc)*(-L + fc + fo)

In [34]: F1 = (Xo - fo)*(-L + fc + fo)


# 果然成立乎!
In [35]: (E1/E + F1/F).simplify()
Out[35]: 
-L + fc + fo
────────────
   fc⋅fo    

In [36]: