跪求:如何用matlab做专家PID控制的仿真

跪求:如何用matlab做专家PID控制的仿真,第1张

条件太少,自己做了,可以出结果,

%Integration separation PID Controller

clear all

close all

ts=5

%delay plant

sys=tf([1],[30,1],'inputdelay',10)

dsys=c2d(sys,ts,'zoh')

[num,den]=tfdata(dsys,'v')

u_1=0u_2=0u_3=0u_4=0u_5=0

y_1=0y_2=0y_3=0

error_1=0error_2=0

ei=0

for k=1:1:200

time(k)=k*ts

%delay plant

yout(k)=-den(2)*y_1+num(2)*u_5

%I separation

rin(k)=40

error(k)=rin(k)-yout(k)

ei=ei+error(k)*ts

M=2

if M==1 %using integration separation

if abs(error(k))>=30&abs(error(k))<=40

beta=0.3

elseif abs(error(k))>=20&abs(error(k))<御乎核=30

beta=0.6

elseif abs(error(k))>=10&abs(error(k))<=20

beta=0.9

else

beta=1.0

end

elseif M==2

beta=1.0 %not using integration separation

end

kp=0.80

ki=0.005

kd=3.0

u(k)=kp*error(k)+kd*(error(k)-error_1)/ts+beta*ki*ei

if u(k)>=110

u(k)=110

end

if u(k)<=-110

u(k)=110

end

u_5=u_4u_4=u_3u_3=u_2u_2=u_1u_1=u(k)

y_3=y_2y_2=y_1y_1=yout(k)

error_2=error_1

error_1=error(k)

end

figure(1)

plot(time,rin,'b',time,yout,'r')

xlabel('镇掘time(s)')ylabel('rin,yout')

figure(2)

plot(time,u,'r')

xlabel('顷源time(s)')ylabel('u')

这是专家式PID控制的程序,详细可见刘告芹金坤《新型PID控制及其仿真》第三章腊饥。

%Expert PID Controller

clear all

close all

ts=0.001

sys=tf(5.235e005,[1,87.35,1.047e004,0])

dsys=c2d(sys,ts,'z')

[num,den]=tfdata(dsys,'v')

u_1=0.0u_2=0.0u_3=0.0

y_1=0y_2=0y_3=0

x=[0,0,0]'

x2_1=0

kp=0.6

ki=0.03

kd=0.01

error_1=0

for k=1:1:500

time(k)=k*ts

rin(k)=1.0 %Tracing Jieyue Signal

u(k)=kp*x(1)+kd*x(2)+ki*x(3)%PID Controller

%Expert control rule

if abs(x(1))>0.8 %Rule1:Unclosed control firstly

u(k)=0.45

elseif abs(x(1))>0.40

u(k)=0.40

elseif abs(x(1))>轮友返0.20

u(k)=0.12

elseif abs(x(1))>0.01

u(k)=0.10

end

if x(1)*x(2)>0|(x(2)==0) %Rule2

if abs(x(1))>=0.05

u(k)=u_1+2*kp*x(1)

else

u(k)=u_1+0.4*kp*x(1)

end

end

if (x(1)*x(2)<0&x(2)*x2_1>0)|(x(1)==0) %Rule3

u(k)=u(k)

end

if x(1)*x(2)<0&x(2)*x2_1<0 %Rule4

if abs(x(1))>=0.05

u(k)=u_1+2*kp*error_1

else

u(k)=u_1+0.6*kp*error_1

end

end

if abs(x(1))<=0.001 %Rule5:Integration separation PI control

u(k)=0.5*x(1)+0.010*x(3)

end

%Restricting the output of controller

if u(k)>=10

u(k)=10

end

if u(k)<=-10

u(k)=-10

end

%Linear model

