重心法によるクリスプ値の計算

import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
import matplotlib.pyplot as plt
import pdb

credit = ctrl.Antecedent(np.arange(0, 11, 0.1), 'credit')
credit['low'] = fuzz.trimf(credit.universe, [0,2,4])
credit['high'] = fuzz.trimf(credit.universe, [0,5,10])
credit.view()

risk = ctrl.Consequent(np.arange(0, 9, 0.5), 'risk')
risk['low'] = fuzz.trimf(risk.universe, [0, 2, 4])
risk['high'] = fuzz.trimf(risk.universe, [2,4,  6])
risk.view()

rule1 = ctrl.Rule(credit['low'] ,risk['low'])
rule2 = ctrl.Rule(credit['high'] , risk['high'])

risk_assessment_ctrl = ctrl.ControlSystem([rule1,rule2])
risk_assessment = ctrl.ControlSystemSimulation(risk_assessment_ctrl)

# risk_assessment.input['credit'] = 700 
risk_assessment.input['credit'] = 1 
risk_assessment.compute()
risk_result = risk_assessment.output['risk']
print(risk_result)
risk.view(sim=risk_assessment)

plt.show()

f:id:seinzumtode:20211021145859p:plain
解:2.5952879581151826

clear; close all; clc;
syms x;

K = int(1/2*x^2,[0 1])+int(0.5*x, [1 3])+int(-1/2*x^2+2*x,[3 3.6])+ ...
    int(0.2*x, [3.6 5.6])+int(-1/2*x^2+3*x,[5.6 6]);

S = int(1/2*x,[0 1])+0.5*(3-1)+int(-1/2*x+2,[3 4])+ ...
    int(1/2*x-1,[2 2.4])+0.2*(5.6-2.4)+int(-1/2*x+3,[5.6 6])+ ...
   -int(1/2*x-1,[2 2.4])-0.2*(3.6-2.4)-int(-1/2*x+2,[3.6 4]);

%S = int(1/2*x,[0 1])+0.5*(3-1)+int(-1/2*x+2,[3 4])+ ...
%    int(1/2*x-1,[2 2.4])+0.2*(5.6-2.4)+int(-1/2*x+3,[5.6 6])+ ...
%   -int(1/2*x-1,[2 2.4])-0.2*(3.6-2.4)-int(-1/2*x+2,[3.6 4]);
S = int(1/2*x,[0 1])+0.5*2+int(-1/2*x+2,[3 3.6])+ ...
    0.2*2+int(-1/2*x+3,[5.6 6]);    


eval(K/S)

2.5895