//+++++++++++++++++++++++++++++++++++++++++++++++++++++ // File automatically generated by Xfuzzy - DO NOT EDIT //+++++++++++++++++++++++++++++++++++++++++++++++++++++ package pkg.xfsg.defuz; import xfuzzy.lang.*; public class TakagiSugeno extends DefuzMethod { public TakagiSugeno() { super("xfsg","TakagiSugeno"); Parameter single[] = new Parameter[0]; setSingleParameters(single); } public double compute(AggregateMemFunc mf) { double min = mf.min(); double max = mf.max(); double denom=0; for(int i=0; i<mf.conc.length; i++) denom += mf.conc[i].degree(); if(denom==0) return (min+max)/2; double num=0; for(int i=0; i<mf.conc.length; i++) { double f = mf.conc[i].param(0); for(int j=0; j<mf.input.length; j++) f += mf.conc[i].param(j+1)*mf.input[j]; num += mf.conc[i].degree()*f; } return num/denom; } public boolean test () { return true; } public boolean test(AggregateMemFunc mf) { return true; } public String getJavaCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double denom=0;"+eol; code += " for(int i=0; i<mf.conc.length; i++) denom += mf.conc[i].degree();"+eol; code += " if(denom==0) return (min+max)/2;"+eol; code += " double num=0;"+eol; code += " for(int i=0; i<mf.conc.length; i++) {"+eol; code += " double f = mf.conc[i].param(0);"+eol; code += " for(int j=0; j<mf.input.length; j++) f += mf.conc[i].param(j+1)*mf.input[j];"+eol; code += " num += mf.conc[i].degree()*f;"+eol; code += " }"+eol; code += " return num/denom;"+eol; return code; } public String getCCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double f,num=0,denom=0;"+eol; code += " int i,j;"+eol; code += " for(i=0; i<mf.length; i++) denom += mf.degree[i];"+eol; code += " if(denom==0) return (min+max)/2;"+eol; code += " for(i=0; i<mf.length; i++) {"+eol; code += " f = mf.conc[i].param(0);"+eol; code += " for(j=0; j<mf.inputlength; j++) f += mf.conc[i].param(j+1)*mf.input[j];"+eol; code += " num += mf.degree[i]*f;"+eol; code += " }"+eol; code += " return num/denom;"+eol; return code; } public String getCppCode() { String eol = System.getProperty("line.separator", "\n"); String code = ""; code += " double num=0,denom=0;"+eol; code += " for(int i=0; i<mf.length; i++) {"+eol; code += " double f = mf.conc[i]->param(0);"+eol; code += " for(int j=0; j<mf.inputlength; j++) f += mf.conc[i]->param(j+1)*mf.input[j];"+eol; code += " num += mf.conc[i]->degree()*f;"+eol; code += " denom += mf.conc[i]->degree();"+eol; code += " }"+eol; code += " if(denom==0) return (min+max)/2;"+eol; code += " return num/denom;"+eol; return code; } //+++++++++++++++++++ public void derivative(AggregateMemFunc mf, double derror) { double denom=0; for(int i=0; i<mf.conc.length; i++) denom += mf.conc[i].degree(); if(denom==0) return; double num=0; double f[] = new double[mf.conc.length]; for(int i=0; i<mf.conc.length; i++) { f[i] = mf.conc[i].param(0); for(int j=0; j<mf.input.length; j++) f[i]+=mf.conc[i].param(j+1)*mf.input[j]; num += mf.conc[i].degree()*f[i]; } double y = num/denom; for(int i=0; i<mf.conc.length; i++) { mf.conc[i].setDegreeDeriv(derror*(f[i]-y)/denom); mf.conc[i].setParamDeriv(0,derror*mf.conc[i].degree()/denom); for(int j=0; j<mf.input.length; j++) mf.conc[i].setParamDeriv(j+1,derror*mf.conc[i].degree()*mf.input[j]/denom); } } //+++++++++++++++++++ }