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 图,把本章的核心逻辑串起来了。你一看就明白琼斯矩阵在整个偏振计算中的位置。

琼斯矩阵知识体系 琼斯矩阵 J (2×2 复数) 输入琼斯矢量 E_in 输出琼斯矢量 E_out E_out = J · E_in 线偏振片 波片 (λ/4, λ/2) 旋光器 相位延迟器 旋转坐标系:J(θ) = R(-θ) · J₀ · R(θ) 级联:J_total = J₃ · J₂ · J₁ 注意 矩阵乘法不满足 交换律

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(θ),级联用矩阵乘法