clc
clear
close all
% 定义系统传递函数
G = tf(2,[6 5 1]); % 二阶系统传递函数
% 合并后的GIF文件名
filename_all = 'PID_All.gif';
% 创建单个图窗
figure(1); clf;
set(gcf, 'Position', [100, 100, 800, 600]); % 设置图窗大小,保证帧捕获完整
%% 1. 比例系数Kp的动态过程
Kp_list = 0:0.1:5;
for idx = 1:length(Kp_list)
Kp = Kp_list(idx);
G1 = Kp; % 比例控制
sys = feedback(G1 * G, 1); % 单位负反馈系统
% 绘制阶跃响应
step(sys);
axis([0 14 0 1.6]);
title(['比例控制: Kp = ', num2str(Kp, '%.1f')], 'FontSize', 12);
xlabel('时间 (s)', 'FontSize', 10);
ylabel('输出', 'FontSize', 10);
grid on;
pause(0.05);
% 捕获帧并写入GIF
frame = getframe(1);
im = frame2im(frame);
[imind, cm] = rgb2ind(im, 256);
if idx == 1 && length(Kp_list) == 1 % 处理单帧情况
imwrite(imind, cm, filename_all, 'gif', 'Loopcount', inf, 'DelayTime', 0.1);
else
if idx == 1 % 第一帧(比例阶段起始)
imwrite(imind, cm, filename_all, 'gif', 'Loopcount', inf, 'DelayTime', 0.1);
else
imwrite(imind, cm, filename_all, 'gif', 'WriteMode', 'append', 'DelayTime', 0.1);
end
end
end
%% 2. 积分系数Ki的动态过程
Kp = 5;
Ki_list = 0:0.02:1;
for idx = 1:length(Ki_list)
Ki = Ki_list(idx);
G1 = tf([Kp Ki], [1 0]); % PI控制
sys = feedback(G1 * G, 1); % 单位负反馈系统
% 绘制阶跃响应
step(sys);
axis([0 14 0 1.6]);
title(['PI控制: Kp = ', num2str(Kp), ', Ki = ', num2str(Ki, '%.2f')], 'FontSize', 12);
xlabel('时间 (s)', 'FontSize', 10);
ylabel('输出', 'FontSize', 10);
grid on;
pause(0.05);
% 捕获帧并写入GIF
frame = getframe(1);
im = frame2im(frame);
[imind, cm] = rgb2ind(im, 256);
imwrite(imind, cm, filename_all, 'gif', 'WriteMode', 'append', 'DelayTime', 0.1);
end
%% 3. 微分系数Kd的动态过程
Kp = 5;
Ki = 1;
Kd_list = 0:0.1:5.5;
for idx = 1:length(Kd_list)
Kd = Kd_list(idx);
G1 = tf([Kd, Kp, Ki], [1,0]); % PID控制
sys = feedback(G1 * G, 1); % 单位负反馈系统
% 绘制阶跃响应
step(sys);
axis([0 14 0 1.6]);
title(['PID控制: Kp = ', num2str(Kp), ', Ki = ', num2str(Ki), ', Kd = ', num2str(Kd, '%.1f')], 'FontSize', 12);
xlabel('时间 (s)', 'FontSize', 10);
ylabel('输出', 'FontSize', 10);
grid on;
pause(0.05);
% 捕获帧并写入GIF
frame = getframe(1);
im = frame2im(frame);
[imind, cm] = rgb2ind(im, 256);
imwrite(imind, cm, filename_all, 'gif', 'WriteMode', 'append', 'DelayTime', 0.1);
end
disp(['GIF文件已生成:', fullfile(pwd(), filename_all)]);

