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

手算

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

  1. 先摆上我的隶属度表
    状态变量\量化等级 -4 -3 -2 -1 0 1 2 3 4
    NB 0 0 0 0 0 0 0 0.5 1
    NM 0 0 0 0 0 0.2 1 0.2 0
    NS 0 0 0 0 0.1 1 0.4 0 0
    ZO 0 0 0 0.2 1 0.2 0 0 0
    PS 0 0 0.4 1 0.1 0 0 0 0
    PM 0 0.2 1 0.2 0 0 0 0 0
    PB 1 0.5 0 0 0 0 0 0 0
  2. 计算过程看下面的图吧。
    • 计算的法则,两个值交取最小,两个值并取最大。
    • 图中产生的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。代码需要根据你的量化等级数量修改

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

    output

  7. 完成了

Last modification:March 30th, 2020 at 05:20 pm