import neurenix as nx
from neurenix.fuzzy import (
MamdaniSystem,
LinguisticVariable,
TriangularSet,
FuzzyRule
)
# Create fuzzy controller for inverted pendulum
fis = MamdaniSystem(name="Pendulum Controller")
# Define angle input
angle = LinguisticVariable("angle", nx.linspace(-90, 90, 1000))
angle.add_set("left", TriangularSet(-90, -90, 0))
angle.add_set("center", TriangularSet(-30, 0, 30))
angle.add_set("right", TriangularSet(0, 90, 90))
fis.add_input_variable(angle)
# Define angular velocity input
velocity = LinguisticVariable("velocity", nx.linspace(-100, 100, 1000))
velocity.add_set("negative", TriangularSet(-100, -100, 0))
velocity.add_set("zero", TriangularSet(-20, 0, 20))
velocity.add_set("positive", TriangularSet(0, 100, 100))
fis.add_input_variable(velocity)
# Define force output
force = LinguisticVariable("force", nx.linspace(-10, 10, 1000))
force.add_set("left_push", TriangularSet(-10, -10, 0))
force.add_set("no_push", TriangularSet(-2, 0, 2))
force.add_set("right_push", TriangularSet(0, 10, 10))
fis.add_output_variable(force)
# Define control rules
rules = [
FuzzyRule([("angle", "left"), ("velocity", "negative")], ("force", "right_push")),
FuzzyRule([("angle", "left"), ("velocity", "zero")], ("force", "right_push")),
FuzzyRule([("angle", "center"), ("velocity", "zero")], ("force", "no_push")),
FuzzyRule([("angle", "right"), ("velocity", "positive")], ("force", "left_push")),
]
for rule in rules:
fis.add_rule(rule)
# Control loop
for t in range(1000):
current_angle = get_angle()
current_velocity = get_velocity()
output = fis.evaluate({
"angle": current_angle,
"velocity": current_velocity
})
apply_force(output["force"])