如何得到模糊控制离线控制表?手算和Matlab

3 minute read

手算

这里用的模糊逻辑表是模糊PID中P的表

  1. 先摆上我的隶属度表
状态变量量化等级-4-3-2-101234
NB00000000.51
NM000000.210.20
NS00000.110.400
ZO0000.210.2000
PS000.410.10000
PM00.210.200000
PB10.50000000
  1. 计算过程看下面的图吧。
    • 计算的法则,两个值交取最小,两个值并取最大。
    • 图中产生的4条模糊规则,但是实际只有两个结果,PB和PM,则两个PB取并集,两个PM取并集。得到两个对应值。 计算过程

Matlab计算

  1. 在命令行输入fuzzy打开模糊工具箱,设置两个输入。 fuzzytool

  2. 配置隶属度函数,我这里是三个隶属度函数都一样。然后导出。我导出的是P.fis。 隶属度函数

  3. 打开simulink,构建以下的系统。如果模块的名字不知道可以下面的两张图片,图标下面有名字。 system 双击模糊控制模块来选择模糊工具箱生成的规则。填写路径。 fuzzylogic 利用Zero-order-hold来达到离散化的效果。如果在输入的数据里(如下面的Excel截图),设置信号改变的频率是1Hz,那上面的Zero-order-hold的Simpletime是EC的量化等级的数量,下面的Zero-order-hold的Simpletime为1。 Hold Hold

  4. 在Simulink内打开Testmanger。选择需要测试的系统,根据数据长度选择测试的时长。并导入数据。导入数据后要Map通过才行。 Model data

  5. 点Run开始测试模型,一瞬间就就计算完了。 计算结果 输入的数据

  6. 右键P/output,导出到工作区。使用下面这段代码就可以导出成Excel。代码需要根据你的量化等级数量修改

     1U = [];
     2for i = 1:81 % count of all cell in the table
     3U(i) = getdatasamples(tableP,i); % tableP: 导出的数据
     4end
     5E = -4:1:4;
     6data=[];
     7data(:,1) = E';
     8for i = 1:9 % 9是Ec的数量
     9data(i,2:10) = round(U(1+9*(i-1):9*i)); % 2:10 excel的行单元格
    10%data(i,2:10) = U(1+9*(i-1):9*i); %直接输出浮点型
    11end
    12[m, n] = size(data);
    13data_cell = num2cell(data);
    14title = {'E\EC','-4', '-3', '-2', '-1','0', '1', '2', '3', '4'};% universe
    15result = [title; data_cell];
    16s = xlswrite('Fuzzy_P.xlsx', result);
    

    output

  7. 完成了