gusucode.com > 模糊控制工具箱 fuzzy logic toolbox源码程序 > fuzzy/fuzzy/genfis1.m

    function fis = genfis1(data, numMFs, inmftype, outmftype)
%GENFIS1 Generates an initial Sugeno-type FIS for ANFIS training using a grid
%        partition.
%
%   FIS = GENFIS1(DATA) generates a single-output Sugeno-type fuzzy inference
%   system (FIS) using a grid  partition on the data (no clustering). FIS is
%   used to provide initial conditions for ANFIS training. DATA is a matrix with
%   N+1 columns where the first N columns contain data for each FIS input, and
%   the last column contains the output data. By default, GENFIS1 uses two
%   'gbellmf' type membership functions for each input. Each rule generated by
%   GENFIS1 has one output membership function, which is of type 'linear' by
%   default.
%
%   FIS = GENFIS1(DATA, NUMMFS, INPUTMF, OUTPUTMF) explicitly specifies:
%     * NUMMFS   number of membership functions per input. A scalar value,
%                specifies the same number for all inputs and a vector value
%                specifies the number for each input individually.
%     * INPUTMF  type of membership function for each input. A single string
%                specifies the same type for all inputs, a string array
%                specifies the type for each input individually.
%     * OUTPUTMF output membership function type, either 'linear' or 'constant'
%
%   Example
%       data = [rand(10,1) 10*rand(10,1)-5 rand(10,1)];
%       fis = genfis1(data,[3 7],char('pimf','trimf'));
%       [x,mf] = plotmf(fis,'input',1);
%       subplot(2,1,1), plot(x,mf);
%       xlabel('input 1 (pimf)');
%       [x,mf] = plotmf(fis,'input',2);
%       subplot(2,1,2), plot(x,mf);
%       xlabel('input 2 (trimf)');
%
%   See also GENFIS2, ANFIS.

%   Roger Jang, 8-7-94, Kelly Liu 7-30-96, N. Hickey 04-16-01
%   Copyright 1994-2005 The MathWorks, Inc.
%   $Revision: 1.32.2.2 $  $Date: 2005/06/27 22:36:52 $

% Change this to have different default values
default_mf_n = 2;
default_mf_type = 'gbellmf';
default_output_type = 'linear';

if nargin <= 3,
	outmftype = default_output_type;
end
if nargin <= 2,
	inmftype = default_mf_type;
end
if nargin <= 1,
	numMFs = default_mf_n;
end

% get dimension info
data_n = size(data, 1);
in_n = size(data, 2) - 1;

% error checking
 if length(numMFs)==1,
   numMFs=numMFs*ones(1, in_n);
 end

% Check arguments defining system inputs
if length(numMFs) ~= in_n | (size(inmftype, 1) ~=1 & size(inmftype, 1) ~= in_n),
	error('Wrong size(s) of argument(s) defining system input(s)!');
end
% Check argument defining system output
if size(outmftype,1) ~= 1
	error('Argument data entered may only have one output!');
end
if (strcmp(outmftype,'linear') | strcmp(outmftype,'constant')) ~= 1
    error('Output membership function type must be either linear or constant!');
end

if size(inmftype, 1) ==1 &  in_n>1
   for i=2:in_n
      inmftype(i,:)=inmftype(1,:);
   end
end

rule_n = prod(numMFs);

fis.name = 'anfis';
fis.type = 'sugeno';

fis.andMethod = 'prod';
fis.orMethod = 'max';
fis.defuzzMethod = 'wtaver';
fis.impMethod = 'prod';
fis.aggMethod = 'max';

range = [min(data)' max(data)'];
in_mf_param = genparam(data, numMFs, inmftype);
k=1;
for i = 1:in_n,
 fis.input(i).name = ['input' num2str(i)];
 fis.input(i).range=range(i,:);
 for j=1:numMFs(i)
  MFType = deblank(inmftype(i, :));
  fis.input(i).mf(j).name = ['in' num2str(i) 'mf' num2str(j)];
  fis.input(i).mf(j).type = MFType;
  if strcmp(MFType,'gaussmf') | strcmp(MFType,'sigmf') ...
                | strcmp(MFType,'smf'),
     fis.input(i).mf(j).params= in_mf_param(k,1:2);
  elseif strcmp(MFType,'trimf') | strcmp(MFType,'gbellmf'),
     fis.input(i).mf(j).params= in_mf_param(k,1:3);
  else
     fis.input(i).mf(j).params= in_mf_param(k,1:4);
  end  
  k=k+1;
 end
end

fis.output(1).name='output';

fis.output(1).range=range(end,:); 
for i = 1:rule_n,
  fis.output(1).mf(i).name=['out1mf', num2str(i)];  
  fis.output(1).mf(i).type=outmftype;
  if strcmp(outmftype, 'linear')
   fis.output(1).mf(i).params=zeros(1, in_n+1);
  else
   fis.output(1).mf(i).params=[0];
  end
end

rule_list = zeros(rule_n, length(numMFs));
for i = 0:rule_n-1,
	tmp = i;
	for j = length(numMFs):-1:1,
		rule_list(i+1, j) = rem(tmp, numMFs(j))+1;
		tmp = fix(tmp/numMFs(j));
	end
end
rule_list = [rule_list (1:rule_n)' ones(rule_n, 1) ones(rule_n, 1)];
fis.rule=[];
fis=setfis(fis, 'rulelist', rule_list);

if length(fis.rule)> 250
    wmsg = sprintf('genfis1 has created a large rulebase in the FIS. \nMATLAB may run out of memory if this FIS is tuned using ANFIS.\n');
    warning(wmsg);
end