如何得到模糊控制离线控制表?手算和Matlab
手算
这里用的模糊逻辑表是模糊PID中P的表。
- 先摆上我的隶属度表
状态变量量化等级 | -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 |
- 计算过程看下面的图吧。
- 计算的法则,两个值交取最小,两个值并取最大。
- 图中产生的4条模糊规则,但是实际只有两个结果,PB和PM,则两个PB取并集,两个PM取并集。得到两个对应值。
Matlab计算
在命令行输入
fuzzy
打开模糊工具箱,设置两个输入。配置隶属度函数,我这里是三个隶属度函数都一样。然后导出。我导出的是P.fis。
打开simulink,构建以下的系统。如果模块的名字不知道可以下面的两张图片,图标下面有名字。 双击模糊控制模块来选择模糊工具箱生成的规则。填写路径。 利用Zero-order-hold来达到离散化的效果。如果在输入的数据里(如下面的Excel截图),设置信号改变的频率是1Hz,那上面的Zero-order-hold的Simpletime是EC的量化等级的数量,下面的Zero-order-hold的Simpletime为1。
在Simulink内打开Testmanger。选择需要测试的系统,根据数据长度选择测试的时长。并导入数据。导入数据后要Map通过才行。
点Run开始测试模型,一瞬间就就计算完了。
右键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);
完成了