3、Jones矩阵运算:矩阵乘法与级联系统、特征值与特征向量分析、Python实现基础运算

好,我们进入第三章。前两章我们把偏振光用Jones矢量表示,把光学元件用Jones矩阵表示。这章要做的,就是把它们串起来——说白了,就是矩阵运算。

我个人觉得,Jones矩阵运算是整个偏振光学的“算术基础”。你后面要仿真、要设计系统,都离不开这章的内容。别小看矩阵乘法,它背后藏着光波经过多个元件的物理过程。

3.1 矩阵乘法与级联系统

先想一个问题:一束光先后经过两个偏振元件,出射光是什么?

假设第一个元件的Jones矩阵是 J₁,第二个是 J₂。入射光矢量是 E_in。经过第一个元件后,中间光矢量是 E_mid = J₁ · E_in。再经过第二个元件,出射光矢量是 E_out = J₂ · E_mid = J₂ · (J₁ · E_in)。

嗯,这里要注意:矩阵乘法不满足交换律。所以 J₂ · J₁ 和 J₁ · J₂ 完全是两码事。我在项目中遇到过几次,学生把顺序搞反了,仿真结果完全对不上。

级联系统的总Jones矩阵:

光波依次经过 J₁, J₂, J₃, ..., Jₙ,总矩阵为:

J_total = Jₙ · ... · J₃ · J₂ · J₁

注意:矩阵乘法顺序与光传播方向相反!

为什么会这样?因为矩阵乘法是从右向左结合的。第一个作用的矩阵在最右边,最后一个在最左边。你想想看,这就像穿衣服——先穿内衣,再穿外套。描述这个过程的矩阵,外套的矩阵写在左边,内衣的矩阵写在右边。

常见级联系统示例

系统 元件顺序(光传播方向) 总Jones矩阵
偏振片 + 四分之一波片 偏振片 → QWP J_QWP · J_pol
四分之一波片 + 偏振片 QWP → 偏振片 J_pol · J_QWP
两个波片级联 QWP → HWP J_HWP · J_QWP

我曾经帮一个做激光雷达的朋友调试系统,他死活搞不定消光比。我一看代码,他把波片和偏振片的矩阵顺序写反了。改过来之后,消光比直接提升了两个数量级。嗯,这种错误其实很常见。

3.2 特征值与特征向量分析

矩阵的特征值和特征向量,在偏振光学里有什么物理意义?

说白了,对于一个Jones矩阵 J,它的特征向量代表一种特殊的偏振态——光波经过这个元件后,偏振态不变,只改变幅度和相位。特征值就是那个幅度和相位的变化因子。

举个例子。一个理想偏振片的Jones矩阵是:

J_pol = [[1, 0],
         [0, 0]]

它的特征向量是什么?算一下就知道:

  • 特征值 λ₁ = 1,对应特征向量 [1, 0]ᵀ —— 水平偏振光完全通过
  • 特征值 λ₂ = 0,对应特征向量 [0, 1]ᵀ —— 垂直偏振光完全被消光

你看,特征向量直接告诉你这个元件“偏好”什么偏振态。我在做偏振成像系统设计时,经常用特征值分析来评估元件的偏振纯度。

实用技巧:

如果Jones矩阵的两个特征值相等,说明这个元件对所有偏振态一视同仁——它就是个纯相位延迟器,不改变偏振态。

如果特征值一个是实数一个是0,那它就是个理想偏振片。

3.3 Python实现基础运算

光说不练假把式。我们直接用Python把上面这些运算实现一遍。我习惯用NumPy,它处理矩阵运算非常方便。

3.3.1 定义基本Jones矩阵

import numpy as np

# 水平偏振片
J_pol_h = np.array([[1, 0],
                    [0, 0]])

# 四分之一波片(快轴水平)
J_qwp = np.array([[1, 0],
                  [0, 1j]])

# 半波片(快轴水平)
J_hwp = np.array([[1, 0],
                  [0, -1]])

# 旋转矩阵(旋转角度θ)
def rot_matrix(theta):
    c = np.cos(theta)
    s = np.sin(theta)
    return np.array([[c, -s],
                     [s, c]])

3.3.2 级联系统计算

# 入射光:45°线偏振光
E_in = np.array([1, 1]) / np.sqrt(2)

# 系统:QWP + 偏振片(水平)
J_system = J_pol_h @ J_qwp

E_out = J_system @ E_in
print("出射光矢量:", E_out)
print("出射光强度:", np.abs(E_out[0])**2 + np.abs(E_out[1])**2)

这里我用 @ 运算符做矩阵乘法,这是NumPy的推荐写法。我个人习惯把所有中间结果都打印出来看看,方便调试。

3.3.3 特征值与特征向量计算

# 计算QWP的特征值和特征向量
eigvals, eigvecs = np.linalg.eig(J_qwp)

print("特征值:", eigvals)
print("特征向量:")
print(eigvecs)

# 验证:J · v = λ · v
for i in range(2):
    v = eigvecs[:, i]
    lam = eigvals[i]
    lhs = J_qwp @ v
    rhs = lam * v
    print(f"特征向量 {i+1}: 左侧 = {lhs}, 右侧 = {rhs}")

注意:NumPy的 eig 函数返回的特征向量是列向量,存储在矩阵的列中。取第i个特征向量要用 eigvecs[:, i],不是 eigvecs[i]。我曾经在这上面栽过跟头,算出来的结果怎么都不对。

3.3.4 完整仿真示例:偏振态演化追踪

def simulate_polarization_evolution(J_list, E_in):
    """
    追踪光波经过多个元件的偏振态变化
    J_list: Jones矩阵列表,按光传播方向排列
    E_in: 入射Jones矢量
    """
    states = [E_in]
    E_current = E_in
    
    for i, J in enumerate(J_list):
        E_current = J @ E_current
        states.append(E_current)
        print(f"经过元件 {i+1} 后: {E_current}")
    
    return states

# 示例:光波经过 QWP → HWP → 偏振片
J_list = [J_qwp, J_hwp, J_pol_h]
E_in = np.array([1, 0])  # 水平偏振入射

states = simulate_polarization_evolution(J_list, E_in)

这段代码我经常用在教学演示里。你想想看,把每个元件后的偏振态都打印出来,整个物理过程一目了然。

3.4 知识结构总览

下面这张图把本章的核心逻辑串起来了。我建议你把它存下来,做仿真时对照着看。

第三章 知识结构图 Jones矩阵运算 矩阵乘法与级联 特征值与特征向量 Python基础运算 顺序:右乘优先 不满足交换律 物理意义:本征偏振态 特征值:幅度/相位变化 NumPy矩阵运算 np.linalg.eig 核心要点 矩阵乘法顺序 = 光传播的逆序 特征向量 = 偏振元件的不变偏振态 Python仿真 = 物理概念的数值实现

这张图把矩阵乘法、特征分析、Python实现三个分支的关系画清楚了。你写代码的时候,脑子里要有这张图——每一步运算对应哪个物理过程,心里要清楚。

我的个人习惯:每次写仿真代码前,先在纸上把Jones矩阵的乘法顺序写一遍,确认物理过程正确,再动手写代码。这能省下大量调试时间。