为课题研究所整理的笔记。
本文将介绍RBF神经网络PID控制器原理及其改进、仿真具体步骤。
RBF神经网络原理
径向基函数(Radial basis function,RBF)神经网络是一种三层前馈网络,由输入层、隐含层和输出层组成。其核心思想是通过非线性映射将输入空间转换到高维空间,然后在高维空间中实现线性可分或函数逼近。
输入层:接受输入向量\(\text{x} \in
\mathbb{R}^n\)。本文PID控制器的输入量为误差\(e\)与误差变化率\(\dot e\)。
隐含层:使用径向基函数(如高斯函数)作为激活函数,将输入量映射到高维空间。
输出层:对隐含层输出进行线性加权组合,生成最终输出。本文PID控制器的输出量为比例、积分、微分系数增量\(\Delta K_p,\Delta K_i,\Delta K_d\)。
激活函数:实现输入层到隐含层的计算。
第\(j\)个隐含层节点输出为 \[h_j=e^{(-\frac{\parallel \text{x}-\text{c}_j
\parallel^2}{2b_j^2})}=e^{(-\frac{\sum_{i=1}^n(x_i-c_{ij})^2}{2b_j^2})}\]
式中\(c_j\)为第\(j\)个隐含节点的中心向量,\(b_j\)为第\(j\)个隐含节点的宽度参数,控制高斯函数的平滑度。
“两个竖线”为欧几里得范数,表示输入与中心的距离。
径向基函数:一个取值仅仅依赖于离原点距离的实值函数,满足\(\phi(x)=\phi(\parallel x
\parallel)\)的函数可被称作径向基函数。
高斯函数:形式为\(\phi(r)=e^{-(\varepsilon
r)^2}\),其中定义\(r=(\parallel x-x_i
\parallel)\)。显然其中的\(x_i\)是中心向量。
高斯函数的另一种形式为\(f(x)=ae^{-(x-b)^2/2c^2}\)。
欧几里得范数:对于向量\(x=(x_1,x_2,\cdots,x_n)\),其欧几里得范数\(\parallel x
\parallel=\sqrt{x_1^2+x_2^2+\cdots+x_n^2}\)
显然,如果是\(x\)是二维向量,则其欧几里得范数的几何含义就是该向量在二维空间中的长度,三维向量同理,也可以说\(\parallel x \parallel\)是向量的模长。
隐含层到输出层的运算:\(\Delta \text{k}=\text{h}\text{W}\)
式中\(\text{h}=[h_1,h_2,\cdots,h_H]\),为隐含层输出向量。\(H\)为隐含层节点数,文中为5。
\(\text{W} \in \mathbb{R}^{H \times
m}\)为输出层权重矩阵,\(m\)为输出维度,本文输出量为\(\Delta K_p,\Delta K_i,\Delta
K_d\),输出维度数为3。
权重更新:下面介绍数学推导过程。
首先定义一个目标函数,作为系统优化的目标与权重更新的依据。
目标函数:\(E=\frac{1}{2}e(k)^2=\frac{1}{2}[r(k)-y(k)]^2\)
求目标函数对于权重的梯度:\(\frac{\partial
E}{\partial W_{jk}}=e(k)\frac{\partial e(k)}{\partial u}\frac{\partial
u}{\partial \Delta K_k}\frac{\partial \Delta K_k}{\partial
W_{jk}}\)
式中\(\frac{\partial e(k)}{\partial u}\approx
J\)为系统雅可比矩阵,通过数值差分估计,在代码中\(J=\frac{y(k) - y(k-1)}{u(k-1) -
u(k-2)}\)
\(\frac{\partial u}{\partial \Delta
K_k}\)为PID控制器输出\(u(k)\)对RBF神经网络的输出量(这里为PID控制器三个参数的变化量)的偏导数。
其中\(\frac{\partial u}{\partial \Delta
K_p}=e(k)\)、\(\frac{\partial
u}{\partial \Delta K_i}=\sum e(k) \cdot T_s\)、\(\frac{\partial u}{\partial \Delta K_d}=\dot
e(k)\)
这对应PID控制器输出公式\(u(k)=K_p * e(k) + K_i
* \sum e(k) \cdot T_s + K_d * \dot e(k)\)
最后\(\frac{\partial \Delta K_k}{\partial
W_{jk}}=h_j\)
根据目标函数对于权重的梯度,得到权重更新公式:\(\Delta W_{jk}=\eta_\omega \frac{\partial
E}{\partial W_{jk}}\)
式中\(\eta_\omega\)为权重学习率,系数越大权重更新速度越快。
具体到权重矩阵各个维度(PID的三个参数)的权重更新公式如下:
\(\Delta W_{j1}=\eta_\omega \cdot e(k) \cdot J
\cdot h_j \cdot \eta_p\)
\(\Delta W_{j2}=\eta_\omega \cdot \sum e(k)
\cdot T_s \cdot J \cdot h_j \cdot \eta_i\)
\(\Delta W_{j3}=\eta_\omega \cdot \dot e(k)
\cdot J \cdot h_j \cdot \eta_d\)
式中\(\eta_p,\eta_i,\eta_d\)为PID参数的学习率。
RBF神经网络PID控制器Matlab代码
使用DeepSeek生成如下所示的Matlab代码: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143% RBF神经网络优化PID控制器参数
clc;
clear;
close all;
% 仿真参数
Ts = 0.01; % 采样时间
T = 10; % 总仿真时间
N = T / Ts; % 总步数
% 被控对象(二阶离散系统)
a1 = 1.5; a2 = -0.7; b1 = 0.2; b2 = 0.1;
% PID初始参数
Kp = 0.2; % 原值为0.1
Ki = 30; % 原值为0.01
Kd = 1; % 原值为0.05
% RBF网络参数
H = 5; % 隐含层节点数
input_size = 2; % 输入维度(e, ec)
output_size = 3; % 输出维度(ΔKp, ΔKi, ΔKd)
% 初始化RBF参数(中心、宽度、权重)
c = rand(input_size, H) * 2 - 1; % 中心在[-1,1]随机分布
b = ones(1, H) * 1.5; % 宽度初始化为1.5
W = rand(H, output_size) * 0.1 - 0.05; % 权重初始化为小随机值
% 学习率
eta_w = 0.01; % 权重学习率
eta_p = 0.01; % Kp学习率
eta_i = 0.001; % Ki学习率
eta_d = 0.01; % Kd学习率
% 初始化系统变量
y = zeros(1, N+2); % 输出(索引1对应t=0)
u = zeros(1, N+2); % 控制量
e = zeros(1, N+2); % 误差
ec = zeros(1, N+2); % 误差变化率
sum_e = 0; % 误差积分
% 参考信号(阶跃信号)
r = zeros(1, N+2);
step_time = 0.5; % 阶跃时间0.5秒
step_index = round(step_time / Ts) + 1; % 转换为索引
r(step_index:end) = 1; % 阶跃信号
% 记录变量
Kp_list = zeros(1, N);
Ki_list = zeros(1, N);
Kd_list = zeros(1, N);
error_list = zeros(1, N);
u_list = zeros(1, N);
% 主循环
for k = 2:N+1
% 计算误差和误差变化率
e(k) = r(k) - y(k);
ec(k) = e(k) - e(k-1);
sum_e = sum_e + e(k) * Ts;
% RBF输入
x = [e(k); ec(k)];
% 计算隐含层输出
h = zeros(1, H);
for j = 1:H
h(j) = exp(-sum((x - c(:,j)).^2) / (2 * b(j)^2));
end
% RBF输出(PID参数调整量)
delta_K = h * W;
% 更新PID参数
Kp = max(Kp + eta_p * delta_K(1), 0);
Ki = max(Ki + eta_i * delta_K(2), 0);
Kd = max(Kd + eta_d * delta_K(3), 0);
% 计算控制量(PID输出)
u_current = Kp * e(k) + Ki * sum_e + Kd * ec(k);
u_current = max(min(u_current, 10), -10); % 限幅
% 应用控制量到系统
u(k) = u_current;
y(k+1) = a1 * y(k) + a2 * y(k-1) + b1 * u(k) + b2 * u(k-1);
% 估计Jacobian (dy/du)
if k > 2 && (u(k-1) - u(k-2)) ~= 0
J = (y(k) - y(k-1)) / (u(k-1) - u(k-2));
else
J = 0.1; % 初始估计
end
% 更新RBF权重
if k > 2
e_k = e(k);
for j = 1:H
dW1 = eta_w * e_k^2 * J * h(j) * eta_p;
dW2 = eta_w * e_k^2 * J * sum_e * h(j) * eta_i;
dW3 = eta_w * e_k^2 * J * ec(k) * h(j) * eta_d;
W(j,1) = W(j,1) + dW1;
W(j,2) = W(j,2) + dW2;
W(j,3) = W(j,3) + dW3;
end
end
% 记录数据
Kp_list(k-1) = Kp;
Ki_list(k-1) = Ki;
Kd_list(k-1) = Kd;
error_list(k-1) = e(k);
u_list(k-1) = u_current;
end
% 绘制结果
t = (0:N-1) * Ts;
figure;
subplot(3,1,1);
plot(t, r(2:N+1), 'r--', t, y(2:N+1), 'b-');
xlabel('Time (s)');
ylabel('Output');
legend('Reference', 'System Output');
title('System Response');
subplot(3,1,2);
plot(t, error_list);
xlabel('Time (s)');
ylabel('Error');
title('Tracking Error');
subplot(3,1,3);
plot(t, Kp_list, 'r', t, Ki_list, 'g', t, Kd_list, 'b');
xlabel('Time (s)');
ylabel('Parameter Value');
legend('Kp', 'Ki', 'Kd');
title('Adaptive PID Parameters');
figure;
plot(t, u_list);
xlabel('Time (s)');
ylabel('Control Signal');
title('Control Input');
AI生成了一个二阶离散系统作为被控对象,其表达式为:
\(G(z)=\frac{Y(z)}{U(z)}=\frac{0.2z^{-1}+0.1z^{-2}}{1-1.5z^{-1}+0.7z^{-2}}\)
利用差分方程得到被控对象输出值:
\(y(k+1) = a1 \cdot y(k) + a2 \cdot y(k-1) +
b1 \cdot u(k) + b2 \cdot u(k-1)\)
\(= 1.5y(k) - 0.7y(k-1) + 0.2u(k) +
0.1u(k-1)\) PID控制器初始参数被设置为\(K_p=0.1,K_i=0.01,K_d=0.05\),按照这个参数运行后出现了仿真运行一段时间后响应曲线出现较大幅度震荡的问题。
为此再次询问DeepSeek,它给出的办法是:禁用RBF神经网络,首先采用固定的PID参数做调试。
经过反复调整,最终初始参数被确定为\(K_p=0.2,K_i=30,K_d=1\)。
系统在0.5s时刻被施加一个阶跃信号(即0.5s前目标值为0,0.5s后目标值为1)。
此外,为防止系统不稳定,为输出的控制量限幅[-10~10]。

