home Forums Feature Requests Add Center of Gravity Defuzzification Method Reply To: Add Center of Gravity Defuzzification Method


Hi Aaron,

I am sorry that your posts were marked as spam by wordpress, and hence not shown. Thank you for emailing me.

For completeness, I will elaborate on your issue.

The problem in your controller is the usage of Constant terms in the output variable for Off and Full. The centroid defuzzifier integrates over the terms in the output variable, and the integration over the constant terms is just not supported by this defuzzifier. The people from National must be doing some very specific handling of this case of integration over.

The solution I proposed to you (see at the end of post) substitutes the constant terms by integrative Triangle terms at the locations where you want them (0 and 100), which makes me extend the range of the output variable a bit more to integrate over the terms. In addition, I have increased the resolution of the defuzzifier for better accuracy.

Personally, I do not like my solution much. In the short term, I would avoid using the Engine::process() method to process the engine, and do it manually instead. You can look at the logic inside this method, and add the exceptions to turn the engine off and full if the corresponding memberships are activated.

In the long term, I want to improve the fuzzy consequents to override defuzzification. For example, if x is a then z is 0.9.

Lastly, I am sorry I did not see your messages being marked as spam. I would have elaborated on your case then.

Kindly let me know if this is of any help, or if you found a better solution.


Engine: TestController
InputVariable: TestInputVar
  enabled: true
  range: 0.000 549.999
  lock-range: false
  term: AtSetpoint PiShape 298.000 299.000 301.000 302.000
  term: VeryLow Trapezoid 0.000 0.000 260.000 300.000
  term: VeryHigh Trapezoid 300.000 305.000 550.000 550.000
  term: Low PiShape 260.000 300.000 300.000 300.000
  term: High PiShape 300.000 300.000 300.000 305.000
OutputVariable: TestOutputVar
  enabled: true
  range: -5.000 105.000
  lock-range: false
  aggregation: Maximum
  defuzzifier: Centroid 1000
  default: nan
  lock-previous: false
  term: Off Triangle -1.000 0.000 1.000
  term: Low PiShape 0.000 5.000 25.000 30.000
  term: Medium PiShape 10.000 15.000 30.000 35.000
  term: High PiShape 15.000 20.000 40.000 45.000
  term: Full Triangle 99.000 100.000 101.000
RuleBlock: mamdani
  enabled: true
  conjunction: Minimum
  disjunction: Maximum
  implication: Minimum
  activation: General
  rule: if TestInputVar is AtSetpoint then TestOutputVar is Medium
  rule: if TestInputVar is VeryLow then TestOutputVar is Full
  rule: if TestInputVar is VeryHigh then TestOutputVar is Off
  rule: if TestInputVar is Low then TestOutputVar is High
  rule: if TestInputVar is High then TestOutputVar is Low