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

目录

一、理论基础

二、核心程序


一、理论基础

        模糊神经网络控制器(Fuzzy Neural Network Controller,FNNC)是一种将模糊逻辑和神经网络相结合的控制方法,用于解决复杂非线性系统的控制问题。它结合了模糊系统的模糊推理能力和神经网络的非线性逼近能力,具有较强的适应性和泛化能力,能够应对各种不确定性和非线性特性。FNNC的原理是将模糊控制和神经网络控制相结合,形成一个统一的控制框架。模糊控制部分负责将输入的模糊化变量映射到一组模糊规则,并进行模糊推理得到模糊的输出。而神经网络部分则将模糊输出映射为真实的控制输出。

FNNC的结构通常包括以下几个主要部分:

  1. 模糊化输入: 将系统的输入变量通过模糊化方法转化为模糊变量,这些模糊变量反映了输入的不确定性和模糊性。

  2. 模糊规则库: 包含一组模糊规则,每个规则表示了输入变量的模糊情况和对应的输出控制量。

  3. 模糊推理引擎: 根据输入变量的模糊值和模糊规则库进行模糊推理,产生模糊输出。

  4. 解模糊: 将模糊输出转化为真实的控制输出,这一步通常使用神经网络来实现。

  5. 神经网络: 用于映射模糊输出到真实的控制输出,神经网络的结构和参数可以通过训练来优化。

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

(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
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
模糊神经网络控制器(Fuzzy Neural Network Controller)是一种基于模糊逻辑和神经网络控制器设计方法。它将模糊逻辑的模糊集合论和神经网络的模式识别能力相结合,可以灵活地适应各种复杂的非线性系统控制问题。 设计模糊神经网络控制器的一般步骤如下: 1. 确定模糊规则库:通过对被控对象进行建模与理解,确定模糊规则库。模糊规则库由一系列模糊规则组成,每个模糊规则表达了输入变量与输出变量之间的映射关系。 2. 确定输入输出变量:根据系统需求,确定输入变量和输出变量。输入变量通常是系统状态、误差等,输出变量通常是控制量。 3. 设计模糊集合:为每个输入变量和输出变量设计模糊集合,模糊集合通过隶属度函数来描述。 4. 确定神经网络结构:选择适当的神经网络结构,在输入层和输出层之间插入隐含层,通常使用前向传播式神经网络。 5. 模糊推理:将输入变量映射到模糊集合中,并根据模糊规则库进行模糊推理,得到模糊输出。 6. 神经网络训练:使用样本数据对神经网络进行训练,调整网络连接权值,使得网络的输出逼近期望输出。 在Matlab中实现模糊神经网络控制器可以使用Fuzzy Logic Toolbox和Neural Network Toolbox。Fuzzy Logic Toolbox提供了用于模糊推理的函数和工具,Neural Network Toolbox提供了用于神经网络的训练和模拟的函数和工具。 首先,使用Fuzzy Logic Toolbox进行模糊推理,它提供了模糊推理函数和相关工具,可以根据模糊规则库和模糊集合对输入变量进行模糊化和模糊推理,得到模糊输出。 然后,使用Neural Network Toolbox进行神经网络的训练和模拟。根据设计好的神经网络结构,使用样本数据进行神经网络的训练,调整网络连接权值,使得网络的输出与期望输出尽可能接近。 最后,可以使用训练好的模糊神经网络控制器进行控制。将系统输入作为神经网络的输入,经过神经网络的运算和模糊推理,得到模糊输出,再根据需要进行解模糊得到最终的控制量。 总之,模糊神经网络控制器设计及其在Matlab中的实现是通过结合模糊逻辑和神经网络的方法来实现非线性系统的控制。在Matlab中,可以使用Fuzzy Logic Toolbox和Neural Network Toolbox提供的函数和工具来实现该控制器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值