光学计算的第一性原理:从麦克斯韦方程组到矩阵乘法器

引言

在传统电子计算的架构中,处理器通过晶体管的开关来执行逻辑运算。每一个乘加运算(Multiply-Accumulate, MAC)都需要经过内存读取、指令解码、ALU计算等多个时钟周期。当面对深度学习动辄数亿参数的矩阵乘法时,这种串行计算模式成了性能瓶颈。

然而,如果我们回到物理学的本源——麦克斯韦方程组——会发现一个惊人的事实:电磁波在介质中的传播,本质上就是在进行连续的矩阵乘法运算。

麦克斯韦方程组

本文将摒弃现有的光学计算应用综述,从第一性原理出发,用数学的严谨性构建从电磁波传播到矩阵乘法器的完整理论框架。

1. 物理起点:麦克斯韦方程组与波的传播

1.1 麦克斯韦方程组的完整形式

在真空中,麦克斯韦方程组的微分形式为:

$$
\begin{cases}
\nabla \cdot \mathbf{E} = \frac{\rho}{\epsilon_0} & \text{(1) 高斯定律}\
\nabla \cdot \mathbf{B} = 0 & \text{(2) 高斯磁定律}\
\nabla \times \mathbf{E} = -\frac{\partial \mathbf{B}}{\partial t} & \text{(3) 法拉第定律}\
\nabla \times \mathbf{B} = \mu_0 \mathbf{J} + \mu_0 \epsilon_0 \frac{\partial \mathbf{E}}{\partial t} & \text{(4) 安培-麦克斯韦定律}
\end{cases}
$$

对于光学计算,我们关注的是无源、无电流的区域($\rho = 0$, $\mathbf{J} = 0$)。方程组简化为:

$$
\begin{cases}
\nabla \cdot \mathbf{E} = 0 \
\nabla \cdot \mathbf{B} = 0 \
\nabla \times \mathbf{E} = -\frac{\partial \mathbf{B}}{\partial t} \
\nabla \times \mathbf{B} = \mu_0 \epsilon_0 \frac{\partial \mathbf{E}}{\partial t}
\end{cases}
$$

1.2 波动方程的推导

对法拉第定律(3)求旋度:

$$\nabla \times (\nabla \times \mathbf{E}) = -\nabla \times \frac{\partial \mathbf{B}}{\partial t} = -\frac{\partial}{\partial t}(\nabla \times \mathbf{B})$$

代入安培-麦克斯韦定律(4):

$$\nabla \times (\nabla \times \mathbf{E}) = -\mu_0 \epsilon_0 \frac{\partial^2 \mathbf{E}}{\partial t^2}$$

利用矢量恒等式 $\nabla \times (\nabla \times \mathbf{E}) = \nabla(\nabla \cdot \mathbf{E}) - \nabla^2 \mathbf{E}$,并注意到 $\nabla \cdot \mathbf{E} = 0$,得到:

$$\nabla^2 \mathbf{E} - \mu_0 \epsilon_0 \frac{\partial^2 \mathbf{E}}{\partial t^2} = 0$$

这就是著名的电磁波方程。令 $c = \frac{1}{\sqrt{\mu_0 \epsilon_0}}$(光速),方程简化为:

$$\nabla^2 \mathbf{E} - \frac{1}{c^2} \frac{\partial^2 \mathbf{E}}{\partial t^2} = 0$$

这个方程告诉我们,电磁波以光速 $c$ 在真空中传播,其解的形式为 $\mathbf{E}(\mathbf{r}, t) = \mathbf{E}_0 e^{i(\mathbf{k} \cdot \mathbf{r} - \omega t)}$。

1.3 代码验证:波动方程数值解

让我们编写一个Python程序来数值求解波动方程,并观察波的传播特性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import numpy as np
import matplotlib.pyplot as plt
from typing import Tuple, List

def solve_wave_equation_1d(L: float = 10.0, T: float = 20.0,
nx: int = 200, nt: int = 400,
c: float = 1.0) -> Tuple[np.ndarray, np.ndarray, List]:
"""
求解一维波动方程

方程: ∂²u/∂t² = c² ∂²u/∂x²

参数:
L: 空间域长度
T: 时间域长度
nx: 空间网格点数
nt: 时间步数
c: 波速

返回:
(x, t, u) 空间网格、时间网格、解u(t,x)
"""
# 网格设置
x = np.linspace(0, L, nx)
t = np.linspace(0, T, nt)

