polarization op• 資料種類:stokes → table
• 呼叫:import optics; optics.stokes_analyze(stokes)(或 opsoptics.get("stokes_analyze"))
讀取 Stokes 向量:偏振度、方位角、橢圓率。
> 以下的詳細說明為原文 —— 摘要與標題已翻譯。
Returns a dict: `intensity S0 · dop` degree of polarisation
`sqrt(S1^2+S2^2+S3^2)/S0 · dolp linear part sqrt(S1^2+S2^2)/S0` ·
`docp circular part |S3|/S0 · azimuth_deg` orientation of the
polarisation ellipse `0.5*atan2(S2, S1) mapped into [0, 180)` ·
`ellipticity_deg 0.5*asin(S3/|S|) in [-45, +45]` ·
`handedness one of "right" / "left" / "linear"`.
**`azimuth_deg and ellipticity_deg are None` when they are
undefined** — azimuth when the linear part is exactly zero (circular or
unpolarised light has no orientation), ellipticity when the polarised part
is zero (unpolarised light has no ellipse). Returning 0.0 there would be a
fabricated angle; `None` says the truth and forces the caller to handle
it.
Ground truth it reproduces exactly: `[1,1,0,0]` -> dop 1, azimuth 0,
ellipticity 0, linear; `[1,-1,0,0] -> azimuth 90; [1,0,1,0]` ->
azimuth 45; `[1,0,0,1]` -> docp 1, ellipticity +45, right-handed;
`[1,0,0,0] -> dop 0 with both angles None`;
`[2,1,0,0]` -> dop 0.5 (a partially polarised beam, which is exactly the
case Jones algebra cannot express).
Raises `ValueError`: *stokes* is not a 1-D 4-vector, is complex /
masked / non-finite, is unphysical (`S0 < 0` or degree of polarisation
above 1 — which is how you find out a Mueller matrix was not physical), or
has `S0 == 0` (no light at all: every ratio would be 0/0, and "the
polarisation of darkness" is not a question with an answer).
optics 的每個運算子都先檢驗輸入再計算(不讓任何東西無聲通過):
• 單位寫進參數名 —— _mm / _um / _deg / _mrad。把 mm 和 µm 弄混不會當掉,而是給出「看似合理卻是錯的答案」,所以用命名來防。這裡絕不從數值大小去猜單位。
• **字串一律 ValueError** —— float('50') 會成功,於是未解析的設定值會被當成長度混進來(實測:thin_lens('50', '200') 曾回傳看似合理的 66.667 mm)。bool 也按 True == 1 的隱式提升拒絕。
• **complex / masked array 一律 ValueError(僅接受實數槽位;拒絕無聲丟棄虛部或剝掉遮罩)。所有輸入中的 NaN/Inf 一律 ValueError**。
• 逐項點名拒絕除零及其近親:焦距 0、曲率半徑 0、折射率 <= 0、全不透明光闌(全為 0,正規化變成 0/0)、總和 <= 0 的 PSF、S0 = 0 的 Stokes 向量、物體位於前焦點(像在無窮遠)。
• 只有兩個運算子會回傳非有限值,而且都寫進了契約:depth_of_field 在超焦距以外回傳 far_mm = inf(這正是超焦距的定義),gaussian_beam 在束腰處回傳 wavefront_radius_mm = inf(平面波前的曲率半徑)。兩者都同時回傳一個有限的夥伴(far_is_infinite / curvature_per_mm)。**除此之外的無聲 NaN/Inf 都在內部檢出並 ValueError** ——「float64 溢位了」和「答案是無窮大」是兩種不同的主張,不能拿後者的臉去交付前者。
• 尺寸上限:生成網格受 optics.MAX_GRID(4096)限制,傳入的場/PSF/光闌受 optics.MAX_FIELD_ELEMENTS(2^24),ABCD 元件序列受 optics.MAX_SYSTEM_ELEMENTS(1024),Zernike 受 MAX_ZERNIKE_TERMS(512)/ MAX_ZERNIKE_ORDER(40)/ MAX_ZERNIKE_BASIS(2^25)。以 fail-closed 堵住「小參數引發巨大內部配置」的路徑(實測:n_max=40 × 4096² 需要 108 GB)。
• 物理上不可能的狀態同樣拒絕:偏振度 > 1 的 Stokes 向量、負穿透率、負強度、n-|m| 為奇數等非法 Zernike 指標。
• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。
• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。
• 演算法的正典(作者・年份)與用途見上面的族使用指南。
• optics_imaging — py -3.11 examples/optics_imaging.py
• specular_photometric — py -3.11 examples/specular_photometric.py
table 作為輸入)abcd_matrix · wavefront_stats · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd · spot_diagram
polarization)jones_element · jones_apply · stokes_from_jones · mueller_element · mueller_apply
*Provenance: optics.py — OPTICS 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.