手算

这里用的模糊逻辑表是模糊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
  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。代码需要根据你的量化等级数量修改

    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. 完成了