4 base
= os
.path
.dirname(__file__
)
5 path
= os
.path
.dirname(base
)
6 path
= os
.path
.dirname(path
)
7 sys
.path
.insert(0, path
)
10 import matplotlib
.pyplot
as plt
11 except Exception as e
:
15 import liba
# type: ignore
26 liba
.new_num([liba
.mf
.TRI
, NL
, NL
, NM
]),
27 liba
.new_num([liba
.mf
.TRI
, NL
, NM
, NS
]),
28 liba
.new_num([liba
.mf
.TRI
, NM
, NS
, ZO
]),
29 liba
.new_num([liba
.mf
.TRI
, NS
, ZO
, PS
]),
30 liba
.new_num([liba
.mf
.TRI
, ZO
, PS
, PM
]),
31 liba
.new_num([liba
.mf
.TRI
, PS
, PM
, PL
]),
32 liba
.new_num([liba
.mf
.TRI
, PM
, PL
, PL
]),
42 liba
.new_num([liba
.mf
.TRI
, NL
, NL
, NM
]),
43 liba
.new_num([liba
.mf
.TRI
, NL
, NM
, NS
]),
44 liba
.new_num([liba
.mf
.TRI
, NM
, NS
, ZO
]),
45 liba
.new_num([liba
.mf
.TRI
, NS
, ZO
, PS
]),
46 liba
.new_num([liba
.mf
.TRI
, ZO
, PS
, PM
]),
47 liba
.new_num([liba
.mf
.TRI
, PS
, PM
, PL
]),
48 liba
.new_num([liba
.mf
.TRI
, PM
, PL
, PL
]),
59 [NL
, NL
, NM
, NM
, NS
, ZO
, ZO
],
60 [NL
, NL
, NM
, NS
, NS
, ZO
, PS
],
61 [NM
, NM
, NM
, NS
, ZO
, PS
, PS
],
62 [NM
, NM
, NS
, ZO
, PS
, PM
, PM
],
63 [NS
, NS
, ZO
, PS
, PS
, PM
, PM
],
64 [NS
, ZO
, PS
, PM
, PM
, PM
, PL
],
65 [ZO
, ZO
, PM
, PM
, PM
, PL
, PL
],
76 [PL
, PL
, PM
, PM
, PS
, ZO
, ZO
],
77 [PL
, PL
, PM
, PS
, PS
, ZO
, ZO
],
78 [PL
, PM
, PS
, PS
, ZO
, NS
, NS
],
79 [PM
, PM
, PS
, ZO
, NS
, NM
, NM
],
80 [PM
, PS
, ZO
, NS
, NS
, NM
, NL
],
81 [ZO
, ZO
, NS
, NS
, NM
, NL
, NL
],
82 [ZO
, ZO
, NS
, NM
, NM
, NL
, NL
],
93 [NS
, PS
, PL
, PL
, PL
, PM
, NS
],
94 [NS
, PS
, PL
, PM
, PM
, PS
, ZO
],
95 [ZO
, PS
, PM
, PM
, PS
, PS
, ZO
],
96 [ZO
, PS
, PS
, PS
, PS
, PS
, ZO
],
97 [ZO
, ZO
, ZO
, ZO
, ZO
, ZO
, ZO
],
98 [NL
, NS
, NS
, NS
, NS
, NS
, NL
],
99 [NL
, NM
, NM
, NM
, NS
, NS
, NL
],
103 def fuzzy(e
: float, ec
: float):
106 for idx
, param
in enumerate(me
):
107 ms
= liba
.mf
.mf(param
[0], e
, param
[1:])
116 for idx
, param
in enumerate(mec
):
117 ms
= liba
.mf
.mf(param
[0], ec
, param
[1:])
129 y
= (e
* ec
) ** 0.5 * (1 - (1 - e
) * (1 - ec
)) ** 0.5
136 for i
in range(len(val_e
)):
137 for j
in range(len(val_ec
)):
138 kp
+= mat
[i
][j
] * mkp
[idx_e
[i
]][idx_ec
[j
]]
141 for i
in range(len(val_e
)):
142 for j
in range(len(val_ec
)):
143 ki
+= mat
[i
][j
] * mki
[idx_e
[i
]][idx_ec
[j
]]
146 for i
in range(len(val_e
)):
147 for j
in range(len(val_ec
)):
148 kd
+= mat
[i
][j
] * mkd
[idx_e
[i
]][idx_ec
[j
]]
158 data
= np
.arange(0, 0.2, Ts
)
161 import control
.matlab
as ct
163 sysc
= ct
.tf(133, [1, 25, 0])
164 sysd
= ct
.c2d(sysc
, Ts
)
167 [[num
]], [[den
]] = ct
.tfdata(sysd
)
168 except ModuleNotFoundError
:
169 num
= [6.59492796e-05, 6.54019884e-05]
170 den
= [1.0, -1.97530991, 0.97530991]
171 except Exception as e
:
177 tf
= liba
.tf(num
, den
[1:])
180 .set_opr(liba
.pid_fuzzy
.CAP_ALGEBRA
)
181 .set_rule(me
, mec
, mkp
, mki
, mkd
)
184 pid_fuzzy
.outmax
= MAX
185 pid_fuzzy
.outmin
= MIN
188 setpoint
= [r
] * len(data
)
190 title
= "Fuzzy Proportional Integral Derivative"
196 pid_fuzzy
.set_kpid(kp
, ki
, kd
)
198 y
= pid_fuzzy
.inc(r
, y
)
215 x
[2] = e
[0] - e
[1] * 2 + e
[2]
216 dkp
, dki
, dkd
= fuzzy(e
[0], e
[0] - e
[1])
217 u
+= (kp
+ dkp
) * x
[0] + (ki
+ dki
) * x
[1] + (kd
+ dkd
) * x
[2]
230 plt
.plot(data
, setpoint
, "r-", data
, feedback1
, "b-", data
, feedback2
, "g-")
234 plt
.plot(data
, error1
, "b-", data
, error2
, "g-")
236 plt
.xlabel("time(s)")
238 plt
.savefig(os
.path
.join(base
, "pid_fuzzy.png"))