📄 fuzzy_control.m
字号:
function f2=fuzzy_control(InputVector)
%函数实现模糊控制
%在线控制
%被控系统建模,系统的控制对象为K*esp(tds)/(T1s+1)(T2s+1)
num=20;
den=conv([2 1],[3 1]);
td=0.01;
[a1,b,c,d]=tf2ss(num,den); %把拉氏变换转换为状态方程 a1为系统状态阵,由系统参数决定;
%b为系统输入阵;c为输出阵;d为直接输出阵;
% x^=a1*x+b*u;
% y=c*x+d*u; y为输出向量
x=[0;0];
%系统参数
T=0.01; %采样时间间隔
h=T;
Nd=td/T; %系统的纯延时
N=1000;
R=ones(1,N);%系统的参考输入
%采用模糊控制器的二阶系统仿真
e=0;
de=0;
%量化因子,对系统的静、动态性能有重要影响.增大Ke,相当于缩小误差的基本论域,增强误差的控制作用,导致上升速率加大,超调增大;
%减小Ke,会使系统调节惰性变大;Kec(kd)增大,将增加系统稳定性,但Kec(kd)过大将导致系统的过渡过程时间变长,而Kec(kd)过小可能考之过大的超调和振荡;
%Ku相当于系统总的放大倍数,Ku增大系统响应速度增大,但过大会产生超调,Ku过小,系统稳态精度变差。
ke=30; %30
kd=3; %20,量化因子
ku=1.2; %,量化因子
for k=1:N
%输入变量变换至论域
e1=round(ke*e); %x0
de1=round(kd*de); %y0
if e1>=6
e1=6;
elseif e1<=-6
e1=-6;
end
if de1>=6
de1=6;
elseif de1<=-6
de1=-6;
end
e1 = e1 + 7;
de1 = de1 + 7;
out=InputVector(e1,de1); %调用函数计算模糊控制输出 z0
uu(1,k)=ku*out; %Ku相当于系统总的放大倍数
%延迟环节
if k<=Nd
u=0;
else
u=uu(1,k-Nd);
end
%控制作用于被控系统,计算系统输出,采用龙格-库塔法 解一阶微分方程
%初始条件为x=x[0]时,y=y[0]
%u为输入矩阵
%a1为系统状态阵,由系统参数决定;
%b为系统输入阵;c为输出阵;d为直接输出阵;
% x^=a1*x+b*u; x^为状态向量
% y=c*x+d*u; y为输出向量
k0=a1*x+b*u;
k1=a1*(x+h*k0/2)+b*u;
k2=a1*(x+h*k1/2)+b*u;
k3=a1*(x+h*k2)+b*u;
x=x+(k0+2*k1+2*k2+k3)*h/6;
y=c*x+d*u;
%计算系统输出误差及误差倒数
e1=e;
e=R(1,k)-y;
de=(e-e1)/T;
yy(1,k)=y;
end
%------------------------------------------------------------------------
%典型二阶环节的控制输出曲线
kk=[1:N]*T;
figure(2);
% plot(kk,R,'k',kk,yy,'r');
plot(kk,R,'k',10,2,'r');
xlabel('时间(0.01秒)');ylabel('输出');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -