如何在matlab中将模糊控制系统中的规则转化为数值表

    科技2022-07-10  160

    如何在matlab中将模糊控制系统中的规则转化为数值表 第一步首先要建立一个模糊控制器的规则 主要有两种方式 1 直接list清单的方式构建 2 在rule生成器中填写 本文给出了第一种方式的代码如下

    clear all; close all; load list %这个地方是装载一个规则表,具体代码最后会附带! % rulelist=[1 1 1 1; % 2 2 1 1; % 3 3 1 1; % 4 4 1 1; % 5 5 1 1]; a=newfis(‘fuzzpid’);%创建模糊推理系统结构 a = addvar(a,‘input’,‘e’,0.07580[-1,1]); %Parameter eNH,NM,NL,0,PL,PM,PH a = addmf(a,‘input’,1,‘NH’,‘trimf’,[-6,-6,-3]); a = addmf(a,‘input’,1,‘NM’,‘trimf’,[-6,-3,-2]); a =addmf(a,‘input’,1,‘NL’,‘trimf’,[-3,-1,0]); a =addmf(a,‘input’,1,‘ZO’,‘trimf’,[-1,0,1]); a =addmf(a,‘input’,1,‘PL’,‘trimf’,[0,1,3]); a = addmf(a,‘input’,1,‘PM’,‘trimf’,[2,3,6]); a = addmf(a,‘input’,1,‘PH’,‘trimf’,[3,6,6]);

    a=addvar(a,‘input’,‘ec’,0.610[-1,1]); %Parameter ec a = addmf(a,‘input’,2,‘NH’,‘trimf’,[-6,-6,-3]); a = addmf(a,‘input’,2,‘NM’,‘trimf’,[-6,-3,-2]); a =addmf(a,‘input’,2,‘NL’,‘trimf’,[-3,-1,0]); a =addmf(a,‘input’,2,‘ZO’,‘trimf’,[-1,0,1]); a =addmf(a,‘input’,2,‘PL’,‘trimf’,[0,1,3]); a = addmf(a,‘input’,2,‘PM’,‘trimf’,[2,3,6]); a = addmf(a,‘input’,2,‘PH’,‘trimf’,[3,6,6]);

    a = addvar(a,‘output’,’ kp’,[-3,3]); %Parameter kp a = addmf(a,‘output’,1,‘NH’,‘trimf’,[-3,-3,-2]); a = addmf(a,‘output’,1,‘NM’,‘trimf’,[-3,-2,-1]); a =addmf(a,‘output’,1,‘NL’,‘trimf’,[-2,-1,0]); a =addmf(a,‘output’,1,‘ZO’,‘trimf’,[-1,0,1]); a =addmf(a,‘output’,1,‘PL’,‘trimf’,[0,1,2]); a = addmf(a,‘output’,1,‘PM’,‘trimf’,[1,2,3]); a = addmf(a,‘output’,1,‘PH’,‘trimf’,[2,3,3]);

    a = addvar(a,‘output’,‘ki’,[-3,3]); %Parameter ki a = addmf(a,‘output’,2,‘NH’,‘trimf’,[-3,-3,-2]); a = addmf(a,‘output’,2,‘NM’,‘trimf’,[-3,-2,-1]); a =addmf(a,‘output’,2,‘NL’,‘trimf’,[-2,-1,0]); a =addmf(a,‘output’,2,‘ZO’,‘trimf’,[-1,0,1]); a =addmf(a,‘output’,2,‘PL’,‘trimf’,[0,1,2]); a = addmf(a,‘output’,2,‘PM’,‘trimf’,[1,2,3]); a = addmf(a,‘output’,2,‘PH’,‘trimf’,[2,3,3]);

    a = addvar(a,‘output’,‘kd’,[-3,3]); %Parameter kd a = addmf(a,‘output’,3,‘NH’,‘trimf’,[-3,-3,-2]); a = addmf(a,‘output’,3,‘NM’,‘trimf’,[-3,-2,-1]); a =addmf(a,‘output’,3,‘NL’,‘trimf’,[-2,-1,0]); a =addmf(a,‘output’,3,‘ZO’,‘trimf’,[-1,0,1]); a =addmf(a,‘output’,3,‘PL’,‘trimf’,[0,1,2]); a = addmf(a,‘output’,3,‘PM’,‘trimf’,[1,2,3]); a = addmf(a,‘output’,3,‘PH’,‘trimf’,[2,3,3]); rulelist=list; a=addrule(a,rulelist); a=setfis(a,‘DefuzzMethod’,‘centroid’); writefis(a,‘fuzzpid’);

    a=readfis(‘fuzzpid’); figure(1); plotmf(a,‘input’,1); figure(2); plotmf(a,‘input’,2); figure(3); plotmf(a,‘output’,1); figure(4); plotmf(a,‘output’,2); figure(5); plotmf(a,‘output’,3); figure(6); plotfis(a);

    fuzzy fuzzpid; showrule(a) %%附带的7*7的表 7 7 1 7 1 1 1 7 6 1 7 5 1 1 7 5 2 6 7 1 1 7 4 2 6 7 1 1 7 3 3 5 7 1 1 7 2 4 4 6 1 1 7 1 4 4 3 1 1 6 7 1 7 3 1 1 6 6 1 7 5 1 1 6 5 2 6 7 1 1 6 4 3 5 6 1 1 6 3 3 5 6 1 1 6 2 4 4 5 1 1 6 1 5 4 4 1 1 5 7 2 7 4 1 1 5 6 2 6 5 1 1 5 5 2 5 6 1 1 5 4 3 5 6 1 1 5 3 4 4 5 1 1 5 2 5 3 5 1 1 5 1 5 3 4 1 1 4 7 2 6 4 1 1 4 6 2 6 5 1 1 4 5 3 5 5 1 1 4 4 4 4 5 1 1 4 3 5 3 5 1 1 4 2 6 2 5 1 1 4 1 6 2 4 1 1 3 7 3 6 4 1 1 3 6 3 5 4 1 1 3 5 4 4 4 1 1 3 4 5 3 4 1 1 3 3 5 3 4 1 1 3 2 6 2 4 1 1 3 1 7 1 4 1 1 2 7 3 4 1 1 1 2 6 4 4 5 1 1 2 5 5 3 3 1 1 2 4 6 3 3 1 1 2 3 6 2 3 1 1 2 2 6 1 3 1 1 2 1 7 1 1 1 1 1 7 4 4 3 1 1 1 6 4 4 5 1 1 1 5 6 3 7 1 1 1 4 6 2 7 1 1 1 3 6 2 7 1 1 1 2 7 1 6 1 1 1 1 7 1 3 1 1 第二步 建立simulink

    具体的工具就在常用模块就可以找到,在搜索地方打出fuzzy可以得到模糊模块 注意!!!需要对使用readfis函数读取一下之前建立的模糊系统 第三步 在simulink 中通过 Tools -> System Test -> Launch System Test 进入系统测试界面。 进去之后在菜单栏选择 Insert -> Test Element -> Simulink ,选择第二步中建立的模型 fuzzy_model 选择之间建的simulink模型的路径

    之后首先点test vector,选择new新建二个,命名input1和input2, 设置两个输入变量,因为我们是遍历选择需要将所有的模糊区间选到 我这里面是-6到6每次变化1 随后进入测试变量,选择new新建一个outlet 对properties画圈的地方设置输入变量和输出变量,最后点运行,等待一到两分钟就行了。

    最后一步是调取参数表的数据 在command 界面输入: data_biao=stresults.ResultsDataSet.output; temp=zeros(169,1); for i=1:169 temp(i)=data_biao{i}(6); end table_data=reshape(temp,13,13); 这样就可以得到你想要的参数表了 我的例子的参数表如下

    Processed: 0.009, SQL: 8