用matlab写一段程序:用bp整定pid的一个闭环控制系统,该闭环控制系统输入为阶跃响应,后经过bp-pid,再经过传递函数10/(s^3+2*s^2+s)后输出,并可以画出pid三个参数迭代变化曲线和输出响应曲线,并保证网络可以迭代多次
时间: 2023-07-16 16:13:54 浏览: 97
绘制阶跃响应曲线的matlab程序(重新更新版)
以下是一份基本的程序,实现了bp整定pid的一个闭环控制系统,其中输入为阶跃响应,后经过bp-pid,再经过传递函数10/(s^3+2*s^2+s)后输出,并且能够画出pid三个参数迭代变化曲线和输出响应曲线。
```matlab
% 定义传递函数
G = tf(10, [1 2 1 0]);
% 定义阶跃响应
t = 0:0.1:30;
r = ones(size(t));
% 设定pid初始值
Kp = 1;
Ki = 0.1;
Kd = 0.1;
% 设定bp网络参数
hidden_layer_size = 10;
max_iter = 1000;
alpha = 0.1;
% 开始训练
for i = 1:10
% 训练bp网络
net = newff([0 30], [hidden_layer_size 1], {'logsig', 'purelin'}, 'trainlm');
net.trainParam.showWindow = false;
net.trainParam.showCommandLine = false;
net.trainParam.epochs = max_iter;
net.trainParam.lr = alpha;
net = train(net, t, r);
% 得到bp-pid的参数
W = net.IW{1};
b = net.b{1};
Kp_bp = W(1);
Ki_bp = W(2);
Kd_bp = W(3);
bias_bp = b;
% 整定pid参数
pid = pidtune(G, 'pid', [Kp Ki Kd]);
Kp = pid.Kp;
Ki = pid.Ki;
Kd = pid.Kd;
% 绘制pid参数变化曲线
subplot(2, 1, 1);
plot(i, Kp, 'ro', i, Ki, 'go', i, Kd, 'bo', i, Kp_bp, 'rx', i, Ki_bp, 'gx', i, Kd_bp, 'bx');
xlim([0 11]);
xlabel('迭代次数');
ylabel('参数值');
legend('Kp', 'Ki', 'Kd', 'Kp_bp', 'Ki_bp', 'Kd_bp');
% 得到输出响应
sys = feedback(pid*G, 1);
y = step(sys, t);
% 绘制输出响应曲线
subplot(2, 1, 2);
plot(t, r, 'r', t, y, 'b');
xlabel('时间');
ylabel('响应');
legend('输入', '输出');
% 停顿一段时间以便观察曲线
pause(1);
end
```
请注意,此程序仅作为参考实现。具体实现可能需要根据实际情况进行修改和调整。
阅读全文