Neural Network Radial Basis Function (RBF) PID Controller for Simulink
function [sys,x0,str,ts,SSC]=nnrbf_pid(t,x,u,flag,T,nn,K_pid,eta_pid, theta,alfa,beta0, w0)
switch flag case 0 [sys,x0,str,ts,SSC]=mdlInitializeSizes(T,nn); case 2 sys = mdlUpdates(u); case 3 sys = mdlOutputs(t,x,u,T,nn,K_pid,eta_pid,theta,alfa,beta0,w0); case {1,4,9} sys=[]; otherwise error(['Unhandled flag=',num2str(flag)]); end
%初始化函数 function [sys,x0,str,ts,SSC]=mdlInitializeSizes(T,nn) SSC='DefaultSimState'; sizes=simsizes;%读入模板,得出默认的控制量sizes. MumContStates = 0; sizes.MumDiscStates=3; sizes.NumOutputs = 4+5nn; sizes.NumInputs =9+15nn; sizes.DirFeedthrough =1; sizes.NumSampleTimes=1; sys=simsizes(sizes); x0=zeros(3,1); str=[]; ts=[T 0];%离散状态变量更新函数
function sys = mdlUpdates(u) sys=[u(1)-u(2);u(1);u(1)+u(3)-2*u(2)];
%输出量计算函数 function sys = mdlOutputs(t,x,u,T,nn,K_pid,eta_pid,theta,alfa,beta0,w0) ci3=reshape(u(7:6+3nn),3,nn); ci2=reshape(u(7+5nn:6+8nn),3,nn); ci1=reshape(u(7+10nn:6+13nn),3,nn); bi3=u(7+3nn:6+4nn); bi2=u(7+8nn:6+9nn); bi1=u(7+13nn:6+14nn); w3=u(7+4nn:6+5nn); w2=u(7+9nn:6+10nn); w1=u(7+14nn:6+15nn); xx=u([6;4;5]); if t==0 ci1=w0(1)ones(3,nn); bi1=w0(2)ones(nn,1); w1=w0(3)ones(nn,1); K_pid0=K_pid; else K_pid0=u(end-2:end); end for j=1:nn h(j,1)=exp(-norm(xx-ci1(:,j))^2/(2bi1(j)bi1(j))); end dym=u(4)-w1'h; w=w1+thetadymh+alfa(w1-w2)+beta0(w2-w3); for j=1:nn dbi(j,1)=thetadymw1(j)h(j)(bi1(j)^(-3))norm(xx-ci1(:,j))^2; dci(:,j)=thetadymw1(j)h(j)(xx-ci1(:,j))(bi1(j)^(-2)); end bi=bi1+dbi+alfa(bi1-bi2)+beta0*(bi2-bi3); ci=ci1+dci+alfa*(ci1-ci2)+beta0*(ci2-ci3); dJac=sum(w.h.(-xx(1)+ci(1,:)')./bi.^2);%Jacobian矩阵 KK=K_pid0+u(1)dJaceta_pid.*x; sys=[u(6)+KK'*x; KK; ci(:);bi(:);w(:)];
原文地址: https://www.cveoy.top/t/topic/pfVT 著作权归作者所有。请勿转载和采集!