9.1 KiB
Шаг 1: Выбор входных и выходных переменных Входные переменные: Температура (Temperature):
Диапазон: от 0 до 40 градусов.
Лингвистические термы: "холодно", "средне", "жарко".
Влажность (Humidity):
Диапазон: от 0 до 100%.
Лингвистические термы: "сухо", "нормально", "влажно".
Выходная переменная: Скорость вентилятора (Fan Speed):
Диапазон: от 0 до 100%.
Лингвистические термы: "низкая", "средняя", "высокая".
Шаг 2: Настройка параметров лингвистических переменных Определение функций принадлежности Для каждой переменной задаются функции принадлежности, которые описывают, как входные значения соотносятся с лингвистическими термами.
"Холодно": треугольная функция с пиком на 0 градусов.
"Средне": треугольная функция с пиком на 20 градусов.
"Жарко": треугольная функция с пиком на 40 градусов.
Влажность:
"Сухо": треугольная функция с пиком на 0%.
"Нормально": треугольная функция с пиком на 50%.
"Влажно": треугольная функция с пиком на 100%. Скорость вентилятора:
"Низкая": треугольная функция с пиком на 0%.
"Средняя": треугольная функция с пиком на 50%.
"Высокая": треугольная функция с пиком на 100%.
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
# Определение диапазонов для входных и выходных переменных
temp_range = np.arange(0, 41, 1)
humidity_range = np.arange(0, 101, 1)
fan_speed_range = np.arange(0, 101, 1)
# Определение лингвистических переменных
temperature = ctrl.Antecedent(temp_range, 'temperature')
humidity = ctrl.Antecedent(humidity_range, 'humidity')
fan_speed = ctrl.Consequent(fan_speed_range, 'fan_speed')
# Определение функций принадлежности для температуры
temperature['cold'] = fuzz.trimf(temperature.universe, [0, 0, 20])
temperature['medium'] = fuzz.trimf(temperature.universe, [10, 20, 30])
temperature['hot'] = fuzz.trimf(temperature.universe, [20, 40, 40])
# Определение функций принадлежности для влажности
humidity['dry'] = fuzz.trimf(humidity.universe, [0, 0, 50])
humidity['normal'] = fuzz.trimf(humidity.universe, [30, 50, 70])
humidity['wet'] = fuzz.trimf(humidity.universe, [50, 100, 100])
# Определение функций принадлежности для скорости вентилятора
fan_speed['low'] = fuzz.trimf(fan_speed.universe, [0, 0, 50])
fan_speed['medium'] = fuzz.trimf(fan_speed.universe, [30, 50, 70])
fan_speed['high'] = fuzz.trimf(fan_speed.universe, [50, 100, 100])
Шаг 3: Формирование базы нечетких правил Правила: Если температура "холодно" и влажность "сухо", то скорость вентилятора "низкая".
Если температура "средне" и влажность "нормально", то скорость вентилятора "средняя".
Если температура "жарко" и влажность "влажно", то скорость вентилятора "высокая".
# Создание правил
rule1 = ctrl.Rule(temperature['cold'] & humidity['dry'], fan_speed['low'])
rule2 = ctrl.Rule(temperature['medium'] & humidity['normal'], fan_speed['medium'])
rule3 = ctrl.Rule(temperature['hot'] & humidity['wet'], fan_speed['high'])
# Создание системы управления
fan_ctrl = ctrl.ControlSystem([rule1, rule2, rule3])
fan_speed_simulation = ctrl.ControlSystemSimulation(fan_ctrl)
Шаг 5: Оценка качества модели
# Пример 1: Температура 15, Влажность 40
fan_speed_simulation.input['temperature'] = 15
fan_speed_simulation.input['humidity'] = 40
fan_speed_simulation.compute()
print(fan_speed_simulation.output['fan_speed'])
# Пример 2: Температура 25, Влажность 60
fan_speed_simulation.input['temperature'] = 25
fan_speed_simulation.input['humidity'] = 60
fan_speed_simulation.compute()
print(fan_speed_simulation.output['fan_speed'])
# Пример 3: Температура 35, Влажность 80
fan_speed_simulation.input['temperature'] = 35
fan_speed_simulation.input['humidity'] = 80
fan_speed_simulation.compute()
print(fan_speed_simulation.output['fan_speed'])
Анализ результатов: Пример 1 (Температура = 15, Влажность = 40):
Результат: 39.84.
Интерпретация: Температура ближе к "холодно", влажность ближе к "сухо". Скорость вентилятора ближе к "низкой", что логично.
Пример 2 (Температура = 25, Влажность = 60):
Результат: 60.16.
Интерпретация: Температура ближе к "средне", влажность ближе к "нормально". Скорость вентилятора ближе к "средней", что соответствует ожиданиям.
Пример 3 (Температура = 35, Влажность = 80):
Результат: 81.43.
Интерпретация: Температура ближе к "жарко", влажность ближе к "влажно". Скорость вентилятора ближе к "высокой", что логично.
Выводы: Модель работает корректно и выдает ожидаемые результаты.
Результаты соответствуют заданным правилам и логике системы.
Для улучшения модели можно:
Добавить больше термов для входных переменных (например, "очень холодно", "очень жарко").
Уточнить функции принадлежности.
Добавить больше правил для учета промежуточных состояний.