模糊神经网络控制器的S函数设计

Posted matlabfpga

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模糊神经网络控制器的S函数设计相关的知识,希望对你有一定的参考价值。

目录

一、理论基础

二、核心程序


一、理论基础

模糊神经网络的设计主要包括如下几个方面:

(1)选取模糊神经网络控制器输入端和输出端变量;

(2)选取模糊神经网络控制器输入端和输出端变量相关参数;

(3)计算模糊神经网络集隶属函数并总结模糊神经网络控制器控制规则;

(4)确定模糊神经网络控制器模糊化和清晰化集体算法。

由于模糊控制是建立在专家经验的基础之上的,但这有很大的局限性,而人工神经网络可以充分逼近任意复杂的时变非线性系统,采用并行分布处理方法,可学习和自适应不确定系统。利用神经网络可以帮助模糊控制器进行学习,模糊逻辑可以帮助神经网络初始化及加快学习过程。通常神经网络的基本构架如下所示:

 

 

整个神经网络结构为五层,其中第一层为“输入层“,第二层为“模糊化层”,第三层为“模糊推理层”,第四层为“归一化层”,第五层为“解模糊输出层”。

第一层为输入层,其主要包括两个节点,所以第一层神经网络的输入输出可以用如下的式子表示:

 

 第二层为输入变量的语言变量值,通常是模糊集中的n个变量,它的作用是计算各输入分量属于各语言变量值模糊集合的隶属度。用来确定输入在不同的模糊语言值对应的隶属度,以便进行模糊推理,如果隶属函数为高斯函数,那么其表达式为:

 

 

 其中变量的具体含义和第一层节点的变量含义相同。

第三层是比较关键的一层,即模糊推理层,这一层的每个节点代表一条模糊规则,其每个节点的输出值表示每条模糊规则的激励强度。该节点的表达式可用如下的式子表示:

 

 第四层为归一化层,其输出是采用了Madmdani模糊规则,该层的表达式为: 

 

 第五层是模糊神经网络的解模糊层,即模糊神经网络的清晰化. 

二、核心程序

...................................................................
%S函数的第二步,状态的计算
elseif flag == 2
%外部模块的输出三个参数变量输入x,误差输入e,以及训练指令的数组的长度
x = u(1:Number_inport);%输入x
e = u(Number_inport+1:Number_inport+1);%误差输入e
learning = u(Number_inport+1+1);%训练指令的数组的长度

%1的时候为正常工作状态
if learning == 1
Feedfor_phase2;

%下面定义在正常的工作状态中,各个网络层的工作
%层1:
In1 = x*ones(1,Number_Fuzzy_rules);
Out1 = 1./(1 + (abs((In1-mean1)./sigma1)).^(2*b1));
%层2:
precond = Out1\';
Out2 = prod(Out1)\';
S_2 = sum(Out2);
%层3:
if S_2~=0
Out3 = Out2\'./S_2;
else
Out3 = zeros(1,NumRules);
end
%层4:
Aux1 = [x; 1]*Out3;
%训练数据
a = reshape(Aux1,(Number_signal_in+1)*NumRules,1);

%参数学习
P = (1./lamda).*(P - P*a*a\'*P./(lamda+a\'*P*a));
ThetaL4 = ThetaL4 + P*a.*e;
ThetaL4_mat = reshape(ThetaL4,Number_signal_in+1,NumRules);
%错误反馈
e3 = [x\' 1]*ThetaL4_mat.*e;
denom = S_2*S_2;

%下面自适应产生10个规则的模糊控制器
Theta32 = zeros(NumRules,NumRules);
if denom~=0
for k1=1:NumRules
for k2=1:NumRules
if k1==k2
Theta32(k1,k2) = ((S_2-Out2(k2))./denom).*e3(k2);
else
Theta32(k1,k2) = -(Out2(k2)./denom).*e3(k2);
end
end
end
end

e2 = sum(Theta32,2);

%层一
Q = zeros(Number_signal_in,Number_Fuzzy_rules,NumRules);
for i=1:Number_signal_in
for j=1:Number_Fuzzy_rules
for k=1:NumRules
if Out1(i,j)== precond(k,i) && Out1(i,j)~=0
Q(i,j,k) = (Out2(k)./Out1(i,j)).*e2(k);
else
Q(i,j,k) = 0;
end
end
end
end

Theta21 = sum(Q,3);

%自适应参数调整
if isempty(find(In1==mean1))

deltamean1 = Theta21.*(2*b1./(In1-mean1)).*Out1.*(1-Out1);
deltab1 = Theta21.*(-2).*log(abs((In1-mean1)./sigma1)).*Out1.*(1-Out1);
deltasigma1 = Theta21.*(2*b1./sigma1).*Out1.*(1-Out1);
dmean1 = Learn_rate*deltamean1 + coff*dmean1;
mean1 = mean1 + dmean1;
dsigma1 = Learn_rate*deltasigma1 + coff*dsigma1;
sigma1 = sigma1 + dsigma1;
db1 = Learn_rate*deltab1 + coff*db1;
b1 = b1 + db1;

for i=1:Number_Fuzzy_rules-1
if ~isempty(find(mean1(:,i)>mean1(:,i+1)))
for i=1:Number_signal_in
[mean1(i,:) index1] = sort(mean1(i,:));
sigma1(i,:) = sigma1(i,index1);
b1(i,:) = b1(i,index1);
end
end
end

end

out=Xt;

%S函数的第三步,定义各个网络层的数据转换
elseif flag == 3
Feedfor_phase;
%定义整个模糊神经网络的各个层的数据状态
%第一层
x = u(1:Number_inport);
In1 = x*ones(1,Number_Fuzzy_rules);%第一层的输入
Out1 = 1./(1 + (abs((In1-mean1)./sigma1)).^(2*b1));%第一层的输出,这里,这个神经网络的输入输出函数可以修改
%第一层
precond = Out1\';
Out2 = prod(Out1)\';
S_2 = sum(Out2);%计算和
%第三层
if S_2~=0
Out3 = Out2\'./S_2;
else
Out3 = zeros(1,NumRules);%为了在模糊控制的时候方便系统的运算,需要对系统进行归一化处理
end
%第四层
Aux1 = [x; 1]*Out3;
a = reshape(Aux1,(Number_signal_in+1)*NumRules,1);%控制输出
%第五层,最后结果输出
outact = a\'*ThetaL4;
%最后的出处结果
out = [outact;Xt];
else
out = [];
end
A05-04

 

以上是关于模糊神经网络控制器的S函数设计的主要内容,如果未能解决你的问题,请参考以下文章

并联型模糊PID复合控制器的simulink建模与仿真

模糊控制——理论基础(2隶属函数)

模糊神经网络基于matlab的模糊神经网络仿真

模糊控制器基于simulink的模糊控制器设计

加了模糊控制器,仿真速度很慢,怎么解决?

精品课设经典PID与模糊PID控制的对比与分析