查看: 102|回复: 2|关注: 0

[已答复] 基于S函数的模糊神经PID控制的S函数与simulink模型,供大家学习

[复制链接]

新手

5 麦片

财富积分


050


5

主题

11

帖子

0

最佳答案
发表于 3 天前 | 显示全部楼层 |阅读模式
经过多天的摸索,终于做出了基于S函数的模糊神经PID控制的整个过程,心里还是相当激动的。现将编写的S函数和搭建的simulink模型分享给大家,便于像我这样的初学者学习。作为机械小硕,水平有限,可能会有问题,欢迎大家讨论指正。
里面的控制对象模型是:y(k)=2.38*y(k-1)-1.953*y(k-2)+0.5279*y(k-3)+0.01879*u(k-1)+0.06403*u(k-2)+0.01366*u(k-3)
虽然控制的结果不是太好,但是过程是正确的,希望能够帮助到你:
function [sys,x0,str,ts]=shenjingmohuPI(t,x,u,flag)
switch flag,
    case 0,
        [sys,x0,str,ts]=mdlInitializeSizes;
    case 2,
        sys=mdlUpdates(x,u);
    case 3,
        sys=mdlOutputs(t,x,u);
    case {1,4,9}
        sys=[];
    otherwise
        error(['Unhandled flag=',num2str(flag)]);
end


function [sys,x0,str,ts]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates =0;
sizes.NumDiscStates =3;
sizes.NumOutputs    =1+49*3+2*14;
sizes.NumInputs     =7+6*49+4*14;
sizes.DirFeedthrough =1;
sizes.NumSampleTimes =1;
sys=simsizes(sizes);
x0=zeros(3,1);
str=[];
ts=[0.001 0];


function sys=mdlUpdates(x,u)


x(1)=u(2)-u(3);
x(2)=u(2);
x(3)=u(2)-2*u(3)+u(4);
sys=x;


function sys=mdlOutputs(t,x,u)
w_1=reshape(u(8:154),49,3);
w_2=reshape(u(155:301),49,3);
c_1=reshape(u(302:315),2,7);
c_2=reshape(u(316:329),2,7);
b_1=reshape(u(330:343),2,7);
b_2=reshape(u(344:357),2,7);


xc=[u(1);u(5)];%指令信号rin和实际输出yout作为神经网络输入,也作为网络第一层
xite=0.1;
alfa=0.02;




if t==0           %赋初值
    w0=rands(49,3);
    b0=2*ones(2,7);
    c0=1*ones(2,7);
    w_1=w0;w_2=w0;
    c_1=c0;c_2=c0;
    b_1=b0;b_2=b0;
end
   
for i=1:1:2            %网络第二层
    for j=1:1:7
        f2(i,j)=exp(-(xc(i)-c_1(i,j))^2/b_1(i,j)^2);
    end
end


for j=1:1:7            %网络第三层
    m1(j)=f2(1,j);
    m2(j)=f2(2,j);
end
for i=1:1:7
    for j=1:1:7
        ff3(i,j)=m2(i)*m1(j);
    end
end
f3=[ff3(1,:),ff3(2,:),ff3(3,:),ff3(4,:),ff3(5,:),ff3(6,:),ff3(7,:)];


for i=1:1:49            %网络第四层
        f4(i)=f3(i)/sum(f3(:));
end


f5=w_1'*f4';%网络第五层
kp=f5(1);
ki=f5(2);
kd=f5(3);


duout=kp*x(1)+ki*x(2)+kd*x(3);
uout=u(7)+duout;%控制器输出


dyuout=sign((u(5)-u(6))/(uout-u(7)+0.0001));


for i=1:1:49        %权值w学习算法
    for j=1:1:3
        d_w(i,j)=xite*u(2)*dyuout*x(j)*f4(i);
    end
end
w=w_1+d_w+alfa*(w_1-w_2);


for j=1:1:49       %b和c的学习算法
    dalta4(j)=x(1)*w(j,1)+x(2)*w(j,2)+x(3)*w(j,3);
end
for j=1:1:49
    dalta3(j)=dalta4(j)*(sum(f3(:))-f3(j))/sum(f3(:))^2;
end
for i=1:1:7
    dalta2(1,i)=dalta3(i)*f2(2,1)+dalta3(i+7)*f2(2,2)+dalta3(i+14)*f2(2,3)+dalta3(i+21)*f2(2,4)+dalta3(i+28)*f2(2,5)+dalta3(i+35)*f2(2,6)+dalta3(i+42)*f2(2,7);
end
for i=1:1:7
    dalta2(2,i)=dalta3(i*7-6)*f2(1,1)+dalta3(i*7-5)*f2(1,2)+dalta3(i*7-4)*f2(1,3)+dalta3(i*7-3)*f2(1,4)+dalta3(i*7-2)*f2(1,5)+dalta3(i*7-1)*f2(1,6)+dalta3(i*7)*f2(1,7);
end


for i=1:1:2
    for j=1:1:7
        d_c(i,j)=xite*dalta2(i,j)*(2*(xc(i)-c_1(i,j))/b_1(i,j)^2);
        d_b(i,j)=xite*dalta2(i,j)*(2*(xc(i)-c_1(i,j))^2/b_1(i,j)^3);
    end
end
c=c_1+d_c+alfa*(c_1-c_2);
b=b_1+d_b+alfa*(b_1-b_2);


sys=[uout;w(:);c(:);b(:)];

siminlinkofmohushengjing.slx

16.89 KB, 下载次数: 11

simulink模型

shenjingmohuPID.m

2.67 KB, 下载次数: 10

S函数

新手

5 麦片

财富积分


050


0

主题

1

帖子

0

最佳答案
发表于 前天 15:35 | 显示全部楼层
请问楼主,控制模型可以是拉普拉斯S变换的传递函数吗?

新手

5 麦片

财富积分


050


5

主题

11

帖子

0

最佳答案
 楼主| 发表于 前天 20:01 | 显示全部楼层
唐伟山窝窝 发表于 2019-12-3 15:35
请问楼主,控制模型可以是拉普拉斯S变换的传递函数吗?

可以的。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表