本文介绍如何用简洁、可扩展的循环结构替代手动链式调用,实现对时间参数 t(0 到 π,步长 0.05)的自动迭代,并确保每次调用都以前一次的输出作为输入。
在数值模拟或量子演化计算中,常需按时间步进反复调用一个状态更新函数(如 get_wf),且当前步的结果严格依赖上一步的输出(即 wf_{n+1} = f(t_{n+1}, wf_n))。手动写出 wf_1, wf_2, ..., wf_n 不仅冗余、易错,更难以维护和扩展。
推荐采用状态累积式 for 循环,将初始状态与迭代逻辑解耦,代码清晰且健壮:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import math
# 初始化:t = 0 时的初始波函数
wf = get_wf_0(xmin, xmax, Nx, neigs, t=0)
# 迭代:t 从 0.05 开始,以 0.05 为步长递增至 π(不含 π)
# 注意:使用 int(math.pi / 0.05) 更准确;// 是整除,但需确保不遗漏末尾点
num_steps = int(math.ceil(math.pi / 0.05)) # 向上取整,覆盖 t=π(若需包含)
for s in range(1, num_steps + 1):
t_val = 0.05 * s
if t_val > math.pi:
break
wf = get_wf(xmin, xmax, Nx, neigs, t=t_val, wf=wf)
|
? 关键设计要点:
- 使用单一变量 wf 持续更新状态,避免创建大量中间变量(如 wf_1, wf_2);
- range(1, num_steps + 1) 确保覆盖全部步数(s=1 → t=0.05, s=2 → t=0.10, …);
- math.ceil(math.pi / 0.05) 精确计算所需步数(π ≈ 3.14159, 3.14159 / 0.05 ≈ 62.83 → 63 步),避免因浮点误差导致少算一步;
- 显式 if t_val > math.pi: break 提供安全兜底,增强鲁棒性。
?? 注意事项:
- 若 get_wf 中 t 需严格 ≤ π(如边界条件敏感),建议在循环内添加 t_val = min(t_val, math.pi);
- 若需保存所有中间结果(如用于绘图或回溯),可初始化列表 wf_history = [wf] 并在循环中追加 wf_history.append(wf.copy())(注意深拷贝以防引用覆盖);
- 步长 0.05 为浮点数,应避免用 t += 0.05 累加(易引入浮点误差),推荐用整数索引 s 计算 t_val,保证精度。
该模式适用于任意“状态转移型”迭代场景——无论是薛定谔方程的时间演化、递归滤波器更新,还是序列化机器学习推理,核心思想始终是:用循环封装依赖链,用索引控制精度,用单一状态变量保障一致性。
|