模糊 PID 与单神经元自适应 PID:PID 参数由谁、在何时决定
PID 的花样:先看懂模糊 PID 和单神经元自适应 PID - Zw-awa
模糊 PID 把调参经验固化为论域量化、隶属度模糊化、规则表推理和去模糊四步链路,输出 ΔKp、ΔKi、ΔKd 增量,代价是精度可能低于精心手调的普通 PID。单神经元自适应 PID 则把增量式 PID 视为三输入神经元,Kp、Ki、Kd 作为权值按有监督 Hebb 规则在线更新,需额外设学习速率和比例系数 K 并给权值设上下限。对象固定可离线试参时,普通 PID 加前馈通常已够用。
PID 之外还有一堆名字:分段 PID、模糊 PID、自适应 PID、神经网络 PID、专家 PID。它们都在回答同一件事——Kp、Ki、Kd 这三个数,由谁、在什么时候决定。
下面只把两支最有代表性、也最容易自己动手写的讲透:一支把“调参经验”写进规则——模糊 PID;一支让参数自己长——单神经元自适应 PID。
模糊 PID:把老师傅的调参手感,写成一套规则
为什么需要它
普通 PID 的参数是人试出来的。试参像炼丹:Kp 大了摆,加 Kd;Kd 放大噪声,又回头加 Kp……试到一套能用的,换一辆车、换个工况,又得从头来。
模糊 PID 的思路是:调参时有经验的人不是瞎试,他嘴上有一套话——“误差大,猛一点;误差在变小,收一点;误差快归零,别再加力”。把这一套话固化成规则,让机器自己按规则改参数,人不就解放了?
它的完整链路
模糊 PID 常做成“模糊自整定”:输入是误差 e 和误差变化率 Δe,输出是三个参数增量 ΔKp、ΔKi、ΔKd,主控制器还是那个 PID。中间隔着四步:
① 论域与量化。 e、Δe 的真实范围各不相同,先各自映射到一个统一论域,比如 [−3, 3]。论域被分成几档,每档一个名字:负大 NB、负中 NM、负小 NS、零 ZO、正小 PS、正中 PM、正大 PB。
② 模糊化:算“属于哪档”的程度。 拿三角形隶属度函数举例:论域里某个值落在两档之间,就被拆成两个 0~1 的数,叫隶属度。e 映射后是 2.4,落在 PM 和 PB 之间,得到 0.6 属于 PM、0.4 属于 PB——隶属度可以理解成“它有多像这一档”。
③ 模糊推理:两两组合查规则表。 e 取它命中的档,Δe 取它命中的档,两两组合,去规则表里查该给什么。Kp、Ki、Kd 各有一张表,规则长这样(这里只摘 5 档示意,完整的常用 7×7):
Δe: NB NS ZO PS PB
e: NB PB PB PM PM PS
NS PB PM PM PS ZO
ZO PM PM PS ZO NS
PS PM PS ZO NS NM
PB PS ZO NS NM NM
每个命中的组合都把“e 的隶属度 × Δe 的隶属度”累加到对应输出档上。
④ 去模糊:把一堆“档和隶属度”变成一个数。 用各档的隶属度对档位值做加权求和(重心式的意思),再反映射回真实范围,得到这一拍的 ΔKp、ΔKi、ΔKd。累加进参数,PID 按增量式出输出:
kp += Δkp; ki += Δki; kd += Δkd;
output = kp*(e - e_pre) + ki*e + kd*(e - 2*e_pre + e_ppre)
它治什么病,代价是什么
它治的病是“手动试参没经验、工况又多变”。常见的小车直行验证里,两只电机转速不一致让车越走越偏;不调参时角度一路涨,接上模糊 PID 后,角度会收敛在一个小区间里来回飘。
代价也写在名字里:精度可能比精心调出来的普通 PID 低——它换来的是不用手调,不是更准。论域怎么分、规则怎么写,仍然靠经验;规则写少了等于没升级,写多了又难 debug。想入门,先把它的四步链路在代码里走一遍(量化 → 隶属度 → 两两查表 → 去模糊),比背概念有用得多。
单神经元自适应 PID:让参数自己长出来
为什么需要它
工厂里一台设备能跑几十年。零件会磨损、管道会腐蚀、换了备件……对象慢慢变了,出厂时调好的 PID 参数不再是当前的最佳。人不可能天天蹲在那里重调。
于是有人想:参数能不能自己在运行中调整? 这就是自适应 PID。
把增量式 PID 看成单个神经元
单神经元自适应 PID 最妙的一步,是重新看了一眼增量式 PID 的公式:
Δu = Kp*(e - e_pre) + Ki*e + Kd*(e - 2*e_pre + e_ppre)
它分明就是“三个输入 × 三个权值求和”:输入是 x1=e−e_pre、x2=e、x3=e−2e_pre+e_ppre,权值就是 Kp、Ki、Kd。这不就是一个神经元吗?树突收三个输入,权值乘完求和,轴突输出 Δu。
那“学习”发生在哪?权值不再由人钉死,而是按学习规则每一拍在线更新——让它在运行中自己逼近“当前对象该有的那组参数”。
神经元怎么学:有监督 Hebb 规则
神经元学习的通用套路是调权值:新权值 = 旧权值 + 学习速率 × 信号 × 输入。这里用的是有监督的 Hebb 学习规则——它是有监督 Δ 规则(拿输出和期望比、让误差变小)和无监督 Hebb 规则(同时活跃的联系被强化)的结合:既按误差修正,又能区分强化和弱化。
套到增量式 PID 上,三个权值各自独立更新:
w_p += ηp * e * u * x1 // x1 = e - e_pre
w_i += ηi * e * u * x2 // x2 = e
w_d += ηd * e * u * x3 // x3 = e - 2*e_pre + e_ppre
ηp、ηi、ηd 是三个方向各自的学习速率;e 是误差,u 是当前输出,xi 是各自的输入。计算输出前,权值先归一化(w'i = wi / Σ|w|),再乘一个比例系数 K:
u(t) = u(t-1) + K * (w'p*x1 + w'i*x2 + w'd*x3)
K 决定调整的快慢:越大跟得越快,太大系统会抖;对象时延变大时,K 必须调小才稳。
实际工程里还有个改进:人们发现权值的在线修正主要和 e、Δe 有关,于是把更新输入里的信号从 e 换成 e+Δe,收敛更利索。
它治什么病,代价是什么
它治的病是“对象会随时间漂、人没法反复重调”。代价也明确:多了三个学习速率和一个 K,调它们同样有门道;学习过程不保证收敛,参数可能越调越歪,要有上下限兜底。对小车上绝大多数“对象不变、能离线试出来”的场合,普通 PID 加前馈就够了——别为用而用。
其它花样,只给一句话分辨
- 分段 PID(增益调度):人离线把工作点切成几段,每段预排一套参数,段间插值过渡——最省事,先上它通常最划算;
- 专家 PID:把老手的“如果超调大就减 Ki、传感器掉线就进保护”这类判断写成规则库,由推理机选用——更像一套带整定的处置协议;
- 更广义的神经网络 PID:让网络当控制器,或让网络输出 Kp/Ki/Kd——单神经元自适应,正是这条线里最简单的一号。
怎么挑
对象固定、能离线试:普通 PID + 前馈。工作点会变、规则你能写清:分段,再往上才是模糊。对象随时间漂:单神经元自适应,记得给权值设界。到专家系统和大网络那层,问题往往已经不是“调 PID”了。
最后橘猫说
PID 的花样,争的都是“三个参数由谁、在什么时候决定”。模糊 PID 把人嘴里的调参经验,变成论域、隶属度、规则表、去模糊这条完整流水线,输出参数增量;单神经元自适应 PID 把增量式 PID 看成一个三输入神经元,让权值按有监督 Hebb 规则在线长出来。前者把经验交给规则,后者把参数交给学习——都省了手,也都要为省下的那双手付代价。
说实在的,前馈 + PID 已经可以解决绝大部分问题了,如果还是不行,你不应该考虑修改 PID,而是想想结构和算法以及极端环境下有没有 bug 才对。
最后蜘蛛说
如果一种理论声称历久弥新,就像忒修斯之船,那它还是它吗,可能不是原本的它了吧,但是一定是更新的它
来源:博客园 · cnblogs.com