yout(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(1)*u(k)+num(2)*u_1+num(3)*u_2+num(4)*u_3

error(k)=rin(k)-yout(k)

%----------Return of PID parameters------------%

u_3=u_2u_2=u_1u_1=u(k)

y_3=y_2y_2=y_1y_1=yout(k)

x(1)=error(k) % Calculating P

x2_1=x(2)

x(2)=(error(k)-error_1)/ts % Calculating D

x(3)=x(3)+error(k)*ts % Calculating I

error_1=error(k)

end

figure(1)

plot(time,rin,'b',time,yout,'r')

xlabel('time(s)')ylabel('rin,yout')

figure(2)

plot(time,rin-yout,'r')

xlabel('time(s)')ylabel('error')

给你一个全MATLAB仿真的程序,没用到SIMULINK

close all

clear all

a=newfis('fuzzf')

f1=1

a=addvar(a,'input','e',[-3*f1,3*f1])

a=addmf(a,'input',1,'NB','zmf',[-3*f1,-1*f1])

a=addmf(a,'input',1,'NM','trimf',[-3*f1,-2*f1,0])

a=addmf(a,'input',1,'NS','trimf',[-3*f1,-1*f1,1*f1])

a=addmf(a,'input',1,'Z','trimf',[-2*f1,0,2*f1])

a=addmf(a,'input',1,'PS','trimf',[-1*f1,1*f1,3*f1])

a=addmf(a,'input',1,'PM','trimf',[0,2*f1,3*f1])

a=addmf(a,'input',1,'PB'纤信岁,'smf',[1*f1,3*f1])

f2=1

a=addvar(a,'input','ec',[-3*f2,3*f2])

a=addmf(a,'input',2,'NB','zmf',[-3*f2,-1*f2])

a=addmf(a,'input',2,'NM','trimf',[-3*f2,-2*f2,0])

a=addmf(a,'input',2,'NS','trimf',[-3*f2,-1*f2,1*f2])

a=addmf(a,'input',2,'Z','trimf',[-2*f2,0,2*f2])

a=addmf(a,'input',2,'PS','trimf',[-1*f2,1*f2,3*f2])

a=addmf(a,'input',2,'PM','trimf',[0,2*f2,3*f2])

a=addmf(a,'input',2,'PB','smf',[1*f2,3*f2])

f3=1.5

a=addvar(a,'output','u',[-3*f3,3*f3])

a=addmf(a,'output',1,'NB','zmf',[-3*f3,-1*f3])

a=addmf(a,'output',1,'NM','trimf',[-3*f3,-2*f3,0])

a=addmf(a,'output',1,'NS','trimf',[-3*f3,-1*f3,1*f3])

a=addmf(a,'output',1,'Z','trimf',[-2*f3,0,2*f3])

a=addmf(a,'output',1,'PS','trimf',[-1*f3,1*f3,3*f3])

a=addmf(a,'output',1,'PM','坦链trimf',[0,2*f3,3*f3])

a=addmf(a,'毁睁output',1,'PB','smf',[1*f3,3*f3])

rulelist=[1 1 1 1 1

1 2 1 1 1

1 3 2 1 1

1 4 2 1 1

1 5 3 1 1

1 6 3 1 1

1 7 4 1 1

2 1 1 1 1

2 2 2 1 1

2 3 2 1 1

2 4 3 1 1

2 5 3 1 1

2 6 4 1 1

2 7 5 1 1

3 1 2 1 1

3 2 2 1 1

3 3 3 1 1

3 4 3 1 1

3 5 4 1 1

3 6 5 1 1

3 7 5 1 1

4 1 2 1 1

4 2 3 1 1

4 3 3 1 1

4 4 4 1 1

4 5 5 1 1

4 6 5 1 1

4 7 6 1 1

5 1 3 1 1

5 2 3 1 1

5 3 4 1 1

5 4 5 1 1

5 5 5 1 1

5 6 6 1 1

5 7 6 1 1

6 1 3 1 1

6 2 4 1 1

6 3 5 1 1

6 4 5 1 1

6 5 6 1 1

6 6 6 1 1

6 7 7 1 1

7 1 4 1 1

7 2 5 1 1

7 3 5 1 1

7 4 6 1 1

7 5 6 1 1

7 6 7 1 1

7 7 7 1 1]

a=addrule(a,rulelist)

a1=setfis(a,'DefuzzMethod','mom')%Defuzzy

writefis(a1,'fuzzf')

a2=readfis('fuzzf')

Ulist=zeros(7,7)

for i=1:7

for j=1:7

e(i)=-4+i

ec(j)=-4+j

Ulist(i,j)=evalfis([e(i),ec(j)],a2)

end

end

figure(1)

plotfis(a2)

figure(2)

plotmf(a,'input',1)

figure(3)

plotmf(a,'input',2)

figure(4)

plotmf(a,'output',1)

这里简单说明一下:首先是编写2个输入,1个输出的隶属度函数;接下来的是模糊规则,一共49条;然后用解模糊函数得出控制量U,这里输出的U就直接是精确量了,解模糊用到得规则是取隶属度最大的那个数即MOM算法。

显示的三个图形窗口分别是:模糊控制器内部原理图,以及2个输入,1个输出的隶属度函数图。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8255885.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存