附录 C:离散-连续误差控制算法代码示例
(Discrete-Continuous Error Control Algorithm Code Examples)
本书第五章建立了“离散-连续误差控制(DCEC)“体系,并证明了利用 PSWF/DPSS 窗函数可以将离散采样与连续场论之间的误差控制在指数级精度内。为了使这一理论具有可操作性,本附录提供了核心算法的 Python 参考实现。
这些代码示例涵盖了:
-
KRD 门限计算:确定给定误差容限下的最小采样数。
-
Hankel-HS 交叉项上界:计算乘法算子带来的混叠误差。
-
DPSS 序列生成:生成最优离散窗函数。
-
统一时间刻度重构:从散射数据计算 。
C.1 KRD 门限计算器
该算法基于第五章定理 5.2.3 及相关文献中的非渐近上界,计算在给定泄漏误差 下所需的最小香农数 (或采样点数)。这用于确定实验设计中的最小资源预算。
import numpy as np
from math import pi, log, exp, ceil
def calculate_krd_threshold(epsilon):
"""
计算达到给定泄漏误差 epsilon 所需的最小香农数 N0_star。
基于公式: 1 - lambda_0 <= 10 * exp( - (N0 - 7)^2 / (pi^2 * log(50 * N0 + 25)) )
参数:
epsilon (float): 目标误差容限 (例如 1e-6)
返回:
tuple: (N0_star, c_star, NW_star)
N0_star: 最小香农数 (2*T*Omega 或 2*N*W)
c_star: 对应的时间-带宽积 (pi * N0 / 2)
NW_star: 对应的离散积 (N0 / 2)
"""
n = 1
while True:
# KRD 界 (Karras-Reddy-Davenport bound 变体)
# 注意:对于极小的 n,公式可能不适用,但在搜索循环中会自动跳过
if n > 7:
numerator = (n - 7)**2
denominator = pi**2 * log(50 * n + 25)
upper_bound = 10 * exp(-numerator / denominator)
if upper_bound <= epsilon:
return n, (pi * n / 2), (n / 2.0)
n += 1
# 示例用法
tols = [1e-3, 1e-6, 1e-9]
print(f"{'Epsilon':<10} | {'N0*':<5} | {'c*':<10} | {'NW*':<10}")
print("-" * 45)
for tol in tols:
n0, c, nw = calculate_krd_threshold(tol)
print(f"{tol:<10} | {n0:<5} | {c:<10.4f} | {nw:<10.4f}")
# 预期输出 (近似):
# 1e-3 | 33 | 51.8363 | 16.5000
# 1e-6 | 42 | 65.9734 | 21.0000
# 1e-9 | 50 | 78.5398 | 25.0000
C.2 乘法交叉项(Hankel-HS 范数)估算
当我们在带限信号上乘以一个非带限函数 (例如局域势场或窗口调制)时,会引入频谱混叠。本算法计算该误差的 Hilbert-Schmidt 上界。
def compute_hankel_hs_error(x_signal, W, domain_length=1.0):
"""
计算乘法算子 (I - B_W) M_x B_W 的 Hilbert-Schmidt 范数。
这量化了将信号 x 作用于带限空间时产生的带外能量泄漏。
参数:
x_signal (array): 函数 x(t) 在均匀格点上的采样值
W (float): 归一化带宽 (0 < W < 0.5)
domain_length (float): 采样域的物理长度
返回:
float: Hankel-HS 范数 Xi_W(x)
"""
N = len(x_signal)
# 计算 x 的离散傅里叶变换
x_hat = np.fft.fft(x_signal) / N # 归一化系数取决于具体定义
# 频率格点 (假设采样率为 N/domain_length)
freqs = np.fft.fftfreq(N, d=domain_length/N)
# 构造权重函数 sigma_W(delta) = min(2W, |delta|)
# 注意:对于周期性边界条件,delta 应取 wrap-around 距离
sigma_W = np.minimum(2 * W, np.abs(freqs))
# 积分 (求和) 计算范数平方
# Integral |x_hat(delta)|^2 * sigma_W(delta)
integral = np.sum(np.abs(x_hat)**2 * sigma_W)
return np.sqrt(integral * domain_length) # 量纲修正
# 示例:计算一个高斯波包对带限子空间的"污染"
N = 1024
t = np.linspace(0, 1, N)
x_gauss = np.exp(-(t - 0.5)**2 / (2 * 0.05**2)) # 窄高斯,频带较宽
W_limit = 0.1 # 目标带宽
error_norm = compute_hankel_hs_error(x_gauss, W_limit)
print(f"Hankel-HS Error Norm: {error_norm:.6f}")
C.3 DPSS 序列生成器(基于 SciPy)
生成离散长球波序列(DPSS),用于构建最优观测窗口。这是实现第五章“有限阶窗化纪律“的基础。
from scipy.linalg import eigh_tridiagonal
import scipy.signal.windows as windows
def generate_dpss_vectors(N, NW, K_max=None):
"""
生成前 K_max 个 DPSS 序列 (Slepian 序列)。
参数:
N (int): 序列长度 (复杂性步数)
NW (float): 时间带宽积 (标准半带宽积,通常如 4.0)
K_max (int): 需要生成的序列数。默认取 2*NW (香农数)。
返回:
ndarray: (K_max, N) 矩阵,每一行是一个 DPSS 向量
ndarray: 对应的特征值 (能量集中度 lambda)
"""
if K_max is None:
K_max = int(2 * NW)
# SciPy 的 dpss 实现使用了三对角矩阵求解,数值稳定性高
dpss_seqs, ratios = windows.dpss(N, NW, K_max, return_ratios=True)
return dpss_seqs, ratios
# 示例:生成 N=100, NW=4 的前 5 个基向量
N = 100
NW = 4.0
seqs, lambdas = generate_dpss_vectors(N, NW, K_max=5)
print(f"Generated {len(seqs)} DPSS vectors.")
print(f"Energy concentration ratios (eigenvalues): {lambdas}")
# lambda 应极接近 1.0,直到接近香农极限
C.4 统一时间刻度重构算法
该算法从实验测量的散射矩阵 数据中提取统一时间刻度密度 ,实现了 26.1 节所述的微波腔实验验证流程。
def reconstruct_unified_time_scale(energies, s_matrix_data):
"""
从散射数据重构统一时间刻度密度 kappa(E)。
参数:
energies (array): 能量/频率扫描点 E_i
s_matrix_data (ndarray): 形状为 (N_E, N_ch, N_ch) 的复数散射矩阵数据
返回:
array: 统一时间刻度密度 kappa(E)
"""
import numpy as np
# 1. 计算行列式 det S(E)
# s_matrix_data[i] 是 E_i 处的矩阵
dets = np.linalg.det(s_matrix_data)
# 2. 提取总相位 Phi(E) = Im(ln(det S))
# 使用 unwrap 处理相位卷绕 (branch cut)
phases = np.unwrap(np.angle(dets))
# 3. 数值微分计算 kappa(E) = (1/pi) * dPhi/dE
# 使用中心差分法
dPhi_dE = np.gradient(phases, energies)
kappa = (1.0 / np.pi) * dPhi_dE
return kappa
def wigner_smith_trace(energies, s_matrix_data):
"""
直接通过 Wigner-Smith 算符 Q = -i S^dag dS/dE 计算,以作验证。
"""
n_points = len(energies)
n_ch = s_matrix_data.shape[1]
q_traces = np.zeros(n_points)
# 计算 dS/dE
ds_de = np.gradient(s_matrix_data, energies, axis=0)
for i in range(n_points):
s = s_matrix_data[i]
ds = ds_de[i]
s_dag = s.conj().T
# Q = -i * S^dag * dS/dE
q_matrix = -1j * np.dot(s_dag, ds)
# Trace
q_traces[i] = np.real(np.trace(q_matrix))
# 根据恒等式,应有 kappa = (1/2pi) * Tr(Q)
return q_traces / (2 * np.pi)
# 模拟数据验证一致性
E = np.linspace(0, 10, 500)
# 构造一个简单的共振散射 S = (E - E0 - iG/2)/(E - E0 + iG/2)
E0, Gamma = 5.0, 0.5
S_scalar = (E - E0 - 1j*Gamma/2) / (E - E0 + 1j*Gamma/2)
S_data = S_scalar.reshape(-1, 1, 1) # 单通道
kappa_phase = reconstruct_unified_time_scale(E, S_data)
kappa_trace = wigner_smith_trace(E, S_data)
# 检查误差
error = np.max(np.abs(kappa_phase - kappa_trace))
print(f"Max discrepancy between Phase-derivative and Trace-formula: {error:.4e}")
# 预期输出应接近机器精度 (e.g., < 1e-10)
这些代码片段为验证和应用本书的理论提供了基础工具。它们展示了如何将抽象的算子理论转化为具体的数值计算,从而连接了理论物理与实验数据分析。