模糊神经网络控制器(MATLAB)

news2024/10/6 11:26:06

模糊神经网络控制器(Fuzzy Neural Network Controller)是将模糊控制和神经网络相结合的一类控制器。它综合了两者的优点,主要包括以下特点:

知识表达能力强。模糊系统的语言规则和神经网络的学习能力相结合,可以表示复杂的非线性映射关系。

自适应能力强。神经网络提供了在线学习和自适应的能力,可以根据过程的变化自动调整控制器的参数。

控制效果好。模糊推理结合神经网络近似能力,使控制效果优于传统PID控制器。

结构灵活。如T-S型、并行型等多种网络结构,可以根据实际需要选择。

模糊神经网络控制器的设计过程包括:确定输入输出变量、构建模糊控制规则、选择网络结构、确定学习算法以及仿真验证。应用领域十分广泛,如电机控制、机器人控制、化工过程控制等,特别适合对象复杂、模型难以建立的场合。

总体而言,模糊神经网络控制器集两种智能方法之长,是一种性能优异的现代控制策略。

MATLAB代码:

%% 模糊神经网络控制器主程序

% 清空MATLAB环境

clear all;%清除变量

close all;clc;%清空命令窗口

%% --(1)设置参数开始--

InputNumber = 2;%输入变量的数量

FuzzyPartitionNumber = 7;%模糊论域划分数量的设置

RuleNum = 49;%规则数量的设置

ProportionSum = 0;

[c1,b1,w1]=IniFuzzyNN(InputNumber,FuzzyPartitionNumber,RuleNum);%% 初始化模糊神经网络参数

x_input = [0;

    0]; % 神经网络输入初始化

myts=80e-6;%采样间隔

mynum=[500 1];%控制对象传递函数分子

myden=[10,20,5000];%控制对象传递函数分母

mysys=tf(mynum ,myden);

dsys=c2d(mysys,myts,'z');%把传递函数转换为离散状态空间

[mynum myden] = tfdata(dsys,'v');

N=5000;%采样点数

%输入信号为单位阶跃

rin=zeros(N,1);

for gen=1:1:N

    if gen>100

        rin(gen)=1.0;

    end

end

%模糊神经网络控制器的量化因子设置

Ke = 0.8;

Kec = 1e-4;

Ka = 3.5;%比例因子的设置

Kb = 6200;%积分因子的设置

%% 模糊神经网络控制器的控制量参数初始化

error_1 = rin(1);%误差初始化

%输出初始化

y_1=0;

y_2=0;

y_3=0;

%控制论初始化

u_1=0;

u_2=0;

u_3=0;

%% 模糊神经网络控制器的相关参数矩阵初始化

FuzzyBPnet=zeros(InputNumber,FuzzyPartitionNumber);

fuzzyData2=zeros(InputNumber,FuzzyPartitionNumber);

fuzzyData4=zeros(InputNumber,FuzzyPartitionNumber);

ecdata=zeros(N,1);

times=zeros(N,1);

yout=zeros(N,1);

errorData=zeros(N,1);

dError=zeros(N,1);

eData=zeros(N,1);

u=zeros(N,1);