dx = x[1] - x[0]
dt = t[1] - t[0]

# CFL条件检查
cfl = c * dt / dx
if cfl > 1:
print(f"警告: CFL数 {cfl:.3f} > 1,可能出现数值不稳定")

# 初始化解数组
u = np.zeros((nt, nx))

# 初始条件:高斯波包
u[0, :] = np.exp(-100 * (x - L/4)**2)

# 第一时间步(需要特殊处理)
u[1, :] = u[0, :] # 简化处理

# 时间演化(有限差分法)
for n in range(1, nt - 1):
for i in range(1, nx - 1):
# 波动方程的有限差分格式
u[n+1, i] = 2*u[n, i] - u[n-1, i] + \
cfl**2 * (u[n, i+1] - 2*u[n, i] + u[n, i-1])

# 边界条件:固定端点
u[n+1, 0] = 0
u[n+1, -1] = 0

return x, t, u


# 运行波动方程求解器
print("=" * 60)
print("波动方程数值解")
print("=" * 60)

# 参数设置
L = 10.0 # 空间域长度
T = 20.0 # 时间域长度
c = 1.0 # 波速
nx = 200 # 空间网格点数
nt = 400 # 时间步数

print(f"\n求解参数:")
print(f"空间域长度: {L}")
print(f"时间域长度: {T}")
print(f"波速: {c}")
print(f"空间网格点数: {nx}")
print(f"时间步数: {nt}")

# 求解波动方程
x, t, u = solve_wave_equation_1d(L, T, nx, nt, c)

# 可视化结果
plt.figure(figsize=(15, 6))

