变桨距超调压不住的时候,先别急着动 Kp、Ki、Kd,回到 RBF 雅可比项 dydu 重新查一遍。复现原文那套 2 MW 水平轴风力机模型时,卡住我的正是风阶跃扰动出来后的第一拍:固定 PID 超调 12%,RBF-PID 压到 2%,可本地一跑 β 直接冲到 4°。后来先在 TaoToken 官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content= 创建 Key,把 Codex 的 Base URL 指到统一通道,再让 Codex 对照原文逐行核对 dydu,才发现是学习率 eta 和 PID 学习率 xite 在阶跃瞬间互相放大,导致 Kp 更新量过冲。
原文用的是一套无 Simulink 的 MATLAB 程序:2 MW 机组参数 J=4.5e6、R=40、ρ=1.225,额定转速 omega_nom=2π·1800/60,桨距角 β 限幅 0° 到 30°。RBF 网络隐含层 6 个节点,学习率 eta=0.05,动量因子 alpha=0.1,PID 学习率 xite=0.05。这些数值单独看都不大,但风速从 8 m/s 阶跃到 10 m/s 的那一拍,偏差 e(k) 与一阶差分 e(k)-e1 会被同时拉大,dydu 若正好往正方向走,dKp=xite·e(k)·(e(k)-e1)·dydu 会在一两个采样周期里被放大近一个数量级。Codex 如果不盯着这一步,只会建议你调小 Kd,然后把问题带偏。
1. 先复现超调表现,再回到 dydu 找根因
1.1 超调压不住时的两种典型现象
按原文的结构跑通代码之后,如果超调压不住,现象通常分两种。第一种是 β 在阶跃后 0.3 秒内冲到 5°,随后被限幅压回 30° 以内,但回落速度很慢,稳态误差在 0.3° 附近持续抖动。这种情况多半是 RBF 的雅可比信号 dydu 在阶跃瞬间符号不稳定,导致 Kp 往错误方向更新,等 RBF 权值重新收敛,超调那一拍已经过去了。
第二种是 β 没有明显冲高,但转速 omega 的超调超过了额定值的 1.5%。这种问题往往出在 Kd 被 RBF 更新得过小,阻尼不足,桨距角变化跟不上风速阶跃。风力机变桨距控制里,β 的输出直接改变气动转矩,超调过大对齿轮箱和塔筒载荷都有冲击。原文把超调目标压在 2% 以下,同时要求稳态误差小于 0.1°,两个指标一起卡,RBF 网络就必须准确估计被控对象的增益方向。
1.2 原文 dydu 公式为什么值得逐项核对
RBF-PID 的核心不是三个增益的初值,而是雅可比项 dydu。原文的近似写法是 dydu = sum(w .* h .* (c(:,3) - x(3)) ./ b.^2),需要确认三件事。
第一,x(3) 是偏差的二阶差分 e(k)-2e1+e2,与超调最直接相关。第二,c(:,3) 是高斯中心矩阵的第三列,初始化时用 randn 生成,如果它离当前 x(3) 太远,h 向量会整体趋近于 0,dydu 和权值更新同时失效,RBF 网络相当于白训练。第三,eta 和 xite 同时作用在这条链路上,任何一方过大都会让 dKp 在阶跃瞬间过冲。
让 Codex 做的第一件事不是调参,而是在仿真循环里加诊断输出,把 dydu、dKp、dKi、beta 的变化过程打出来。
% 在 PID 增益更新之后、e2=e1 之前插入诊断 if mod(k, 50) == 0 fprintf('k=%d e=%.4f d1=%.4f d2=%.4f dydu=%.3f dKp=%.2e dKi=%.2e beta=%.3f\n', ... k, e(k), e(k)-e1, e(k)-2*e1+e2, dydu, dKp, dKi, beta(k)); end这里 d1、d2 分别是当前拍的一阶差分和二阶差分。插桩位置必须在 e2=e1 之前,否则打出来的是下一拍的差分值。让 Codex 拿着这段输出核对 dydu 的符号和量级,比直接改 Kp 靠谱得多。
2. 配置 Codex:先在 TaoToken 创建 Key,再改 ~/.codex/config.toml
2.1 创建 API Key
排障前先把通道打通。打开 TaoToken 注册账号,进入控制台创建 API Key。TaoToken 是统一 API 通道,网页落地页和接口地址要分开记:注册、创建 Key、看模型广场、看用量都在官网;填进 Codex 的 Base URL 是 https://taotoken.net/api,末尾不要加 /v1。
创建完 Key 后,把它保存到环境变量里,方便 Codex 读取:
export TAOTOKEN_API_KEY=YOUR_API_KEYYOUR_API_KEY 只是占位符,实际值从控制台复制。不要把 Key 写进 config.toml 明文,Codex 的 env_key 机制会自动读取环境变量。
2.2 修改 Codex 配置文件
Codex CLI 的配置在 ~/.codex/config.toml,不要用 Claude Code 那套 ANTHROPIC_BASE_URL 环境变量。Codex 用的是 model_provider 块:
model = "MODEL_ID_FROM_TAOTOKEN" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_format = "responses"model 字段具体填什么,以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content= 模型广场当时列表为准,别凭记忆写。wire_format 按 Codex 版本和你选的模型类型填,Anthropic 系模型通常用 "chat",OpenAI 兼容系模型用 "responses",以 Codex 运行时的提示为准。
2.3 验证 Codex 是否真的走通
配置保存后,在项目根目录启动 Codex,让它先做一件简单的事:
请打印当前 model_provider 和 base_url,然后读取项目里的 wind_turbine_rbf_pid.m,确认这个文件存在。
如果 Codex 能列出文件内容,说明通道已经通了。如果报 401 或 404,直接跳到第 5 章排障对照。注意让 Codex 在项目根目录运行,不要在 ~/.codex 目录下跑,否则它可能读不到你的仿真代码。
3. 让 Codex 对照 2 MW 模型逐行核对 RBF 雅可比项
3.1 先核对模型参数和风阶跃条件
原文的 2 MW 模型参数是 J=4.5e6、R=40、ρ=1.225、omega_nom=2π·1800/60。Cp 用的是近似式 0.44·(1/beta(k-1)-0.022·beta(k-1)),k1=0.5·ρ·π·R^5·0.44/omega_nom^2,这是折算到低速轴上的等效增益,不是真实的空气动力学功率系数。
仿真条件里风速在 k=1500 时从 8 m/s 阶跃到 10 m/s,采样周期 ts=0.01,总仿真步数 T=5000。也就是说风力机在 15 秒处经历 2 m/s 的阶跃风,之后还需要加 0.5·randn 的湍流分量。Codex 核对模型时最容易犯的错,是把 P_nom=2e6 代入功率方程去反推转速,但原文主循环并没有直接用 P_nom,而是通过 Pw=0.5·ρ·R^2·v^3·Cp 计算风轮捕获功率,再除以 J 得到转速变化。
让 Codex 确认这一整条链路:v 阶跃 → Pw 变化 → omega 变化 → 偏差 e 变大 → RBF 输出 dydu → PID 增益更新。任何一环断裂,超调都会失控。
3.2 检查 RBF 输入与雅可比是否同步
原文的 RBF 输入是 x=[e(k); e(k)-e1; e(k)-2e1+e2],第三维是二阶差分。dydu 计算时用的是 c(:,3)-x(3),对应第三维的高斯中心与输入偏差。这个顺序不能乱:如果读者在改代码时把 x 的构造顺序调换,比如把 e(k)-2e1+e2 放在第二位,dydu 的含义就完全变了,但程序不会报错,只是超调悄悄变大。
另一个容易踩的坑是权值更新顺序。原文 w = w + eta·(y_hat - omega(k))·h 和 dydu 共用同一组 h。如果你在代码里先更新 w,再重新计算 h 去算 dydu,雅可比和权值就不同步了。让 Codex 重点检查这两行之间有没有插入其他计算。
3.3 生成独立的诊断脚本,不在原文件上乱改
建议让 Codex 生成一个新的 run_diagnostic.m,保留原文全部模型参数和 RBF 更新逻辑,只在循环内追加诊断输出。这样不会破坏原有仿真,还能随时对比。
% run_diagnostic.m 追加段 % 沿用原文 2 MW 模型参数与 RBF 更新,仅增加诊断 for k = 2:T % ... 原文风力机模型与 RBF-PID 更新代码不变 ... if mod(k, 100) == 0 fprintf('%4d | e % .4f | dydu % .3f | dKp % .2e | dKi % .2e | beta % .3f\n', ... k, e(k), dydu, dKp, dKi, beta(k)); end end把 run_diagnostic.m 在本地 MATLAB 跑完,把输出贴回 Codex。Codex 会根据 dKp 和 dKi 的变化节奏判断到底是学习率过冲,还是 RBF 中心初始化不合理,再给出针对性的调整方案。
4. 性能对比:固定 PID 12% 与 RBF-PID 2% 之间差了哪些参数
4.1 把修复前后的数据摆在一起
原文给出了固定 PID 和 RBF-PID 的对照:固定 PID 超调 12%,稳态误差 0.4°,恢复时间 3.5 秒;RBF-PID 超调 2%,稳态误差 0.1°,恢复时间 1.2 秒。修复前本地复现的结果是超调 4% 上下、稳态误差 0.3° 附近抖动,比固定 PID 好一点,但离原文的 2% 还很远。
这个差距不在算法框架,而在 dydu 的即时准确性。固定 PID 的 Kp、Ki、Kd 是常量,超调高但规律稳定;RBF-PID 的优势是能在阶跃瞬间快速调整增益,但如果雅可比估计滞后,增益调整反而会放大超调。
4.2 让 Codex 按优先级给调参建议
给 Codex 的提示应当按实验现象分层:
- 如果超调只高一点,比如 2.2% 到 2.8%,优先把 xite 从 0.05 降到 0.02,让 PID 增益每次更新的步长变小。
- 如果超调伴随转速振荡,降学习率 eta 到 0.02,同时把动量因子 alpha 从 0.1 提到 0.15,权值更新会更平滑。
- 如果稳态误差长期停在 0.3° 下不来,检查 Ki 是否被 RBF 更新成负值。可以为 Ki 设置下限 0.005,防止它被雅可比信号带偏。
- 如果减小超调导致响应变慢,把隐含层节点从 6 加到 8,或者用 k-means 对高斯中心 c 做初始化,让 h 向量在阶跃瞬间不至于全部衰减到 0。
让 Codex 针对你贴回去的诊断输出,指出具体的参数修改位置,而不是给一段通用的 PID 调参口诀。
5. Codex 接 TaoToken 的排障对照:401、模型 ID、/v1 后缀
5.1 最常见的三个报错
配置 Codex 接 TaoToken 时,实际会碰到的报错通常只有几类。Codex 提示 401 Unauthorized,说明 TAOTOKEN_API_KEY 环境变量没有生效,或者 Key 复制得不完整。重新用 echo $TAOTOKEN_API_KEY 检查一下,再确认 Key 是从控制台复制的。
模型 ID 不匹配时报 404 model_not_found,说明 config.toml 里的 model 字段填了一个不存在的名字。回到模型广场复制准确的模型 ID,不要凭记忆写。base_url 填错时报 connection error,原因是把官网地址或者带 /v1 的地址填进了配置。Base URL 只允许填 https://taotoken.net/api。
| 现象 | 原因 | 处理 |
|---|---|---|
| 401 Unauthorized | env_key 没 export 或值不对 | 重新 export TAOTOKEN_API_KEY=YOUR_API_KEY |
| 404 model_not_found | model 字段不是模型广场上的 ID | 回官网模型广场复制准确 ID |
| connection refused | base_url 填错或加了 /v1 | 改为 https://taotoken.net/api |
| 能对话但读不到 .m 文件 | 启动目录不在项目根目录 | 在项目根目录运行 codex |
5.2 MATLAB 变量名的 Unicode 坑
原文为了可读性用了 omega_ref、beta 这样的希腊字母变量名,但直接复制到 MATLAB 编辑器时,部分版本会报「Invalid text character」或「Unsupported variable name」。这不是算法问题,而是标识符编码问题。
处理方式很简单:让 Codex 把原文里的 omega_ref、omega、beta、rho 全部转成 ASCII 标识符,再用转写后的代码跑诊断。Codex 做这种批量替换几乎不会出错,但你要在提示里明确告诉它保持算法结构不变,只改变量名。
6. 验证这次调用,并回控制台对账
6.1 先用模型对话确认 Key 有效
Codex 跑通之后,先别急着连续问问题。打开 TaoToken 模型对话,用同一把 Key 发一条测试消息,确认模型 ID 和 Base URL 都没填错。模型对话页面能正常返回,说明 Key 本身没问题,再去排查 Codex 的配置。
6.2 回控制台看这次排障产生的调用量
Codex 排障时往返了多少次请求,都会计入 TaoToken 的用量。回到 控制台 API Keys 页面,可以看这把 Key 在刚才那段时间的调用记录。如果后续要长期用 Codex 做 MATLAB 仿真排障,可以打开 Coding Plan 看套餐是否更划算。
把超调从 4° 压回 2%,真正起作用的不是多写几行提示词,而是让 Codex 回到原文 dydu 那一行,把学习率、动量因子和 RBF 中心之间的关系理顺。TaoToken 在这一步扮演的角色只是把接入通道稳定下来,让 Codex 能持续读取那套 2 MW 模型并给出有效诊断;调参的火候,还是得靠仿真输出里的 dKp、dKi 数据说话。