-- FUZZY-LOGIC-CONTROLLED SERVOMECHANISM
-- also simulates a similar linear servo for comparison
---------------------------------------------------------------------------------------------------
-- triangle-function partition
ARRAY X$[1], mb$[1] | -- dummy-argument arrays
SUBMODEL fuzzmemb(N$, X$, mb$, input$)
Vector mb$ = SAT((X$ - input$)/(X$ - X${1}))
mbb = mb$[1] | mcc = mb$[N$ - 1]
Vector mb$ = mb${-1} - mb$
mb$[1] = 1 - mbb | mb$[N$] = mcc
end
---------------------------------------------------------------------------------------------------
-- declare arrays for e, xdot fuzzy-set membership functions
--
N1 = 5
ARRAY xx1[N1] | -- peak locations for e
ARRAY mb1[N1] | -- membership functions for e
--
N2 = 5
ARRAY xx2[N2] | -- peak locations for xdot
ARRAY mb2[N2] | -- membership functions for xdot
--
ARRAY M12[N1, N2] = m12 | -- joint memberships
ARRAY ruletabl[N1 * N2] | -- controller rule table
---------------------------------------------------------------------------------------------------
-- read membership-peak abscissas
emax = 1 | xdotmax = 1
data -2*emax, -0.05 * emax, 0, 0.05 * emax, 2 * emax
data -2*xdotmax, -0.5*xdotmax, 0, 0.5*xdotmax, 2*xdotmax
read xx1,xx2
---------------------------------------------------------------------------------------------------
A = 1.5 | w = 1
B = 300 | maxtrq = 1 | g1 = 10000 | -- servo parameters
g2 = 2 | R = 0.6
k = 0.3500 | r = 2 | -- fuzzy-controller parameters
kk = 10 | rr = 0.1500 | -- linear-controller parameters
---------------------------------------------------------------------------------------------------
-- rule table
data -8*k-8*r, -8*k-r, -8*k, -8*k+r, -8*k+8*r | -- high gain
data -2*k-2*r, -2*k-r, -5*k, -2*k+r, -2*k+2*r | -- for large errors
data -2*r, -0.08*r, 0, 0.08 * r, 2*r | -- … and no damping
data 2*k-2*r, 2*k-r, 5*k, 2*k+r, 2*k+2*r | -- for small errors
data 8*k-8*r, 8*k-r, 8*k, 8*k+r, 8*k+8*r
read ruletabl
----------------------------------------------------------------------------------------
NN = 4000 | TMAX = 10 | DT = 0.001 | scale = 0.08
p = A * ran() | -- must initialize noise!
drun | -- make a run
write “type go to see membership functions” | STOP
----------------------------------------------------------------------------------------
DT = 0.00001 | NN = 40000
scale = 5 | TMAX = 0.5
e = -2.5 | -- start of display sweep
drun members | -- show the membership functions
185