summaryrefslogtreecommitdiff
path: root/examples/takagi-sugeno/approximation.java
blob: c3d98e17ad49a8824655557766ce617a372c3be5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import com.fuzzylite.*;
import com.fuzzylite.defuzzifier.*;
import com.fuzzylite.factory.*;
import com.fuzzylite.hedge.*;
import com.fuzzylite.imex.*;
import com.fuzzylite.norm.*;
import com.fuzzylite.norm.s.*;
import com.fuzzylite.norm.t.*;
import com.fuzzylite.rule.*;
import com.fuzzylite.term.*;
import com.fuzzylite.variable.*;

public class approximation{
public static void main(String[] args){
Engine engine = new Engine();
engine.setName("approximation of sin(x)/x");

InputVariable inputVariable = new InputVariable();
inputVariable.setEnabled(true);
inputVariable.setName("inputX");
inputVariable.setRange(0.000, 10.000);
inputVariable.addTerm(new Triangle("NEAR_1", 0.000, 1.000, 2.000));
inputVariable.addTerm(new Triangle("NEAR_2", 1.000, 2.000, 3.000));
inputVariable.addTerm(new Triangle("NEAR_3", 2.000, 3.000, 4.000));
inputVariable.addTerm(new Triangle("NEAR_4", 3.000, 4.000, 5.000));
inputVariable.addTerm(new Triangle("NEAR_5", 4.000, 5.000, 6.000));
inputVariable.addTerm(new Triangle("NEAR_6", 5.000, 6.000, 7.000));
inputVariable.addTerm(new Triangle("NEAR_7", 6.000, 7.000, 8.000));
inputVariable.addTerm(new Triangle("NEAR_8", 7.000, 8.000, 9.000));
inputVariable.addTerm(new Triangle("NEAR_9", 8.000, 9.000, 10.000));
engine.addInputVariable(inputVariable);

OutputVariable outputVariable1 = new OutputVariable();
outputVariable1.setEnabled(true);
outputVariable1.setName("outputFx");
outputVariable1.setRange(-1.000, 1.000);
outputVariable1.fuzzyOutput().setAccumulation(null);
outputVariable1.setDefuzzifier(new WeightedAverage("TakagiSugeno"));
outputVariable1.setDefaultValue(Double.NaN);
outputVariable1.setLockPreviousOutputValue(true);
outputVariable1.setLockOutputValueInRange(false);
outputVariable1.addTerm(new Constant("f1", 0.840));
outputVariable1.addTerm(new Constant("f2", 0.450));
outputVariable1.addTerm(new Constant("f3", 0.040));
outputVariable1.addTerm(new Constant("f4", -0.180));
outputVariable1.addTerm(new Constant("f5", -0.190));
outputVariable1.addTerm(new Constant("f6", -0.040));
outputVariable1.addTerm(new Constant("f7", 0.090));
outputVariable1.addTerm(new Constant("f8", 0.120));
outputVariable1.addTerm(new Constant("f9", 0.040));
engine.addOutputVariable(outputVariable1);

OutputVariable outputVariable2 = new OutputVariable();
outputVariable2.setEnabled(true);
outputVariable2.setName("trueFx");
outputVariable2.setRange(-1.000, 1.000);
outputVariable2.fuzzyOutput().setAccumulation(null);
outputVariable2.setDefuzzifier(new WeightedAverage("Automatic"));
outputVariable2.setDefaultValue(Double.NaN);
outputVariable2.setLockPreviousOutputValue(true);
outputVariable2.setLockOutputValueInRange(false);
outputVariable2.addTerm(Function.create("fx", "sin(inputX)/inputX", engine));
engine.addOutputVariable(outputVariable2);

OutputVariable outputVariable3 = new OutputVariable();
outputVariable3.setEnabled(true);
outputVariable3.setName("diffFx");
outputVariable3.setRange(-1.000, 1.000);
outputVariable3.fuzzyOutput().setAccumulation(null);
outputVariable3.setDefuzzifier(new WeightedAverage("Automatic"));
outputVariable3.setDefaultValue(Double.NaN);
outputVariable3.setLockPreviousOutputValue(false);
outputVariable3.setLockOutputValueInRange(false);
outputVariable3.addTerm(Function.create("diff", "fabs(outputFx-trueFx)", engine));
engine.addOutputVariable(outputVariable3);

RuleBlock ruleBlock = new RuleBlock();
ruleBlock.setEnabled(true);
ruleBlock.setName("");
ruleBlock.setConjunction(null);
ruleBlock.setDisjunction(null);
ruleBlock.setActivation(null);
ruleBlock.addRule(Rule.parse("if inputX is NEAR_1 then outputFx is f1", engine));
ruleBlock.addRule(Rule.parse("if inputX is NEAR_2 then outputFx is f2", engine));
ruleBlock.addRule(Rule.parse("if inputX is NEAR_3 then outputFx is f3", engine));
ruleBlock.addRule(Rule.parse("if inputX is NEAR_4 then outputFx is f4", engine));
ruleBlock.addRule(Rule.parse("if inputX is NEAR_5 then outputFx is f5", engine));
ruleBlock.addRule(Rule.parse("if inputX is NEAR_6 then outputFx is f6", engine));
ruleBlock.addRule(Rule.parse("if inputX is NEAR_7 then outputFx is f7", engine));
ruleBlock.addRule(Rule.parse("if inputX is NEAR_8 then outputFx is f8", engine));
ruleBlock.addRule(Rule.parse("if inputX is NEAR_9 then outputFx is f9", engine));
ruleBlock.addRule(Rule.parse("if inputX is any  then trueFx is fx and diffFx is diff", engine));
engine.addRuleBlock(ruleBlock);


}
}