基于强化学习的超导腔频率控制
这段代码实现了一个使用强化学习(Reinforcement Learning, RL)控制超导腔体的仿真环境,并利用 stable_baselines3
中的 PPO 算法进行训练。下面将逐步分析代码的结构和功能。
整体概述
代码的主要目的是:
- 定义一个超导腔体的仿真环境
SuperconductingCavityEnv
,基于gymnasium
框架,用于模拟腔体的动态行为。 - 实现一个单步仿真函数
sim_cav
,用于计算腔体在给定输入下的状态更新。 - 使用 PPO 算法训练一个代理(agent),通过调整 Piezo 补偿来控制腔体的失谐量(detuning),以优化系统性能。
- 提供实时可视化功能,监控训练过程中的关键变量。
代码依赖以下库:
- **
numpy
**:数值计算。 - **
gymnasium
**:强化学习环境接口。 - **
stable_baselines3
**:提供 PPO 算法实现。 - **
matplotlib.pyplot
**:数据可视化。 - **
llrflibs.rf_sim
和llrflibs.rf_control
**:自定义射频仿真和控制库。
代码逐部分解析
导入库
1 | import numpy as np |
这些库为代码提供了数值计算、强化学习环境、PPO 算法和可视化的支持。llrflibs
可能是自定义模块,包含超导腔体仿真相关的函数(如 sim_scav_step
、cav_ss_mech
等)。
单步仿真函数 sim_cav
1 | def sim_cav(half_bw, RL, dw_step0, detuning0, vf_step, state_vc, Ts, beta=1e4, |
功能
- 模拟超导腔体在一个时间步内的动态变化。
- 输入参数包括半带宽
half_bw
、负载电阻RL
、初始失谐dw_step0
、激励电压vf_step
、当前腔体电压state_vc
等。 - 根据是否为脉冲模式(
pulsed
),选择束流电压vb
:- 脉冲模式:从
beam_pul
中提取值。 - 连续模式:使用常数
beam_cw
。
- 脉冲模式:从
- 调用
sim_scav_step
(自定义函数)执行一步仿真,更新腔体电压vc
、反射电压vr
、失谐量dw
和机械状态state_m
。 - 返回更新后的状态。
关键点
sim_scav_step
是核心仿真函数,可能是llrflibs.rf_sim
中的实现。- 函数支持机械模式的模拟(
mech_exe=True
)。
环境类 SuperconductingCavityEnv
这是一个继承自 gym.Env
的强化学习环境类,用于模拟超导腔体的行为。
初始化 __init__
1 | class SuperconductingCavityEnv(gym.Env): |
- 时间参数:时间步长
Ts = 1e-6
(1微秒),每个 episode 有pulse_cycles
个脉冲周期。 - 初始化顺序:依次初始化机械模式、腔体参数和仿真参数。
- 动作空间:
[-100 Hz, 100 Hz]
,表示 Piezo 调整的失谐量(弧度/秒)。 - 观测空间:三维向量
[vc_amp, vc_phase, dw]
,分别表示腔体电压幅值(0到20MV)、相位(-π到π)和失谐量(-500 Hz到500 Hz)。 - 历史记录:存储电压幅值、相位、失谐量和动作的数据。
初始化机械模式 _init_mechanical_modes
1 | def _init_mechanical_modes(self): |
- 定义机械振动的频率
f
(Hz)、品质因数Q
和耦合系数K
。 - 使用
cav_ss_mech
创建连续状态空间模型(Am, Bm, Cm, Dm)
。 - 使用
ss_discrete
将其离散化为(Ad, Bd, Cd, Dd)
,以适应离散时间步长Ts
。
初始化腔体参数 _init_cavity_parameters
1 | def _init_cavity_parameters(self): |
- 设置超导腔体的物理参数,包括共振频率、耦合因子等。
- 计算负载电阻
RL
和半带宽wh
。
初始化仿真参数 _init_simulation_parameters
1 | def _init_simulation_parameters(self): |
- 定义脉冲形状:
base_pul
表示激励脉冲,beam_pul
表示束流脉冲。 - 设置 RF 源参数和初始仿真状态。
重置环境 reset
1 | def reset(self, seed=None, options=None): |
- 将仿真状态重置为初始值,清空历史数据,返回初始观测。
单步执行 step
1 | def step(self, action): |
- 应用 Piezo 调整
dw_piezo
。 - 执行一个完整脉冲周期(
buf_size
个时间步),计算每个时间步的奖励(负失谐量绝对值)。 - 返回平均奖励、是否终止等信息。
单步仿真 _simulation_step
1 | def _simulation_step(self, dw_piezo): |
- 生成随机微扰
dw_micr
。 - 模拟 RF 信号链(源、IQ 调制、放大)。
- 调用
sim_cav
更新腔体状态。
获取观测 _get_obs
1 | def _get_obs(self): |
- 返回腔体电压幅值、相位和失谐量(Hz)。
数据记录 _record_data
1 | def _record_data(self): |
- 记录电压幅值(MV)、相位(度)、失谐量(Hz)和动作(Hz)。
可视化 render
1 | def render(self, mode='human'): |
- 实时绘制四个子图,显示最近 1000 个数据点。
训练配置
1 | if __name__ == "__main__": |
- 创建环境实例。
- 配置 PPO 模型:使用 MLP 策略,学习率 3e-4,每 2048 步更新,批次大小 64。
- 训练 100 万步,保存模型为
sc_cavity_control
。
总结
这段代码实现了一个超导腔体的强化学习控制系统:
- 环境:
SuperconductingCavityEnv
模拟腔体动态,包括机械振动、RF 信号链和束流影响。 - 目标:通过 Piezo 调整失谐量,最小化腔体的失谐(奖励为负失谐量绝对值)。
- 训练:使用 PPO 算法优化控制策略。
- 可视化:实时监控电压、相位、失谐量和动作。