2025-02-21 19:28:33 +04:00

9.1 KiB
Raw Blame History

Шаг 1: Выбор входных и выходных переменных Входные переменные: Температура (Temperature):

Диапазон: от 0 до 40 градусов.

Лингвистические термы: "холодно", "средне", "жарко".

Влажность (Humidity):

Диапазон: от 0 до 100%.

Лингвистические термы: "сухо", "нормально", "влажно".

Выходная переменная: Скорость вентилятора (Fan Speed):

Диапазон: от 0 до 100%.

Лингвистические термы: "низкая", "средняя", "высокая".

Шаг 2: Настройка параметров лингвистических переменных Определение функций принадлежности Для каждой переменной задаются функции принадлежности, которые описывают, как входные значения соотносятся с лингвистическими термами.

"Холодно": треугольная функция с пиком на 0 градусов.

"Средне": треугольная функция с пиком на 20 градусов.

"Жарко": треугольная функция с пиком на 40 градусов.

Влажность:

"Сухо": треугольная функция с пиком на 0%.

"Нормально": треугольная функция с пиком на 50%.

"Влажно": треугольная функция с пиком на 100%. Скорость вентилятора:

"Низкая": треугольная функция с пиком на 0%.

"Средняя": треугольная функция с пиком на 50%.

"Высокая": треугольная функция с пиком на 100%.

In [5]:
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: Формирование базы нечетких правил Правила: Если температура "холодно" и влажность "сухо", то скорость вентилятора "низкая".

Если температура "средне" и влажность "нормально", то скорость вентилятора "средняя".

Если температура "жарко" и влажность "влажно", то скорость вентилятора "высокая".

In [6]:
# Создание правил
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: Оценка качества модели

In [7]:
# Пример 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'])
39.83800623052959
60.16199376947047
81.42857142857139

Анализ результатов: Пример 1 (Температура = 15, Влажность = 40):

Результат: 39.84.

Интерпретация: Температура ближе к "холодно", влажность ближе к "сухо". Скорость вентилятора ближе к "низкой", что логично.

Пример 2 (Температура = 25, Влажность = 60):

Результат: 60.16.

Интерпретация: Температура ближе к "средне", влажность ближе к "нормально". Скорость вентилятора ближе к "средней", что соответствует ожиданиям.

Пример 3 (Температура = 35, Влажность = 80):

Результат: 81.43.

Интерпретация: Температура ближе к "жарко", влажность ближе к "влажно". Скорость вентилятора ближе к "высокой", что логично.

Выводы: Модель работает корректно и выдает ожидаемые результаты.

Результаты соответствуют заданным правилам и логике системы.

Для улучшения модели можно:

Добавить больше термов для входных переменных (например, "очень холодно", "очень жарко").

Уточнить функции принадлежности.

Добавить больше правил для учета промежуточных состояний.