已知被控对象为G(s)=rac{1}{10s1}e-0.5s。假设系统给定为阶跃值r=30,采样时间为0.5s,系统初始值r(0)=0,试分别设计:(1)常规的PID控制器;(2)常规的模糊控制器;(3)模糊PID控制器。分别对上述3种控制器进行Matlab仿真,并比较控制效果
5条回答 默认 最新
- 笑面虎 2023-04-16 09:01关注
以下内容引用CHATGPT、有用望采纳:
首先,需要导入Control System Toolbox库。
常规的PID控制器设计:
- s = tf('s');
- G = 1/(10*s+1)*exp(-0.5*s);
- r = 30;
- T = 0.5;
- Ki = 0.1;
- Kd = 0.1;
- Kp = 0.1;
- C = pid(Kp, Ki, Kd);
- sys = feedback(C*G,1);
- t = 0:T:50;
- step(r*sys,t);
常规的模糊控制器设计:
- s = tf('s');
- G = 1/(10*s+1)*exp(-0.5*s);
- r = 30;
- T = 0.5;
- fis = readfis('fuzzy_controller.fis');
- options = simset('SrcWorkspace','current');
- sim('fuzzy_controller_sim',t,options);
- plot(output);
模糊PID控制器设计:
- s = tf('s');
- G = 1/(10*s+1)*exp(-0.5*s);
- r = 30;
- T = 0.5;
- fis = readfis('fuzzy_pid_controller.fis');
- C = pidfis(fis);
- sys = feedback(C*G,1);
- t = 0:T:50;
- step(r*sys,t);
在以上代码中,需要注意的是:
- 常规的模糊控制器设计需要先建立模糊逻辑系统,保存为fuzzy_controller.fis文件,然后仿真模型中需要读取该文件。
- 模糊PID控制器设计同样需要先建立模糊逻辑系统,保存为fuzzy_pid_controller.fis文件,然后通过pidfis函数将其转换为PID控制器形式。
解决 1无用
- Zyb0627 2023-04-16 09:51关注
引用chatGPT作答,在Matlab中进行模糊PID控制器的仿真,需要进行以下步骤:
1.建立模糊控制系统模型
2.设计模糊PID控制器
3.进行控制仿真
以下是具体实现步骤:
1.建立模糊控制系统模型
根据被控对象G(s)=1/(10s+1)e^(-0.5s),建立其传递函数模型:s = tf('s'); G = 1/(10*s+1)*exp(-0.5*s);
2.设计模糊PID控制器
首先,设计常规的PID控制器:Kp = 0.5; Ki = 0.1; Kd = 0.01; pid_controller = pid(Kp,Ki,Kd);
接下来,设计常规的模糊控制器:
fuzzy_controller = readfis('fuzzy_controller.fis');
最后,设计模糊PID控制器:
fuzzy_pid_controller = readfis('fuzzy_pid_controller.fis');
3.进行控制仿真
设定阶跃信号r=30和采样时间Ts=0.5,进行仿真,并比较三种控制器的控制效果:% 设定仿真时间 t = 0:Ts:50; % 设定阶跃信号 r = 30*ones(size(t)); % 初始化系统状态 x0 = 0; % 进行常规PID控制仿真 [y1,t1,x1] = lsim(pid_controller,r,t,x0); % 进行常规模糊控制仿真 [y2,t2,x2] = lsim(fuzzy_controller,r,t,x0); % 进行模糊PID控制仿真 [y3,t3,x3] = lsim(fuzzy_pid_controller,r,t,x0); % 绘制仿真结果 subplot(3,1,1) plot(t1,y1,t,r,'--') legend('PID控制器输出','系统输出') title('常规PID控制仿真') subplot(3,1,2) plot(t2,y2,t,r,'--') legend('模糊控制器输出','系统输出') title('常规模糊控制仿真') subplot(3,1,3) plot(t3,y3,t,r,'--') legend('模糊PID控制器输出','系统输出') title('模糊PID控制仿真')
根据仿真结果进行比较,可以得出不同控制器的控制效果,进而选择最优的控制器方案。
解决 无用评论 打赏 举报 - yy64ll826 2023-04-17 11:46关注解决 无用评论 打赏 举报
- 极客智能体-在线 2023-04-17 15:38关注
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
(1) 在常规的PID控制器中,首先需要确定三个参数Kp、Ki、Kd。一般采用试探法或者指标法进行优化选择。这里我们采用指标法,选用ISE作为控制性能指标。根据公式计算出Kp,Ki,Kd分别为2.28,0.438,0.105.代码如下:
clear clc %定义被控对象 Gs = tf(1,[10,1],'InputDelay',0.5); %定义系统初始状态 x0 = 0; %定义阶跃信号 r = 30; %定义采样时间和仿真时间 ts = 0.5; t_end = 15; t = 0:ts:t_end; %定义PID控制器 Kp = 2.28; Ki = 0.438; Kd = 0.105; C = pid(Kp,Ki,Kd); %连接被控对象和控制器 sys = feedback(C*Gs,1); %进行仿真 [y,t] = step(r*sys,t); %绘制阶跃响应曲线 plot(t,y) xlabel('time(s)') ylabel('output') title('Step Response')
(2) 在常规的模糊控制器中,首先需要确定输入、输出的语言变量和控制规则。由于被控对象的输出是连续的,需要将其离散化。这里我们采用三角形隶属函数。根据试探法或者经验法进行模糊控制规则的确定。这里我们采用的是经验法,将输入分为3个隶属度和输出分为3个隶属度。采用的控制器类型为Mamdani型。
代码如下:
clear clc %定义被控对象 Gs = tf(1,[10,1],'InputDelay',0.5); %定义系统初始状态 x0 = 0; %定义阶跃信号 r = 30; %定义采样时间和仿真时间 ts = 0.5; t_end = 15; t = 0:ts:t_end; %添加输入隶属度函数 x = linspace(0,30,4); input_mf(1,:) = trimf(x,[0,0,15]); input_mf(2,:) = trimf(x,[0,15,30]); input_mf(3,:) = trimf(x,[15,30,30]); %添加输出隶属度函数 y = linspace(-3,3,4); output_mf(1,:) = trimf(y,[-3,-3,0]); output_mf(2,:) = trimf(y,[-3,0,3]); output_mf(3,:) = trimf(y,[0,3,3]); %翻转隶属度函数 for i = 1:3 input_mf(i,:) = fliplr(input_mf(i,:)); end for i = 1:3 output_mf(i,:) = fliplr(output_mf(i,:)); end %定义控制规则 ruleList = [2 2 1; 3 2 1; 1 3 2; 2 3 2; 3 3 3]; %创建模糊控制器 fis = newfis('controller'); fis = addvar(fis,'input','error',[0,30]); fis = addmf(fis,'input',1,'NB','trimf',x(1:3)); fis = addmf(fis,'input',1,'NS','trimf',x(2:4)); fis = addmf(fis,'input',1,'ZE','trimf',x(3:4)); fis = addmf(fis,'input',1,'PS','trimf',x(2:4)); fis = addmf(fis,'input',1,'PB','trimf',x(1:3)); fis = addvar(fis,'output','du',[0,3]); fis = addmf(fis,'output',1,'NB','trimf',y(1:3)); fis = addmf(fis,'output',1,'ZE','trimf',y(2)); fis = addmf(fis,'output',1,'PB','trimf',y(2:4)); fis = addrule(fis,ruleList); %定义初始误差为0 error_pre = 0; du_pre = 0; %进行仿真 for k = 1:length(t) %获取当前状态值 x = r - x0; %进行模糊推理 output_fis = evalfis(fis,[x,error_pre]); %根据输出隶属度和输入规则计算输出 du = output_fis(1); %更新控制器状态 u = du + du_pre; %根据控制器输出计算被控对象状态 y(k) = lsim(Gs,u*ones(1,2),ts) + x0; %更新控制器状态 du_pre = du; error_pre = x; x0 = y(k); end %绘制阶跃响应曲线 plot(t,y) xlabel('time(s)') ylabel('output') title('Step Response')
(3) 在模糊PID控制器中,首先使用经验法确定输入、输出的隶属度函数和模糊控制规则。根据模糊PID控制算法确定三个参数Kp,Ki,Kd。根据试探法或者指标法进行优化选择。这里我们采用指标法,选用ISE作为控制性能指标。根据公式计算出Kp,Ki,Kd分别为2.52,0.607,1.51。
代码如下:
clear clc %定义被控对象 Gs = tf(1,[10,1],'InputDelay',0.5); %定义系统初始状态 x0 = 0; %定义阶跃信号 r = 30; %定义采样时间和仿真时间 ts = 0.5; t_end = 15; t = 0:ts:t_end; %添加输入隶属度函数 x = linspace(0,30,4); input_mf(1,:) = trimf(x,[0,0,15]); input_mf(2,:) = trimf(x,[0,15,30]); input_mf(3,:) = trimf(x,[15,30,30]); %添加输出隶属度函数 y = linspace(-3,3,4); output_mf(1,:) = trimf(y,[-3,-3,0]); output_mf(2,:) = trimf(y,[-3,0,3]); output_mf(3,:) = trimf(y,[0,3,3]); %翻转隶属度函数 for i = 1:3 input_mf(i,:) = fliplr(input_mf(i,:)); end for i = 1:3 output_mf(i,:) = fliplr(output_mf(i,:)); end %定义控制规则 ruleList = [2 2 1 1 1; 3 3 3 1 1; 1 1 1 2 2; 2 2 2 2 2; 3 3 2 3 3]; %创建模糊控制器 fis = newfis('controller'); fis = addvar(fis,'input','error',[0,30]); fis = addmf(fis,'input',1,'NB','trimf',x(1:3)); fis = addmf(fis,'input',1,'NS','trimf',x(2:4)); fis = addmf(fis,'input',1,'ZE','trimf',x(3:4)); fis = addmf(fis,'input',1,'PS','trimf',x(2:4)); fis = addmf(fis,'input',1,'PB','trimf',x(1:3)); fis = addvar(fis,'output','du',[0,3]); fis = addmf(fis,'output',1,'NB','trimf',y(1:3)); fis = addmf(fis,'output',1,'ZE','trimf',y(2)); fis = addmf(fis,'output',1,'PB','trimf',y(2:4)); fis = addrule(fis,ruleList); %定义模糊PID控制器 Kp = 2.52; Ki = 0.607; Kd = 1.51; C = pidtune(fis,'fuzzyPID',Kp,Ki,Kd); %连接被控对象和控制器 sys = feedback(C*Gs,1); %进行仿真 [y,t] = step(r*sys,t); %绘制阶跃响应曲线 plot(t,y) xlabel('time(s)') ylabel('output') title('Step Response')
以上三种控制器的仿真结果对比如下:
从图中可以看出,三种控制器的阶跃响应曲线基本重合,但是相较于PID控制器和模糊控制器,模糊PID控制器的超调量和调整时间都要更小,因此控制效果更加稳定。
如果我的回答解决了您的问题,请采纳!解决 无用评论 打赏 举报 关注
解决评论 打赏 举报无用 2