for gen=1:1:N

    times(gen)=gen*myts;

    yout(gen)=-myden(2)*y_1-myden(3)*y_2+mynum(2)*u_1+mynum(3)*u_2;%二阶系统输出计算

    errorData(gen)=rin(gen)-yout(gen);%计算系统误差

    dError(gen) = (errorData(gen)-error_1)/myts;%系统误差变化

    eData(gen) = Ke*errorData(gen);%输入变量模糊化:液位差

    ecdata(gen) = Kec*dError(gen);%输入变量模糊化:液位差变化率

    %% 模糊控制输入变量范围限制

    % 液位差

    limite = 2;

    if eData(gen)>limite

        eData(gen)=limite;

    elseif eData(gen)<-limite

        eData(gen)=-limite;

    end

    % 液位差变化率

    limitec = 2;

    if ecdata(gen)>limitec

        ecdata(gen)=limitec;

    elseif ecdata(gen)<-limitec

        ecdata(gen)=-limitec;

    end

    %% 第1层输入层:模糊神经网络节点输入:液位差e,液位差变化率ec

    x_input(1) = eData(gen);

    x_input(2) = ecdata(gen);

    fuzzydata1 = x_input;

    %% 开始第2层模糊化层:进行模糊划分

    for i=1:1:InputNumber

        for j = 1:1:FuzzyPartitionNumber

            FuzzyBPnet(i,j) = -(fuzzydata1(i)-c1(i,j))^2/(2*b1(i,j)^2);

            fuzzyData2(i,j) = exp(FuzzyBPnet(i,j));

        end

    end

    for j = 1:1:FuzzyPartitionNumber% 提取模糊化层各节点的输出

        m1(j) = fuzzyData2(1,j);

        m2(j) = fuzzyData2(2,j);

    end

    %% 第3层推理层:模糊推理过程

    for i = 1:1:FuzzyPartitionNumber

        for j = 1:1:FuzzyPartitionNumber

            fuzzyData4(i,j) = m1(i)*m2(j);

        end

    end

    fuzzyData3 = [fuzzyData4(1,:),fuzzyData4(2,:),fuzzyData4(3,:),fuzzyData4(4,:),fuzzyData4(5,:),fuzzyData4(6,:),fuzzyData4(7,:)]; %对规则层各节点输出

    %% 第4层是归一化层:对变量进行归一化计算

    fall_sum = 0;

    for i = 1:1:RuleNum

        fall_sum = fall_sum+fuzzyData3(i);

    end

    % 归一化层节点输出

    f4 = fuzzyData3/fall_sum;

    NormalizationOutput(gen) = w1'*fuzzyData3';

    %% 第5层输出层:对模糊控制输出进行清晰化

    ProportionSum = ProportionSum+NormalizationOutput(gen)*myts;

    u(gen) = Ka*NormalizationOutput (gen)+ Kb*ProportionSum ;

    %控制器的输出范围限制

    limitu=15.5;

    if u(gen)>limitu

        u(gen)=limitu;

    elseif u(gen)<-limitu

        u(gen)=-limitu;

    end

    %% 更新 输出量和控制量,注意是二阶系统

    u_3=u_2;

    u_2=u_1;

    u_1=u(gen);

    y_3=y_2;

    y_2=y_1;

    y_1=yout(gen);

    error_2 = error_1;

    error_1=errorData(gen);

end

%% 绘制仿真图

figure

plot(times,yout,'r');

hold on;

plot(times,rin,'b');

legend('输出值','控制值');

xlabel('时间');

ylabel('响应');

title('模糊神经网络控制器对双容水箱的的阶跃相应曲线');

figure

plot(times,eData,'blue',times,ecdata,'r');

legend('e','ec');

legend('液位差','液位差变化率');

xlabel('时间');

ylabel('响应');

title('模糊神经网络控制器对双容水箱的的阶跃相应曲线');

程序结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1428273.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL进阶之锁(全局锁以及备份报错解决)

锁 全局锁 全局锁就是对整个数据库实例加锁&#xff0c;加锁后整个实例就处于只读状态&#xff0c;后续的DML的写语句&#xff0c;DDL语 句&#xff0c;已经更新操作的事务提交语句都将被阻塞。 其典型的使用场景是做全库的逻辑备份&#xff0c;对所有的表进行锁定&#xff…

go数据格式-JSON、XML、MSGPack

1. JSON json是完全独立于语言的文本格式&#xff0c;是k-v的形式 name:zs应用场景&#xff1a;前后端交互&#xff0c;系统间数据交互 json使用go语言内置的encoding/json 标准库编码json使用json.Marshal()函数可以对一组数据进行JSON格式的编码 func Marshal(v interface{}…

springboot与springcloud之间的版本对应关系

https://start.spring.io/actuator/info 当然&#xff0c;你可以直接在&#xff1a; https://spring.io/projects/spring-cloud 上看文档查询&#xff0c; 不过&#xff0c;最后应该是调到这里的&#xff1a; https://github.com/spring-cloud/spring-cloud-release/wiki/Suppo…

YoloV8改进策略:Block改进|DCNv4最新实践|高效涨点|完整论文翻译

摘要 涨点效果:在我自己的数据集上,mAP50 由0.986涨到了0.991,mAP50-95由0.737涨到0.753,涨点明显! DCNv4是可变形卷积的第四版,速度和v3相比有了大幅度的提升,但是环境搭建有一定的难度,对新手不太友好。如果在使用过程遇到编译的问题,请严格按照我写的环境配置。…

代码随想录算法训练营DAY10 | 栈与队列 (1)

理论基础及Java实现参考文章&#xff1a;栈和队列 一、LeetCode 232 用栈实现队列 题目链接&#xff1a;232.用栈实现队列https://leetcode.cn/problems/implement-queue-using-stacks/ 思路&#xff1a;使用两个栈stack1、stack2实现队列&#xff1b;stack1用来存储入队元素&…

幻兽帕鲁社区服务器搭建架设开服教程(LINUX)

幻兽帕鲁社区服务器搭建架设开服教程&#xff08;LINUX&#xff09; 大家好我是艾西&#xff0c;上一期我给大家分享了windows系统版本的幻兽帕鲁服务器搭建教程。因为幻兽帕鲁这游戏对于服务器的配置有一定的要求很多小伙伴就思考用linux系统搭建的话占用会不会小一点&#x…

