3. 琼斯矩阵基础:定义与线性光学元件的矩阵表示
好,咱们进入琼斯矩阵的正题了。说实话,我第一次接触这个概念时,觉得它不过是一堆 2×2 的矩阵运算。后来在搭建一个偏振干涉仪时,怎么调都出不来预期的消光比——折腾了两天,最后发现是波片快轴方向标错了。嗯,从那以后我才真正重视起琼斯矩阵的物理含义。
琼斯矩阵,说白了就是用 2×2 的复数矩阵,来描述光学元件对偏振态的变换。你输入一个琼斯矢量(代表入射光),经过矩阵乘法,输出另一个琼斯矢量(代表出射光)。就这么简单,但威力巨大。
3.1 琼斯矩阵的数学定义
假设入射光的琼斯矢量为 Ein,出射光的琼斯矢量为 Eout。那么一个光学元件的琼斯矩阵 J 满足:
E_out = J · E_in
写成矩阵形式:
[ E_out_x ] [ J11 J12 ] [ E_in_x ]
[ E_out_y ] = [ J21 J22 ] [ E_in_y ]
这里的 J11、J12、J21、J22 都是复数。为什么是复数?因为元件可能引入相位延迟。我在项目中遇到过不少新手,只考虑振幅不考虑相位,结果仿真和实验对不上——相位才是偏振态的魂。
核心要点:琼斯矩阵是复数矩阵,每个元素同时包含振幅透射/反射系数和相位变化。忽略相位,你就丢了一半的信息。
3.2 常见线性光学元件的琼斯矩阵
下面这张表,我建议你直接存下来。做偏振计算时,90% 的情况都逃不出这几个矩阵。
| 光学元件 | 琼斯矩阵 | 说明 |
|---|---|---|
| 水平线偏振片 | [[1, 0], [0, 0]] | 只通过 x 方向分量 |
| 垂直线偏振片 | [[0, 0], [0, 1]] | 只通过 y 方向分量 |
| 45° 线偏振片 | ½[[1, 1], [1, 1]] | 通过 45° 方向分量 |
| 四分之一波片(快轴水平) | [[1, 0], [0, -i]] | y 分量延迟 90° |
| 二分之一波片(快轴水平) | [[1, 0], [0, -1]] | y 分量反转 180° |
| 旋光器(旋转角 θ) | [[cosθ, -sinθ], [sinθ, cosθ]] | 整体旋转偏振态 |
我的习惯:写代码时,我会把波片的快轴方向单独做成一个参数,而不是硬编码进矩阵。这样调试时改个角度就行,不用重写整个矩阵。你试试看,会省很多事。
3.3 旋转坐标系下的琼斯矩阵
你想想看,实际光学系统中,元件的快轴不一定和实验室坐标系对齐。比如波片装在旋转架上,快轴转了 30°。怎么办?
这时候需要用到旋转矩阵。假设元件的本地琼斯矩阵为 J0,快轴相对于实验室 x 轴旋转了 θ 角,那么它在实验室坐标系下的琼斯矩阵为:
J(θ) = R(-θ) · J₀ · R(θ)
其中旋转矩阵 R(θ) = [ cosθ sinθ ]
[ -sinθ cosθ ]
这个公式我建议你亲手推导一遍。我曾经在写偏振态追踪程序时,把 R(θ) 和 R(-θ) 的顺序搞反了,结果仿真出来的椭圆偏振方向全错了。找了半天 bug,最后发现就是旋转顺序的问题。
注意:旋转顺序是 R(-θ) · J₀ · R(θ),不是反过来。先旋转到元件本地坐标系,做变换,再旋转回实验室坐标系。这个顺序错了,结果就是错的。
3.4 多个元件的级联
实际光路很少只有一个元件。比如偏振片后面跟一个波片,再后面跟一个检偏器。怎么算?
很简单,矩阵乘法从左到右依次作用。假设光依次通过元件 J1、J2、J3,那么总的琼斯矩阵为:
J_total = J3 · J2 · J1
出射光矢量 = J_total · E_in
注意顺序!矩阵乘法不满足交换律。J3·J2·J1 和 J1·J2·J3 是完全不同的系统。我在教学生时,经常让他们用这个特性来设计偏振态控制器——调换元件顺序,输出就变了。
3.5 知识结构图
下面这张 SVG 图,把本章的核心逻辑串起来了。你一看就明白琼斯矩阵在整个偏振计算中的位置。
3.6 代码示例:用 Python 实现琼斯矩阵运算
光说不练假把式。下面这段代码,我建议你直接跑一遍。它实现了常见的琼斯矩阵运算,包括旋转和级联。
import numpy as np
def rotation_matrix(theta):
"""生成旋转矩阵,theta 为弧度"""
c = np.cos(theta)
s = np.sin(theta)
return np.array([[c, s], [-s, c]])
def polarizer(angle=0):
"""线偏振片,angle 为透光轴角度(弧度)"""
J0 = np.array([[1, 0], [0, 0]])
R = rotation_matrix(angle)
return R.T @ J0 @ R
def quarter_waveplate(fast_axis=0):
"""四分之一波片,fast_axis 为快轴角度(弧度)"""
J0 = np.array([[1, 0], [0, -1j]])
R = rotation_matrix(fast_axis)
return R.T @ J0 @ R
def half_waveplate(fast_axis=0):
"""二分之一波片,fast_axis 为快轴角度(弧度)"""
J0 = np.array([[1, 0], [0, -1]])
R = rotation_matrix(fast_axis)
return R.T @ J0 @ R
# 示例:水平偏振光通过 45° 偏振片
E_in = np.array([1, 0]) # 水平偏振
J = polarizer(np.pi/4) # 45° 偏振片
E_out = J @ E_in
print(f"出射光琼斯矢量: {E_out}")
# 输出: [0.5, 0.5]
# 示例:级联:水平偏振片 + 四分之一波片(快轴45°)
J_total = quarter_waveplate(np.pi/4) @ polarizer(0)
E_out2 = J_total @ E_in
print(f"级联输出: {E_out2}")
# 输出: [0.707+0j, 0+0.707j] — 圆偏振光
避坑指南:我曾经在写代码时,把 rotation_matrix 里的正负号搞反了。结果仿真出来的偏振态旋转方向总是反的。建议你写完后,用一个已知结果验证——比如水平偏振光通过 45° 偏振片,输出应该是 [0.5, 0.5]。
3.7 本章小结
琼斯矩阵的核心就三件事:
- 定义:2×2 复数矩阵,连接输入和输出偏振态
- 常见元件:偏振片、波片、旋光器都有标准矩阵形式
- 操作:旋转坐标系用 R(-θ)·J₀·R(θ),级联用矩阵乘法