可以观察到采用RBF神经网络优化后波动更小,对于给定信号的跟随性能更好。
RBF神经网络优化
在询问DeepSeek如何解决响应震荡的同时,DeepSeek同时给出了一些RBF神经网络的优化建议。
改进Jacobian估计:
数值差分估计雅可比矩阵时,添加平滑滤波和小变化阈值保护,当控制量变化小于一个值时,则将估计值设为默认值。
这可以防止控制量变化过小时所造成的估计值不准确。
1 | % 修改Jacobian估计部分 |
添加误差信号滤波:
误差信号中的高频噪声会被RBF网络放大,导致参数误调整。这里对误差e和误差变化率ec进行一阶低通滤波。
1
2
3
4
5
6
7% 在初始化后添加滤波参数
alpha = 0.2; % 滤波系数(0 < α < 1,值越小滤波越强)
% 在主循环中修改误差计算
e_raw = r(k) - y(k);
e(k) = alpha * e_raw + (1 - alpha) * e(k-1); % 滤波后误差
ec(k) = e(k) - e(k-1); % 基于滤波后误差计算变化率
引入动量项平滑权重更新:
梯度下降法容易陷入局部震荡,引入动量项可平滑更新方向。
1
2
3
4
5
6
7
8
9
10
11
12
13% 在初始化部分添加动量参数
momentum = 0.8; % 动量系数
dW_prev = zeros(size(W)); % 记录上一次权重变化
% 修改权重更新部分
dW1 = eta_w * e_k^2 * J * h(j) * eta_p;
dW2 = eta_w * e_k^2 * J * sum_e * h(j) * eta_i;
dW3 = eta_w * e_k^2 * J * ec(k) * h(j) * eta_d;
% 加入动量
dW_current = [dW1, dW2, dW3];
W(j,:) = W(j,:) + dW_current + momentum * dW_prev(j,:);
dW_prev(j,:) = dW_current; % 保存当前变化
在神经网络的优化过程中,动量项和惯性项都是为了加速收敛并克服局部极小值问题而引入的技术。
然而两者有着不同的定义和作用机制。动量项通过增加一个基于过去梯度累积的速度向量来调整权重更新的方向和大小。这有助于减少振荡,并使学习过程更稳定和平滑。具体来说,在每次迭代时不仅考虑当前梯度方向,还会加入之前几次迭代积累下来的信息,从而形成一种“惯性”,使得算法能够更快地穿越平坦区域而不易陷入鞍点或局部最优解附近的小波动之中。
值得注意的是,“惯性项”这一术语并不常见于标准机器学习文献中;相反,人们更倾向于讨论“动量”。如果这里所说的惯性指的是某种形式的记忆效应,则其概念可能类似于动量——即让模型记住之前的移动趋势以便更好地指导未来的参数更新路径。但在严格意义上讲,二者应当视为同一事物的不同表述方式。
综上所述,所谓的“惯性项”很可能是指广义上的动量机制的一部分特性表现而已,并无本质差异。不过需要注意的是,在某些特定上下文中可能存在细微差别,因此建议查阅原始资料确认确切含义。
此外,DeepSeek提出可以采用更复杂的自适应机制(如滑模控制)对RBF神经网络进行优化。关于滑模控制的原理以及采用滑模控制优化的RBF神经网络PID控制器Matlab代码,参见下一篇文章。