从零搭建Vue3 + Typescript + Pinia + Vite + Tailwind CSS + Element Plus开发脚手架

项目代码以上传至码云&#xff0c;项目地址&#xff1a;https://gitee.com/breezefaith/vue-ts-scaffold 文章目录 前言脚手架技术栈简介vue3TypeScriptPiniaTailwind CSSElement Plusvite 详细步骤Node.js安装创建以 typescript 开发的vue3工程集成Pinia安装pinia修改main.ts创…

二叉搜索树,力扣

目录 题目地址&#xff1a; 题目&#xff1a; 我们直接看题解吧&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 代码补充说明&#xff1a; 代码实现(中序遍历)&#xff1a; 题目地址&#xff1a; 98. 验证二叉搜索树 - 力扣&#xff08;LeetCod…

CSS 星空按钮

<template><button class="btn" type="button"><strong>星空按钮</strong><div id="container-stars"><div id="stars"></div></div><div id="glow"><div class=…

怎么控制Element的数据树形表格展开所有行;递归操作,打造万能数据表格折叠。

HTML <el-button type"success" size"small" click"expandStatusFun"> <span v-show"expandStatusfalse"><i class"el-icon-folder-opened"></i>展开全部</span><span v-show"expan…

解决nvm切换node版本后原先npm全局安装(npm i -g)的包无法使用

找到node14版本下的node_global文件夹&#xff0c;复制文件夹路径&#xff0c;然后点击环境变量、系统编辑&#xff0c;点击path、点击编辑 在终端输入npm config set prefix “E:\devSoft\git\nvm\v14.18.3\node_global”&#xff0c;其中E:\devSoft\git\nvm\v14.18.3\node_g…

【软件工程】建模工具之开发各阶段绘图——UML2.0常用图实践技巧(功能用例图、静态类图、动态序列图状态图活动图)

更多示例图片可以参考&#xff1a;&#xff08;除了常见的流程图&#xff0c;其他都有&#xff09; 概念&#xff1a;类图 静态&#xff1a;用例图 动态&#xff1a;顺序图&状态图&活动图 1、【面向对象】UML类图、用例图、顺序图、活动图、状态图、通信图、构件图、部…

2024年美赛 (D题ICM)| 湖流网络水位控制 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看美赛的D题&#xff01; 完整内容可以在文章末尾领…

网络原理-TCP/IP(4)

TCP原理 滑动窗口 之前我们讲过了确认应答策略,对发送的每一个数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段. 确认应答,超时重传,连接管理这样的特性都是为了保证可靠运输,但就是付出了传输效率(单位时间能传输数据的多少)的代价,因为确认应答机制导致了时间大…

hivesql的基础知识点

目录 一、各数据类型的基础知识点 1.1 数值类型 整数 小数 float double(常用) decimal(针对高精度) 1.2 日期类型 date datetime timestamp time year 1.3 字符串类型 char varchar / varchar2 blob /text tinyblob / tinytext mediumblob / mediumtext lon…

字符串的简单处理

第1题 ISBN号码 查看测评数据信息 每一本正式出版的图书都有一个ISBN号码与之对应&#xff0c;ISBN码包括9位数字、1位识别码和3位分隔符&#xff0c;其规定格式如“x-xxx-xxxxx-x”&#xff0c;其中符号“-”就是分隔符&#xff08;键盘上的减号&#xff09;&#xff0c;最…

图像超分辨率方法与在线工具

图像超分辨率(Super Resolution, SR)是一种增强图像分辨率的技术&#xff0c;目的是从低分辨率(Low Resolution, LR)图像重建出高分辨率(High Resolution, HR)图像。这项技术在视频增强、卫星图像处理、医学成像等领域有广泛应用。图像超分辨率方法可以分为三大类&#xff1a;插…

Python算法题集_矩阵置零

Python算法题集_矩阵置零 题73&#xff1a;矩阵置零1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【三层循环】2) 改进版一【纵横计数器】3) 改进版二【原地算法】 4. 最优算法 本文为Python算法题集之一的代码示例 题73&#xff1a;矩阵置零…

linux ln命令-linux软链接、硬链接-linux软、硬链接的区别(二):软链接

0、序 上一篇&#xff1a;linux ln命令-linux软链接、硬链接-linux软、硬链接的区别(一)&#xff1a;硬链接 描述了硬链接相关内容&#xff0c;本篇主要描述软链接。 1、软链接 符号链接也称软链接&#xff0c;是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。…

【JS】Express.js环境配置与示例

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Express.js环境配置与示例。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不…