fuzzifi.m

来自「FISMAT accommodates different arithmetic」· M 代码 · 共 68 行

M
68
字号
function ms=fuzzifi(set,x)% ms=fuzzifi(set,x)% % Fuzzifisierung der Eingangsgroese x auf die Menge SET.% In jeder Spalte von SET stehen 4 Werte, die die 4 Punkte einer Zugehoerig-% keitsfunktion eindeutig bestimmen. Von oben nach unten sind dies P1...P4.% Moeglich sind Dreicke und Trapeze (offene und geschlossene). % Soll ein Trapez offen sein muss fuer P1=-inf (ganz links liegende Zugeh.% fkt.) bzw. P4=+inf (ganz rechts liegende Zugeh.fkt.) stehen. Ansonsten % stehen die fuer P2 und P3 Zugehoerigkeitswerte von 1 und fuer P1 und P4% Zugehoerigkeitswerte von 0.% ms hat eine Zeile. % In jeder Spalte steht der Zugehoerigkeitswert zu der korresspondierenden% Zugehoerigkeitsfunktion.% Grafische Darstellung des Sets mit den Zugeh.fkt. mit der Routine PLOT_SET% Bsp.: set=[[-inf,-2  ,-1.6,-1  ]  P1  (vier Zugehoerigkeitsfunktionen%            [-2  ,-1.6,-1.2,-0.6]  P2   von links nach rechts)%            [-2  ,-1.6,-1  ,-0.6]  P3%            [0   , 1  ,-0.8,-0.6]] P4  (P1..P4 von links nach rechts)%% FSTB - Fuzzy Systems Toolbox for MATLAB% Copyright (c) 1993-1996 by Olaf Wolkenhauer% Control Systems Centre at UMIST% Manchester M60 1QD, UK%% 8-Feb-1994 [r,c]=size(set); % c = Anzahl der Terme / Zugeh.fkt.lb=set(1,:);   % alle P1. (=untere Intervallgrenze fuer jede Zugeh.fkt.ub=set(r,:);   % alle P4. (=obere Intervallgrenze fuer jede Zugeh.fkt.ms=zeros(1,c); % Ergebnismatrix initialisieren.yset=ones(r,c); yset(1,:)=zeros(1,c); yset(r,:)=zeros(1,c);infs=[find(set==-inf),find(set==inf)];if ~isempty(infs),  yset(infs)=ones(1,length(infs));end;                   % yset enthaelt jetzt die Zugeh.werte 0 und 1                        % fuer alle Punkte.dyset=diff(yset); dset=diff(set);zers=find(dset==0);    % Nullen die Division durch Null erzeugen finden,                       % und durch dummy ersetzen. Korrektur weiter unten.dset(zers)=ones(1,length(zers)); fu=find(ub>=x);        % Feststellung, fuer welche Zugeh.fkt. x im Intervallfl=find(lb<=x);        % liegt.lvu=zeros(1,c); lvl=lvu;lvu(fu)=ones(1,length(fu)); lvl(fl)=ones(1,length(fl));lv=lvu-lvl; lv=abs(lv); % Eine 0 in lv bedeutet, dass x in der dieser                        % Spalte zugeh. Zugeh.fkt. einen Zugeh.wert >0 haty=zeros(3,c);for j=1:c, % Interpolation der Zugeh.keit fuer jede Zugeh.fkt. j zu x(i)  if lv(j)==0,  % x liegt im entsprechenden Intervall.                % lin.Interpol.: y=y0+(x-x0)(y1-y0)/(x1-x0)    y(:,j)=(x.*ones(3,1)-set(1:3,j)).*dyset(:,j)./dset(:,j);    nans=find(isnan(y));       % inf*0 ergibt leider NaN. Gegen 0 ersetzen    y(nans)=zeros(nans);    y(:,j)=yset(1:3,j)+y(:,j); % Rest der Interpolationsformel.  else                         % Zugehoerigkeit = 0.    y(:,j)=zeros(3,1);  end;end;y(zers)=ones(1,length(zers)); % Korrektur um Division zu vermeiden.                               % Zugeh.=inf wird durch 1 ersetzt.ms=min(y);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?