终于有点头绪.虽然你是3年前发的我忍不住跟你分享一下.
估计还会有人需要。我找了整整几天在网上找不到任何有用的资料
等过几天答辩完了有新的理解会回来补充,就当造福后人了。
switch flag,
case 0
[sys,x0,str,ts]=mdlInitializeSizes(nh)
case 3
sys=mdlOutputs(t,x,u,nh,xite,alfa,KF1,KF2,wi,wo)
case { 1,2, 4, 9 }
sys=[]
otherwise
error(['Unhandled flag = ',num2str(flag)])
end
flag是标志位.不同的flag取值代表函数进行不同的运算,这里flag=0进行初始化运算,=3进行sys输出运算,其他的不运算。
function [sys,x0,str,ts] = mdlInitializeSizes(nh)
sizes = simsizes
sizes.NumContStates = 0
sizes.NumDiscStates = 0
sizes.NumOutputs = 4+7*nh % dynamically sized?
sizes.NumInputs = 14*nh+7 % dynamically sized?
sizes.DirFeedthrough = 1 % has direct feedthrough
sizes.NumSampleTimes = 1
sys = simsizes(sizes)
str = []
x0 = []
ts = [-1 0]
这些是必要的参数设置,分别是连续参数为0,离散参数为0,输出个数4+7*nh,输入个数14*nh+7(不知道4和7是哪来的?分别是输入参数和返回参数的数量),直接馈入(我也不知道是什么)为1,取样次数为1.设置完赋给sys输出。
str是没用的东西,x0是初始状态为空矩阵,这里你打错字了是ts=[T0],ts是一个1X2的向量,ts(1)是采样周期,ts(2)是偏移量。
wi_2=wi+reshape(u(8:7+4*nh),nh,4)
wo_2=wo+reshape(u(8+4*nh:7+7*nh),3,nh)
wi_1=wi+reshape(u(8+7*nh:7+11*nh),nh,4)
wo_1=wo+reshape(u(8+11*nh:7+14*nh),3,nh)
这个是学习网络的建立过程,具体我也不懂。
xx=[u(1)-u(2)u(1)u(1)+u(3)-2*u(2)]
这句是增量式PID控制算法,应该是你说的PID部分,我也不太懂。
程序部分我就知道这些。
还有我好久才查到的,nh代表神经元个数,xite是学习速率,alfa惯性系数。
希望对再来看的人有帮助。
参考一下刘金琨的《先进PID控制》这本书。例子:被控对象yout(k)=a(k)yout(k-1)/(1+yout(k-1)^2)+u(k_1)
其中a(k)=1.2(1-0.8e^(-0.1k))
输入信号:rin(k)=1.0和rin(k)=sin(2t)
%BP based PID Control
clear all
close all
xite=0.25//学习速率
alfa=0.05//惯性系数
S=1%Signal type
IN=4H=5Out=3 %NN Structure
if S==1 %Step Signal
wi=[-0.6394 -0.2696 -0.3756 -0.7023
-0.8603 -0.2013 -0.5024 -0.2596
-1.07490.5543 -1.6820 -0.5437
-0.3625 -0.0724 -0.6463 -0.2859
0.14250.0279 -0.5406 -0.7660]
%wi=0.50*rands(H,IN)
wi_1=wiwi_2=wiwi_3=wi
wo=[0.7576 0.2616 0.5820 -0.1416 -0.1325
-0.1146 0.2949 0.8352 0.2205 0.4508
0.7201 0.4566 0.7672 0.4962 0.3632]
%wo=0.50*rands(Out,H)
wo_1=wowo_2=wowo_3=wo
end
if S==2 %Sine Signal
wi=[-0.28460.2193 -0.5097 -1.0668
-0.7484 -0.1210 -0.47080.0988
-0.71760.8297 -1.60000.2049
-0.08580.1925 -0.63460.0347
0.43580.2369 -0.4564 -0.1324]
%wi=0.50*rands(H,IN)
wi_1=wiwi_2=wiwi_3=wi
wo=[1.04380.54780.86820.14460.1537
0.17160.58111.12140.50670.7370
1.00630.74281.05340.78240.6494]
%wo=0.50*rands(Out,H)
wo_1=wowo_2=wowo_3=wo
end
x=[0,0,0]
u_1=0u_2=0u_3=0u_4=0u_5=0
y_1=0y_2=0y_3=0
Oh=zeros(H,1) %Output from NN middle layer
I=Oh%Input to NN middle layer
error_2=0
error_1=0
ts=0.001
for k=1:1:6000
time(k)=k*ts
if S==1
rin(k)=1.0
elseif S==2
rin(k)=sin(1*2*pi*k*ts)
end
%Unlinear model
a(k)=1.2*(1-0.8*exp(-0.1*k))
yout(k)=a(k)*y_1/(1+y_1^2)+u_1
error(k)=rin(k)-yout(k)
xi=[rin(k),yout(k),error(k),1]
x(1)=error(k)-error_1
x(2)=error(k)
x(3)=error(k)-2*error_1+error_2
epid=[x(1)x(2)x(3)]
I=xi*wi'
for j=1:1:H
Oh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j)))%Middle Layer
end
K=wo*Oh%Output Layer
for l=1:1:Out
K(l)=exp(K(l))/(exp(K(l))+exp(-K(l))) %Getting kp,ki,kd
end
kp(k)=K(1)ki(k)=K(2)kd(k)=K(3)
Kpid=[kp(k),ki(k),kd(k)]
du(k)=Kpid*epid
u(k)=u_1+du(k)
if u(k)>=10 % Restricting the output of controller
u(k)=10
end
if u(k)<=-10
u(k)=-10
end
dyu(k)=sign((yout(k)-y_1)/(u(k)-u_1+0.0000001))
%Output layer
for j=1:1:Out
dK(j)=2/(exp(K(j))+exp(-K(j)))^2
end
for l=1:1:Out
delta3(l)=error(k)*dyu(k)*epid(l)*dK(l)
end
for l=1:1:Out
for i=1:1:H
d_wo=xite*delta3(l)*Oh(i)+alfa*(wo_1-wo_2)
end
end
wo=wo_1+d_wo+alfa*(wo_1-wo_2)
%Hidden layer
for i=1:1:H
dO(i)=4/(exp(I(i))+exp(-I(i)))^2
end
segma=delta3*wo
for i=1:1:H
delta2(i)=dO(i)*segma(i)
end
d_wi=xite*delta2'*xi
wi=wi_1+d_wi+alfa*(wi_1-wi_2)
%Parameters Update
u_5=u_4u_4=u_3u_3=u_2u_2=u_1u_1=u(k)
y_2=y_1y_1=yout(k)
wo_3=wo_2
wo_2=wo_1
wo_1=wo
wi_3=wi_2
wi_2=wi_1
wi_1=wi
error_2=error_1
error_1=error(k)
end
figure(1)
plot(time,rin,'r',time,yout,'b')
xlabel('time(s)')ylabel('rin,yout')
figure(2)
plot(time,error,'r')
xlabel('time(s)')ylabel('error')
figure(3)
plot(time,u,'r')
xlabel('time(s)')ylabel('u')
figure(4)
subplot(311)
plot(time,kp,'r')
xlabel('time(s)')ylabel('kp')
subplot(312)
plot(time,ki,'g')
xlabel('time(s)')ylabel('ki')
subplot(313)
plot(time,kd,'b')
xlabel('time(s)')ylabel('kd')
利用BP神经网络来整定PID,也许能实现。但是书本上的这个BP-PID理论书本是错误的。你仔细看看,它的输出激活函数的值域是【0,1】,PID的参数不可能是只在这个范围啊!可以说输出没有反归一化(值域扩展)。至于输入归一化,可用不做,但是输出在0和1之间,就是闹笑话了欢迎分享,转载请注明来源:内存溢出
评论列表(0条)