模糊控制和T-S模糊控制系统(Matlab代码实现)
Fuzzy Control和T-S方法是控制系统中常见的两种技术,用于处理模糊系统建模和控制设计。这些方法在状态估计和控制领域有着广泛的应用。以下是关于这两种方法的简要介绍和研究方向:1. **模糊控制 (Fuzzy Control)**:- **基本原理**:模糊控制是一种基于模糊逻辑的控制方法,它能够处理非精确、模糊的输入、输出和规则。模糊控制系统包括模糊推理、模糊集合、模糊规则库和模糊推理引
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥1 概述
Fuzzy Control和T-S方法是控制系统中常见的两种技术,用于处理模糊系统建模和控制设计。这些方法在状态估计和控制领域有着广泛的应用。以下是关于这两种方法的简要介绍和研究方向:
1. **模糊控制 (Fuzzy Control)**:
- **基本原理**:模糊控制是一种基于模糊逻辑的控制方法,它能够处理非精确、模糊的输入、输出和规则。模糊控制系统包括模糊推理、模糊集合、模糊规则库和模糊推理引擎等组成部分。
- **应用**:模糊控制常用于处理具有模糊输入和输出的复杂系统,如温度控制、汽车转向控制、空调系统等。
在研究方面,你可以考虑以下问题:
- **模糊系统建模**:研究如何使用模糊集合和模糊规则来描述系统的动态行为,尤其是在非线性和模糊环境中。
- **模糊控制器设计**:探索如何设计有效的模糊控制器来实现系统的目标,例如通过模糊规则的优化和推理引擎的改进。
- **模糊系统与其他控制方法的集成**:研究模糊控制与传统控制方法(如PID控制器)或者机器学习算法(如神经网络)的集成,以提高控制性能和适用性。
2. **T-S模糊系统方法 (Takagi-Sugeno Method)**:
- **基本原理**:T-S模糊系统是一种基于Takagi-Sugeno模型的模糊系统,它将模糊规则应用于线性子系统上,从而实现对非线性系统的建模和控制。
- **应用**:T-S模糊系统常用于系统建模和控制,特别是对于非线性系统,可以通过线性子系统的组合来近似非线性系统的动态特性。
在研究方面,你可以考虑以下问题:
- **T-S模糊系统的建模技术**:研究如何有效地识别和建立T-S模糊系统的模型,包括确定模糊规则、隶属函数和线性子系统。
- **T-S模糊系统的控制设计**:探索如何设计有效的T-S模糊控制器来实现系统的稳定性和性能要求,例如使用线性矩阵不等式(LMI)或其他优化方法进行控制器设计。
- **T-S模糊系统在实际应用中的验证**:研究如何将T-S模糊系统应用于实际控制问题,并评估其在不同环境和条件下的性能表现。
以上是关于模糊控制和T-S模糊系统方法的一些研究方向和问题,你可以根据自己的兴
📚2 运行结果
2.1 模糊控制
clear;clc;close all;
% 观测点数
N = 500;
x = linspace(-2*pi, 2*pi,N );
% 信号
y = 3 * sin(x)+2*cos(x.^2);
% 噪声(方差1.25)
v1 = 0.05*randn(N , 1).*y';
v2 = sqrt(0.5)*randn(N , 1);
v=v1+v2;%噪声信号
z=y'+v;%真实输出信号
d=y';%期望输出信号
P=x;
T=z';
%% 画图
plot(x,y);
hold on;
plot(x,T);
axis([-2*pi 2*pi -6 6]);
legend('y-x曲线','z-x曲线');
xlabel('横坐标 x');
ylabel('纵坐标 y');
figure;
plot(x,v');
axis([-2*pi 2*pi -2 2]);
legend('v-x曲线');
xlabel('横坐标 x');
ylabel('纵坐标 y');
% 数据集设置
[a,b]=dividerand([P;T],0.8,0.2); %训练集+验证集 80%,测试集20%
trainp=a(1,:);
traint=a(2,:);
testp=b(1,:);
testt=b(2,:);
clear;clc;close all;
% 观测点数
N = 500;
x = linspace(-2*pi, 2*pi,N );
% 信号
y = 3 * sin(x)+2*cos(x.^2);
% 噪声(方差1.25)
v1 = 0.05*randn(N , 1).*y';
v2 = sqrt(0.5)*randn(N , 1);
v=v1+v2;%噪声信号
z=y'+v;%真实输出信号
d=y';%期望输出信号
P=x;
T=z';
%% 画图
plot(x,y);
hold on;
plot(x,T);
axis([-2*pi 2*pi -6 6]);
legend('y-x曲线','z-x曲线');
xlabel('横坐标 x');
ylabel('纵坐标 y');
figure;
plot(x,v');
axis([-2*pi 2*pi -2 2]);
legend('v-x曲线');
xlabel('横坐标 x');
ylabel('纵坐标 y');
% 数据集设置
[a,b]=dividerand([P;T],0.8,0.2); %训练集+验证集 80%,测试集20%
trainp=a(1,:);
traint=a(2,:);
testp=b(1,:);
testt=b(2,:);
2.2 T-S模糊系统
clear;clc;
close all;
%数据点个数51
numpts=500;
x1=linspace(-2*pi,2*pi,numpts);
d=3 * sin(x1)+2*cos(x1.^2);
% 噪声(方差1.25)
v1 = 0.05*randn(numpts , 1).*d';
v2 = sqrt(0.5)*randn(numpts , 1);
v=v1+v2;%噪声信号
y=d+v';
data=[x1' y']; %整个数据集
[train,test]=dividerand(data',0.8,0.2);
% trndata=data(1:2:numpts,:); %训练数据集
% chkdata=data(2:2:numpts,:); %测试数据集
trndata=train';
chkdata=test';
%训练数据和检验数据的分布曲线
% plot(trndata(:,1),trndata(:,2),'o',chkdata(:,1),chkdata(:,2),'x')
%建立T_S模糊模型
%采用genfis1()函数直接由训练数据生成模糊推理系统
nummfs=20; %隶属度函数个数
mftype='gbellmf'; %隶属度函数类型 gbellmf钟形隶属度函数
fismat=genfis1(trndata,nummfs,mftype);
% showrule(fismat)
% in = getTunableSettings(fismat)
% 建立 Mamdani模糊系统
% opt1 = genfisOptions('FCMClustering' , 'FISType' , 'mamdani' );
% opt1.NumClusters = 30;
% fis = genfis (x1', y', opt1);
% showrule(fis)
dataRange = [min(data)' max(data)'];
fisin = mamfis;
fisin = addInput(fisin,[-2*pi,2*pi], 'Name' ,'in', 'NumMFs' ,32,'mftype','gaussmf');
fisin = addOutput(fisin,[-6.534905896158901,6.092046113952383], 'Name' ,'out', 'NumMFs' ,64,'mftype','gaussmf');
figure
plotfis(fisin)
% %绘制模糊推理系统的初始隶属度函数
% [x,mf]=plotmf(fismat,'input',1);
% figure
% plot(x,mf);
% title('initial menbership functions')
%使用函数anfis()进行神经模糊建摸
numepochs=100; %训练次数40
opt=anfisOptions("InitialFIS",fismat,"EpochNumber",numepochs,"ErrorGoal",0.005,"InitialStepSize",0.01,"StepSizeDecreaseRate",0.9,"ValidationData",chkdata);
[fismat1,truerr,ss,fismat2,chkerr]=anfis(trndata,opt);
%计算训练后神经模糊系统的输出与训练数据的均方根误差
trnout=evalfis(trndata(:,1),fismat1);
trnrmse=norm(trnout-trndata(:,2))/sqrt(length(trnout));
%使用函数tunefis()调整Mamdani模糊推理模型
% 1学习规则
options = tunefisOptions( 'Method' , 'particleswarm' , ...
'OptimizationType' , 'learning' , ...
'NumMaxRules' ,64);
options.MethodOptions.MaxIterations = 50;
options.UseParallel=true;
% [in,out,rule] = getTunableSettings(fis);
fisout1=tunefis(fisin,[],trndata(:,1),trndata(:,2),options);
figure
plotfis(fisout1)
%2 调整所有参数
[in,out,rule] = getTunableSettings(fisout1);
options.OptimizationType = 'tuning';
options.Method = 'patternsearch';
options.MethodOptions.MaxIterations = 60;
options.MethodOptions.UseCompletePoll = true;
fisout = tunefis(fisout1,[in;out;rule],trndata(:,1),trndata(:,2),options);
figure
plotfis(fisout)
%绘制训练过程中均方根误差的变化情况
epoch=1:numepochs;
figure
plot(epoch,truerr,'o',epoch,chkerr,'x')
hold on
plot(epoch,[truerr,chkerr]);
hold off
title('误差曲线');
legend("训练集误差","验证集误差");
% %绘制训练过程中的步长的变化的情况
% figure
% plot(epoch,ss,'-',epoch,ss,'x');
% title('步长变化曲线')
% %绘制训练后模糊推理系统的输入隶属度函数曲线
% [x,mf]=plotmf(fismat1,'input',1);
% figure
% plot(x,mf)
% title('训练后的输入隶属度函数');
% % %绘制训练后模糊推理系统的输入隶属度函数曲线
% % % figure
% plotmf(fismat1,'output',1);
% title('训练后的输出隶属度函数');
%绘制神经模糊推理系统的输出曲线
pre_y=evalfis(x1,fismat1); %系统辨识
pre_y_1=evalfis(x1,fisout1); %系统辨识
mse1=norm(y-d)/sqrt(length(d));
mse=norm(pre_y-d')/sqrt(length(d'));
mse_mamfis=norm(pre_y_1-d')/sqrt(length(d'));
figure
plot(x1,d,'-r');
hold on;
plot(x1,y,'-b');
hold on;
plot(x1,pre_y_1,'--',"LineWidth",2)
title('系统辨识曲线');
legend("理想系统",sprintf('辨识前的系统:误差%.03f',mse1),sprintf('模糊集合辨识后的系统:误差%.03f',mse_mamfis));
%总曲线
figure
plot(x1,d,'-r');
hold on;
plot(x1,y,'-b');
hold on;
plot(x1,pre_y,'--k',"LineWidth",2)
hold on;
plot(x1,pre_y_1,'--',"LineWidth",2)
title('系统辨识曲线');
legend("理想系统",sprintf('辨识前的系统:误差%.03f',mse1),sprintf('T-S模型辨识后的系统:误差%.03f',mse),sprintf('模糊集合辨识后的系统:误差%.03f',mse_mamfis));
clear;clc;
close all;
%数据点个数51
numpts=500;
x1=linspace(-2*pi,2*pi,numpts);
d=3 * sin(x1)+2*cos(x1.^2);
% 噪声(方差1.25)
v1 = 0.05*randn(numpts , 1).*d';
v2 = sqrt(0.5)*randn(numpts , 1);
v=v1+v2;%噪声信号
y=d+v';
data=[x1' y']; %整个数据集
[train,test]=dividerand(data',0.8,0.2);
% trndata=data(1:2:numpts,:); %训练数据集
% chkdata=data(2:2:numpts,:); %测试数据集
trndata=train';
chkdata=test';
%训练数据和检验数据的分布曲线
% plot(trndata(:,1),trndata(:,2),'o',chkdata(:,1),chkdata(:,2),'x')
%建立T_S模糊模型
%采用genfis1()函数直接由训练数据生成模糊推理系统
nummfs=20; %隶属度函数个数
mftype='gbellmf'; %隶属度函数类型 gbellmf钟形隶属度函数
fismat=genfis1(trndata,nummfs,mftype);
% showrule(fismat)
% in = getTunableSettings(fismat)
% 建立 Mamdani模糊系统
% opt1 = genfisOptions('FCMClustering' , 'FISType' , 'mamdani' );
% opt1.NumClusters = 30;
% fis = genfis (x1', y', opt1);
% showrule(fis)
dataRange = [min(data)' max(data)'];
fisin = mamfis;
fisin = addInput(fisin,[-2*pi,2*pi], 'Name' ,'in', 'NumMFs' ,32,'mftype','gaussmf');
fisin = addOutput(fisin,[-6.534905896158901,6.092046113952383], 'Name' ,'out', 'NumMFs' ,64,'mftype','gaussmf');
figure
plotfis(fisin)
% %绘制模糊推理系统的初始隶属度函数
% [x,mf]=plotmf(fismat,'input',1);
% figure
% plot(x,mf);
% title('initial menbership functions')
%使用函数anfis()进行神经模糊建摸
numepochs=100; %训练次数40
opt=anfisOptions("InitialFIS",fismat,"EpochNumber",numepochs,"ErrorGoal",0.005,"InitialStepSize",0.01,"StepSizeDecreaseRate",0.9,"ValidationData",chkdata);
[fismat1,truerr,ss,fismat2,chkerr]=anfis(trndata,opt);
%计算训练后神经模糊系统的输出与训练数据的均方根误差
trnout=evalfis(trndata(:,1),fismat1);
trnrmse=norm(trnout-trndata(:,2))/sqrt(length(trnout));
%使用函数tunefis()调整Mamdani模糊推理模型
% 1学习规则
options = tunefisOptions( 'Method' , 'particleswarm' , ...
'OptimizationType' , 'learning' , ...
'NumMaxRules' ,64);
options.MethodOptions.MaxIterations = 50;
options.UseParallel=true;
% [in,out,rule] = getTunableSettings(fis);
fisout1=tunefis(fisin,[],trndata(:,1),trndata(:,2),options);
figure
plotfis(fisout1)
%2 调整所有参数
[in,out,rule] = getTunableSettings(fisout1);
options.OptimizationType = 'tuning';
options.Method = 'patternsearch';
options.MethodOptions.MaxIterations = 60;
options.MethodOptions.UseCompletePoll = true;
fisout = tunefis(fisout1,[in;out;rule],trndata(:,1),trndata(:,2),options);
figure
plotfis(fisout)
%绘制训练过程中均方根误差的变化情况
epoch=1:numepochs;
figure
plot(epoch,truerr,'o',epoch,chkerr,'x')
hold on
plot(epoch,[truerr,chkerr]);
hold off
title('误差曲线');
legend("训练集误差","验证集误差");
% %绘制训练过程中的步长的变化的情况
% figure
% plot(epoch,ss,'-',epoch,ss,'x');
% title('步长变化曲线')
% %绘制训练后模糊推理系统的输入隶属度函数曲线
% [x,mf]=plotmf(fismat1,'input',1);
% figure
% plot(x,mf)
% title('训练后的输入隶属度函数');
% % %绘制训练后模糊推理系统的输入隶属度函数曲线
% % % figure
% plotmf(fismat1,'output',1);
% title('训练后的输出隶属度函数');
%绘制神经模糊推理系统的输出曲线
pre_y=evalfis(x1,fismat1); %系统辨识
pre_y_1=evalfis(x1,fisout1); %系统辨识
mse1=norm(y-d)/sqrt(length(d));
mse=norm(pre_y-d')/sqrt(length(d'));
mse_mamfis=norm(pre_y_1-d')/sqrt(length(d'));
figure
plot(x1,d,'-r');
hold on;
plot(x1,y,'-b');
hold on;
plot(x1,pre_y_1,'--',"LineWidth",2)
title('系统辨识曲线');
legend("理想系统",sprintf('辨识前的系统:误差%.03f',mse1),sprintf('模糊集合辨识后的系统:误差%.03f',mse_mamfis));
%总曲线
figure
plot(x1,d,'-r');
hold on;
plot(x1,y,'-b');
hold on;
plot(x1,pre_y,'--k',"LineWidth",2)
hold on;
plot(x1,pre_y_1,'--',"LineWidth",2)
title('系统辨识曲线');
legend("理想系统",sprintf('辨识前的系统:误差%.03f',mse1),sprintf('T-S模型辨识后的系统:误差%.03f',mse),sprintf('模糊集合辨识后的系统:误差%.03f',mse_mamfis));
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。
[1]修智宏,任光.T-S模糊控制系统的稳定性分析及系统化设计[J].自动化学报, 2004, 30(5):11.DOI:CNKI:SUN:MOTO.0.2004-05-010.
[2]李柠,李少远,席裕庚.比例型T-S模糊控制系统稳定性分析与设计[J].控制理论与应用, 2003, 20(4):6.DOI:10.3969/j.issn.1000-8152.2003.04.004.
🌈4 Matlab代码实现
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)