MATLAB水箱液位模糊控制仿真程序

MATLAB水箱液位模糊控制仿真程序

题目

以水位的模糊控制为例,设有一个水箱,通过调节阀门可向内注水和向外抽水,设计一个模糊控制器,通过调节阀门将水位稳定在固定点附近,按照日常的操作经验,可以得到基本的控制规则为:
“若水位高于O点,则向外排水,差值越大,排水越快”;
“若水位低于O点,则向内注水,差值越大,注水越快”
在这里插入图片描述实验内容:

  1. 选择液位差为e,分为5个模糊集:NB:负大 NS:负小 Z:零 PS:正小 PB:正大,将偏差e的变化分为7个等级:-3,-2,-1,0,1,2,3
  2. 控制量u:分为5个模糊集:NB:负大 NS:负小 Z:零 PS:正小 PB:正大,将偏差e的变化分为7个等级:-4,-3,-2,-1,0,1,2,3,4
  3. 水位变化e划分表:
    在这里插入图片描述
  4. 模糊规则的描述
    若e负大,则u负大
    若e负小,则u负小
    若e为零,则u为零
    若e正小,则u正小
    若e正大,则u正大
  5. 求迷糊关系
  6. 模糊决策
  7. 控制量的反模糊化
    模糊控制响应表
    在这里插入图片描述

完整代码

clear all;
close all;
a=newfis('fuzz-tank');%创建一个模糊推理系统(FIS%水位变化e划分,NB:负大 NS:负小 Z:PS:正小 PB:正大
a=addvar(a,'input','e',[-3,3]);%向模糊推理系统中添加语言变量
a=addmf(a,'input',1,'NB','zmf',[-3,-1]); %Z形隶属函数
a=addmf(a,'input',1,'NS','trimf',[-3,-1,1]);%三角形隶属函数
a=addmf(a,'input',1,'Z','trimf',[-2,0,2]);
a=addmf(a,'input',1,'PS','trimf',[-1,1,3]);
a=addmf(a,'input',1,'PB','smf',[1,3]);%S形隶属函数
%控制量u变化划分,NB:负大 NS:负小 Z:PS:正小 PB:正大
a=addvar(a,'output','u',[-4,4]);
a=addmf(a,'output',1,'NB','zmf',[-4,-1]);
a=addmf(a,'output',1,'NS','trimf',[-4,-2,1]);
a=addmf(a,'output',1,'Z','trimf',[-2,0,2]);
a=addmf(a,'output',1,'PS','trimf',[-1,2,4]);
a=addmf(a,'output',1,'PB','smf',[1,4]);
%模糊规则
%若e负大,则u负大
%若e负小,则u负小
%若e为零,则u为零
%若e正小,则u正小
%若e正大,则u正大
rulelist=[1 1 1 1;2 2 1 1;3 3 1 1;4 4 1 1;5 5 1 1];
a=addrule(a,rulelist);
a1=setfis(a,'DefuzzMethod','mom');%将DefuzzMethod属性设置为mom
writefis(a1,'tank');%保存文件到磁盘上
a2=readfis('tank');%读取模糊控制系统

figure(1);
plotfis(a2);%绘制FIS系统结构
figure(2);
plotmf(a,'input',1);
figure(3);
plotmf(a,'output',1);

flag=1;
if flag==1
    showrule(a);
    ruleview('tank');
end
disp('------------------------------------------------------');
disp('     fuzzy controller table:e=[-3,+3],u=[-4,+4]       ');
disp('------------------------------------------------------');
for i=1:1:7
    e(i)=i-4;
    Ulist(i)=evalfis([e(i)],a2);
end
Ulist=round(Ulist)%取整
e=-3;
u=evalfis([e],a2)

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
可以在input里面输入数字或者拉动红色的线随意选择e值
e=-1
在这里插入图片描述e=3
在这里插入图片描述

  • 42
    点赞
  • 292
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
您好!很高兴能帮助您。下面是一个基于Matlab模糊控制水箱位的仿真程序示例: ```matlab % 模糊控制水箱仿真程序 % 清空工作区变量 clear; clc; % 设定模糊控制器参数 P = 1; % Proportional(比例)参数 I = 0.5; % Integral(积分)参数 % 设定仿真时间和步长 t_end = 10; % 仿真结束时间 dt = 0.01; % 步长 % 初始化变量 e = 0; % 偏差(位误差) e_integral = 0; % 偏差的积分 e_previous = 0; % 上一次的偏差 % 仿真循环 for t = 0:dt:t_end % 获取当前位(可以根据实际情况进行修改) liquid_level = getLiquidLevel(); % 自定义函数,获取当前位 % 计算偏差 e = desired_level - liquid_level; % 更新偏差的积分 e_integral = e_integral + e * dt; % 计算模糊控制器输出(模糊推理和输出解模糊) u = fuzzyController(e, e_integral, e_previous); % 更新上一次的偏差 e_previous = e; % 执行控制动作(可以根据实际情况进行修改) performControlAction(u); % 自定义函数,执行控制动作 % 显示仿真结果(可以根据实际情况进行修改) displaySimulationResult(t, liquid_level, u); % 自定义函数,显示仿真结果 end ``` 请注意,上述代码中的 `getLiquidLevel`、`fuzzyController`、`performControlAction` 和 `displaySimulationResult` 都是自定义函数,您需要根据实际情况进行替换和实现。这些函数负责获取当前位、进行模糊控制计算、执行控制动作和显示仿真结果。 希望这个示例能对您有所帮助!如有进一步问题,请随时提问。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

猫头丁

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

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

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

打赏作者

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

抵扣说明:

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

余额充值