clc
clear
close all
% 定义系统传递函数
G = tf(2,[6 5 1]); % 二阶系统传递函数
%% 1. 比例系数Kp的功能展示(图窗1,生成Kp_GIF.gif)
filename_kp = 'Kp_Function.gif';
figure(1); clf;
set(gcf, 'Position', [100, 100, 800, 600]); % 设置图窗位置和大小
Kp_list = 0:0.1:5;
for idx = 1:length(Kp_list)
Kp = Kp_list(idx);
G1 = Kp; % 比例控制
sys = feedback(G1 * G, 1); % 单位负反馈系统
% 绘制阶跃响应
step(sys);
axis([0 14 0 1.6]);
title(['比例系数Kp的功能展示', newline, '当前Kp = ', num2str(Kp, '%.1f')], 'FontSize', 12);
xlabel('时间 (s)', 'FontSize', 10);
ylabel('系统输出', 'FontSize', 10);
grid on;
pause(0.05);
% 捕获帧并写入GIF
frame = getframe(1);
im = frame2im(frame);
[imind, cm] = rgb2ind(im, 256);
if idx == 1
imwrite(imind, cm, filename_kp, 'gif', 'Loopcount', inf, 'DelayTime', 0.1);
else
imwrite(imind, cm, filename_kp, 'gif', 'WriteMode', 'append', 'DelayTime', 0.1);
end
end
%% 2. 积分系数Ki的功能展示(图窗2,生成Ki_GIF.gif)
filename_ki = 'Ki_Function.gif';
figure(2); clf;
set(gcf, 'Position', [200, 200, 800, 600]);
Kp = 5; % 固定Kp
Ki_list = 0:0.02:1;
for idx = 1:length(Ki_list)
Ki = Ki_list(idx);
G1 = tf([Kp Ki], [1 0]); % PI控制
sys = feedback(G1 * G, 1); % 单位负反馈系统
% 绘制阶跃响应
step(sys);
axis([0 14 0 1.6]);
title(['积分系数Ki的功能展示(Kp固定为5)', newline, '当前Ki = ', num2str(Ki, '%.2f')], 'FontSize', 12);
xlabel('时间 (s)', 'FontSize', 10);
ylabel('系统输出', 'FontSize', 10);
grid on;
pause(0.05);
% 捕获帧并写入GIF
frame = getframe(2);
im = frame2im(frame);
[imind, cm] = rgb2ind(im, 256);
if idx == 1
imwrite(imind, cm, filename_ki, 'gif', 'Loopcount', inf, 'DelayTime', 0.1);
else
imwrite(imind, cm, filename_ki, 'gif', 'WriteMode', 'append', 'DelayTime', 0.1);
end
end
%% 3. 微分系数Kd的功能展示(图窗3,生成Kd_GIF.gif)
filename_kd = 'Kd_Function.gif';
figure(3); clf;
set(gcf, 'Position', [300, 300, 800, 600]);
Kp = 5; % 固定Kp
Ki = 1; % 固定Ki
Kd_list = 0:0.1:5.5;
for idx = 1:length(Kd_list)
Kd = Kd_list(idx);
G1 = tf([Kd, Kp, Ki], [1, 0]); % PID控制
sys = feedback(G1 * G, 1); % 单位负反馈系统
% 绘制阶跃响应
step(sys);
axis([0 14 0 1.6]);
title(['微分系数Kd的功能展示(Kp=5, Ki=1)', newline, '当前Kd = ', num2str(Kd, '%.1f')], 'FontSize', 12);
xlabel('时间 (s)', 'FontSize', 10);
ylabel('系统输出', 'FontSize', 10);
grid on;
pause(0.05);
% 捕获帧并写入GIF
frame = getframe(3);
im = frame2im(frame);
[imind, cm] = rgb2ind(im, 256);
if idx == 1
imwrite(imind, cm, filename_kd, 'gif', 'Loopcount', inf, 'DelayTime', 0.1);
else
imwrite(imind, cm, filename_kd, 'gif', 'WriteMode', 'append', 'DelayTime', 0.1);
end
end
disp('三个参数的功能展示GIF已生成,保存在当前工作目录!');



大佬们的链接汇总(学习参考):
深入浅出PID控制算法(二)------------PID算法离散化和增量式PID算法原理及Matlab实现_离散pid-CSDN博客