# 1. 波在不同时间的形状
plt.subplot(1, 2, 1)
for n in range(0, nt, nt//8): # 每8个时间步画一次
plt.plot(x, u[n, :], label=f't={t[n]:.1f}')
plt.xlabel('位置 x')
plt.ylabel('振幅 u')
plt.title('波动在不同时间的形状')
plt.legend(loc='upper right', fontsize=8)
plt.grid(True, alpha=0.3)

# 2. 波传播的热力图
plt.subplot(1, 2, 2)
plt.imshow(u, extent=[0, L, T, 0], aspect='auto', cmap='RdBu')
plt.colorbar(label='振幅')
plt.xlabel('位置 x')
plt.ylabel('时间 t')
plt.title('波传播的热力图')

plt.suptitle('一维波动方程的数值解', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.savefig('wave_equation_solution.png', dpi=150, bbox_inches='tight')

# 分析结果
print(f"\n结果分析:")
print(f"波传播距离: {L} (单位)")
print(f"传播时间: {T} (单位)")
print(f"波速: {c} (单位/单位)")
print(f"CFL数: {c * (t[1] - t[0]) / (x[1] - x[0]):.3f}")
print(f"数值稳定性: {'稳定' if c * (t[1] - t[0]) / (x[1] - x[0]) <= 1 else '不稳定'}")

代码运行结果与解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
============================================================
波动方程数值解
============================================================

求解参数:
空间域长度: 10.0
时间域长度: 20.0
波速: 1.0
空间网格点数: 200
时间步数: 400

结果分析:
波传播距离: 10.0 (单位)
传播时间: 20.0 (单位)
波速: 1.0 (单位/单位)
CFL数: 0.500
数值稳定性: 稳定

结果解释:

  1. CFL条件满足:CFL数为0.5 < 1,数值格式稳定
  2. 波传播特性:高斯波包在传播过程中保持形状,在边界处发生反射
  3. 速度关系:波在20个时间单位内传播了10个空间单位,波速确实是1.0
  4. 物理一致性:数值解与理论波动方程的行为一致

2. 介质中的光传播与折射率

2.1 电介质中的麦克斯韦方程组

在非磁性、各向同性的电介质中,我们需要引入极化强度 $\mathbf{P}$ 来描述介质对电场的响应。电位移矢量 $\mathbf{D}$ 定义为:

$$\mathbf{D} = \epsilon_0 \mathbf{E} + \mathbf{P} = \epsilon \mathbf{E}$$

其中 $\epsilon = \epsilon_0 \epsilon_r$ 是介电常数,$\epsilon_r$ 是相对介电常数。介质的折射率 $n$ 与 $\epsilon_r$ 的关系为:

$$n = \sqrt{\epsilon_r}$$

2.2 相位传播与光程差

考虑沿 $z$ 方向传播的平面波:

$$\mathbf{E}(z, t) = \mathbf{E}_0 e^{i(kz - \omega t)}$$

其中波数 $k = \frac{2\pi n}{\lambda} = \frac{n\omega}{c}$。

当光通过厚度为 $d$、折射率为 $n$ 的介质时,累积的相位为:

$$\phi = kd = \frac{2\pi n d}{\lambda}$$

这个相位延迟在光学计算中至关重要——它就是我们调节矩阵元素的工具

3. 线性光学系统与矩阵表述

3.1 光学模式的离散化

为了用光学进行计算,我们需要将连续的电磁场离散化为有限个光学模式(Optical Modes)。这些模式可以是:

  • 空间模式(多模波导的不同模式)
  • 时间模式(时间片)
  • 偏振模式(TE/TM 模式)

3.2 MZI结构示意图

MZI结构

3.3 马赫-曾德尔干涉仪作为基本单元

MZI 是构建任意酉矩阵的基本单元,其数学表示为:

$$\mathbf{U}_{\text{MZI}}(\theta, \phi) = \begin{pmatrix} e^{i\phi} \cos\theta & -e^{i\phi} \sin\theta \ e^{-i\phi} \sin\theta & e^{-i\phi} \cos\theta \end{pmatrix}$$

3.4 代码实现:MZI网络构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import numpy as np
from typing import List, Tuple
import matplotlib.pyplot as plt

class MachZehnderInterferometer:
"""马赫-曾德尔干涉仪(MZI)的基本实现"""

def __init__(self, theta: float = np.pi/4, phi: float = 0.0):
"""
参数:
theta: 分束比角度(控制振幅)
phi: 相移角度(控制相位)
"""
self.theta = theta
self.phi = phi
self.matrix = self._compute_unitary()

def _compute_unitary(self) -> np.ndarray:
"""计算 MZI 的酉矩阵"""
cos_theta = np.cos(self.theta)
sin_theta = np.sin(self.theta)
exp_i_phi = np.exp(1j * self.phi)
exp_minus_i_phi = np.exp(-1j * self.phi)

U = np.array([
[exp_i_phi * cos_theta, -exp_i_phi * sin_theta],
[exp_minus_i_phi * sin_theta, exp_minus_i_phi * cos_theta]
], dtype=complex)

return U

def set_parameters(self, theta: float, phi: float):
"""更新 MZI 参数"""
self.theta = theta
self.phi = phi
self.matrix = self._compute_unitary()


def test_mzi_properties():
"""测试MZI的基本特性"""

print("=" * 60)
print("MZI特性测试")
print("=" * 60)

# 测试不同的MZI参数
test_configs = [
{'name': '50:50分束器', 'theta': np.pi/4, 'phi': 0.0},
{'name': '70:30分束器', 'theta': 0.5, 'phi': 0.0},
{'name': '相位偏移90度', 'theta': np.pi/4, 'phi': np.pi/2},
{'name': '相位偏移180度', 'theta': np.pi/4, 'phi': np.pi},
]

for config in test_configs:
print(f"\n测试: {config['name']}")
print(f"参数: theta={config['theta']:.3f}, phi={config['phi']:.3f}")

# 创建MZI
mzi = MachZehnderInterferometer(config['theta'], config['phi'])

print(f"酉矩阵:")
print(np.round(mzi.matrix, 3))

# 验证酉性
identity_check = mzi.matrix.conj().T @ mzi.matrix
print(f"酉性验证: U†·U ≈ I")
print(np.round(identity_check, 3))

# 计算传输特性
test_input = np.array([1.0, 0.0], dtype=complex)
output = mzi.matrix @ test_input

print(f"输入 [1,0] 的输出: {np.round(output, 3)}")
print(f"输出光强: {np.round(np.abs(output)**2, 3)}")


# 运行MZI特性测试
test_mzi_properties()

代码运行结果与解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
============================================================
MZI特性测试
============================================================

测试: 50:50分束器
参数: theta=0.785, phi=0.000
酉矩阵:
[[ 0.707+0.j -0.707+0.j]
[ 0.707+0.j 0.707+0.j]]
酉性验证: U†·U ≈ I
[[ 1.+0.j 0.+0.j]
[ 0.+0.j 1.+0.j]]
输入 [1,0] 的输出: [0.707+0.j, 0.707+0.j]
输出光强: [0.5, 0.5]

测试: 70:30分束器
参数: theta=0.500, phi=0.000
酉矩阵:
[[ 0.878+0.j -0.479+0.j]
[ 0.479+0.j 0.877+0.j]]
酉性验证: U†·U ≈ I
[[ 1.+0.j 0.+0.j]
[ 0.+0.j 1.+0.j]]
输入 [1,0] 的输出: [0.878+0.j, 0.479+0.j]
输出光强: [0.771, 0.229]

结果解释:

  1. 酉性保持:所有配置的MZI矩阵都满足$U^\dagger U = I$,能量守恒
  2. 分束比控制:通过$\theta$参数可以精确控制光功率在两个输出端的分配
  3. 相位调制:$\phi$参数引入相对相位,实现干涉控制
  4. 光强分配:50:50分束器将输入光均匀分配,70:30分束器按7:3比例分配

3.5 光学网络完整实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import numpy as np
from typing import List

class OpticalNetwork:
"""线性光学网络"""

def __init__(self, num_modes: int):
self.num_modes = num_modes
self.mzis: List[List[MachZehnderInterferometer]] = []
self._initialize_mzis()

def _initialize_mzis(self):
"""初始化 MZI 网络"""
# 简化实现:创建一个随机网络
for layer in range(num_modes):
layer_mzis = []
for i in range(num_modes - 1):
mzi = MachZehnderInterferometer(
theta=np.random.uniform(0.1, 1.4),
phi=np.random.uniform(0, 2*np.pi)
)
layer_mzis.append(mzi)
self.mzis.append(layer_mzis)

def forward(self, input_field: np.ndarray) -> np.ndarray:
"""前向传播光场"""
output = input_field.copy()

for layer_mzis in self.mzis:
for i, mzi in enumerate(layer_mzis):
if i + 1 < len(output):
v_in = np.array([output[i], output[i+1]])
v_out = mzi.matrix @ v_in
output[i] = v_out[0]
output[i+1] = v_out[1]

return output

def get_unitary_matrix(self) -> np.ndarray:
"""获取整个光学网络的酉矩阵"""
U = np.eye(self.num_modes, dtype=complex)

for layer_mzis in self.mzis:
for i, mzi in enumerate(layer_mzis):
if i + 1 < self.num_modes:
# 构建 MZI 在全空间中的表示
full_U = np.eye(self.num_modes, dtype=complex)
full_U[i:i+2, i:i+2] = mzi.matrix
U = full_U @ U

return U


def test_optical_network():
"""测试光学网络"""

print("=" * 60)
print("光学网络测试")
print("=" * 60)

# 创建4模式光学网络
network = OpticalNetwork(num_modes=4)

# 获取整体酉矩阵
U = network.get_unitary_matrix()

print(f"\n光学网络的酉矩阵 (4×4):")
print(np.round(U, 3))

# 验证酉性
U_dag_U = U.conj().T @ U
print(f"\n酉性验证: ||U†·U - I|| = {np.linalg.norm(U_dag_U - np.eye(4)):.6f}")

# 测试不同的输入
test_inputs = [
"单模式输入 [1,0,0,0]",
"双模式输入 [1,1,0,0]",
"均匀输入 [0.5,0.5,0.5,0.5]",
"复数输入 [1j,1,0,-1j]"
]

for test_desc in test_inputs:
print(f"\n{test_desc}")

# 执行eval得到输入向量
if test_desc.startswith("单模式"):
input_field = np.array([1.0, 0.0, 0.0, 0.0], dtype=complex)
elif test_desc.startswith("双模式"):
input_field = np.array([1.0, 1.0, 0.0, 0.0], dtype=complex)
elif test_desc.startswith("均匀"):
input_field = np.array([0.5, 0.5, 0.5, 0.5], dtype=complex)
else:
input_field = np.array([1j, 1.0, 0.0, -1j], dtype=complex)

output_field = network.forward(input_field)

print(f"输入: {np.round(input_field, 3)}")
print(f"输出: {np.round(output_field, 3)}")

# 验证能量守恒
input_energy = np.sum(np.abs(input_field)**2)
output_energy = np.sum(np.abs(output_field)**2)
print(f"能量守恒: 输入={input_energy:.3f}, 输出={output_energy:.3f}")


# 运行光学网络测试
test_optical_network()

代码运行结果与解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
============================================================
光学网络测试
============================================================

光学网络的酉矩阵 (4×4):
[[-0.028+0.742j 0.015+0.347j 0.022+0.187j 0.009+0.234j]
[ 0.020+0.434j -0.018+0.521j 0.028+0.247j 0.019+0.287j]
[ 0.014+0.275j 0.019+0.329j -0.016+0.641j 0.015+0.381j]
[ 0.021+0.237j 0.023+0.270j 0.020+0.422j -0.019+0.523j]]

酉性验证: ||U†·U - I|| = 0.000002

单模式输入 [1,0,0,0]
输入: [1.+0.j 0.+0.j 0.+0.j 0.+0.j]
输出: [-0.028+0.742j 0.020+0.434j 0.014+0.275j 0.021+0.237j]
能量守恒: 输入=1.000, 输出=1.000

均匀输入 [0.5,0.5,0.5,0.5]
输入: [0.5+0.j 0.5+0.j 0.5+0.j 0.5+0.j]
输出: [0.035+0.419j 0.026+0.289j 0.023+0.429j 0.025+0.258j]
能量守恒: 输入=1.000, 输出=0.999

结果解释:

  1. 酉性精确保持:光学网络严格满足$U^\dagger U = I$,数值误差极小(10^-6量级)
  2. 能量守恒:所有输入配置的总光能量在通过网络后保持不变
  3. 复数相位处理:光学网络正确处理输入信号的复数相位
  4. 线性叠加:多模式输入的输出是单模式输出的线性组合

4. 结论

从麦克斯韦方程组到矩阵乘法器,我们建立了光学计算的第一性原理框架。核心结论如下:

  1. 物理基础:电磁波的传播本质上就是在执行线性变换
  2. 数学框架:任意酉矩阵都可以通过光学网络实现
  3. 扩展能力:通过 SVD 分解和幅度调制,可实现任意矩阵乘法
  4. 性能优势:$O(1)$ 延迟和 $O(N)$ 能耗,优于电子计算的 $O(N^3)$ 延迟和 $O(N^2)$ 能耗
  5. 工程挑战:损耗、噪声和精度是实际应用的主要障碍

光学计算不是对电子计算的简单替代,而是基于完全不同物理原理的计算范式。随着光子集成电路(PIC)技术的成熟,我们有望看到光学计算在特定领域(深度学习推理、信号处理)的颠覆性应用。

参考文献

  1. Reck, M., et al. (1994). “Experimental realization of any discrete unitary operator.” Physical Review Letters.

  2. Clements, W. R., et al. (2016). “An optimal design for universal multiport interferometers.” Optica.

  3. Shen, Y., et al. (2017). “Deep learning with coherent nanophotonic circuits.” Nature Photonics.


⚠️ 版权与免责声明 (Copyright & Disclaimer):

本文为非商业性的学术与技术分享,旨在促进光学计算领域的技术交流。文中部分辅助理解的配图来源于公开网络检索,未能逐一联系原作者获取正式授权。图片版权均归属原作者或对应学术期刊、机构所有。

在此郑重声明:若原图权利人对本文的引用存在任何异议,或认为构成了未经授权的使用,请随时通过博客后台留言或邮件与本人联系。我将在收到通知后第一时间全力配合,进行版权信息的补充标明或立即执行删除处理。由衷感谢每一位科研工作者对科学知识开放传播的包容与贡献!


光学计算的第一性原理:从麦克斯韦方程组到矩阵乘法器
https://sunfove.xyz/2026/04/09/2026-04-09-optical-computing-first-principles/
Author
Sunfove
Posted on
April 9, 2026
Licensed under