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

221 lines
9.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Шаг 1: Выбор входных и выходных переменных\n",
"Входные переменные:\n",
"Температура (Temperature):\n",
"\n",
"Диапазон: от 0 до 40 градусов.\n",
"\n",
"Лингвистические термы: \"холодно\", \"средне\", \"жарко\".\n",
"\n",
"Влажность (Humidity):\n",
"\n",
"Диапазон: от 0 до 100%.\n",
"\n",
"Лингвистические термы: \"сухо\", \"нормально\", \"влажно\".\n",
"\n",
"Выходная переменная:\n",
"Скорость вентилятора (Fan Speed):\n",
"\n",
"Диапазон: от 0 до 100%.\n",
"\n",
"Лингвистические термы: \"низкая\", \"средняя\", \"высокая\".\n",
"\n",
"Шаг 2: Настройка параметров лингвистических переменных\n",
"Определение функций принадлежности\n",
"Для каждой переменной задаются функции принадлежности, которые описывают, как входные значения соотносятся с лингвистическими термами.\n",
"\n",
"\"Холодно\": треугольная функция с пиком на 0 градусов.\n",
"\n",
"\"Средне\": треугольная функция с пиком на 20 градусов.\n",
"\n",
"\"Жарко\": треугольная функция с пиком на 40 градусов.\n",
"\n",
"Влажность:\n",
"\n",
"\"Сухо\": треугольная функция с пиком на 0%.\n",
"\n",
"\"Нормально\": треугольная функция с пиком на 50%.\n",
"\n",
"\"Влажно\": треугольная функция с пиком на 100%.\n",
"Скорость вентилятора:\n",
"\n",
"\"Низкая\": треугольная функция с пиком на 0%.\n",
"\n",
"\"Средняя\": треугольная функция с пиком на 50%.\n",
"\n",
"\"Высокая\": треугольная функция с пиком на 100%."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import skfuzzy as fuzz\n",
"from skfuzzy import control as ctrl\n",
"\n",
"# Определение диапазонов для входных и выходных переменных\n",
"temp_range = np.arange(0, 41, 1)\n",
"humidity_range = np.arange(0, 101, 1)\n",
"fan_speed_range = np.arange(0, 101, 1)\n",
"\n",
"# Определение лингвистических переменных\n",
"temperature = ctrl.Antecedent(temp_range, 'temperature')\n",
"humidity = ctrl.Antecedent(humidity_range, 'humidity')\n",
"fan_speed = ctrl.Consequent(fan_speed_range, 'fan_speed')\n",
"\n",
"# Определение функций принадлежности для температуры\n",
"temperature['cold'] = fuzz.trimf(temperature.universe, [0, 0, 20])\n",
"temperature['medium'] = fuzz.trimf(temperature.universe, [10, 20, 30])\n",
"temperature['hot'] = fuzz.trimf(temperature.universe, [20, 40, 40])\n",
"\n",
"# Определение функций принадлежности для влажности\n",
"humidity['dry'] = fuzz.trimf(humidity.universe, [0, 0, 50])\n",
"humidity['normal'] = fuzz.trimf(humidity.universe, [30, 50, 70])\n",
"humidity['wet'] = fuzz.trimf(humidity.universe, [50, 100, 100])\n",
"\n",
"# Определение функций принадлежности для скорости вентилятора\n",
"fan_speed['low'] = fuzz.trimf(fan_speed.universe, [0, 0, 50])\n",
"fan_speed['medium'] = fuzz.trimf(fan_speed.universe, [30, 50, 70])\n",
"fan_speed['high'] = fuzz.trimf(fan_speed.universe, [50, 100, 100])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Шаг 3: Формирование базы нечетких правил\n",
"Правила:\n",
"Если температура \"холодно\" и влажность \"сухо\", то скорость вентилятора \"низкая\".\n",
"\n",
"Если температура \"средне\" и влажность \"нормально\", то скорость вентилятора \"средняя\".\n",
"\n",
"Если температура \"жарко\" и влажность \"влажно\", то скорость вентилятора \"высокая\"."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# Создание правил\n",
"rule1 = ctrl.Rule(temperature['cold'] & humidity['dry'], fan_speed['low'])\n",
"rule2 = ctrl.Rule(temperature['medium'] & humidity['normal'], fan_speed['medium'])\n",
"rule3 = ctrl.Rule(temperature['hot'] & humidity['wet'], fan_speed['high'])\n",
"\n",
"# Создание системы управления\n",
"fan_ctrl = ctrl.ControlSystem([rule1, rule2, rule3])\n",
"fan_speed_simulation = ctrl.ControlSystemSimulation(fan_ctrl)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Шаг 5: Оценка качества модели"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"39.83800623052959\n",
"60.16199376947047\n",
"81.42857142857139\n"
]
}
],
"source": [
"# Пример 1: Температура 15, Влажность 40\n",
"fan_speed_simulation.input['temperature'] = 15\n",
"fan_speed_simulation.input['humidity'] = 40\n",
"fan_speed_simulation.compute()\n",
"print(fan_speed_simulation.output['fan_speed'])\n",
"\n",
"# Пример 2: Температура 25, Влажность 60\n",
"fan_speed_simulation.input['temperature'] = 25\n",
"fan_speed_simulation.input['humidity'] = 60\n",
"fan_speed_simulation.compute()\n",
"print(fan_speed_simulation.output['fan_speed'])\n",
"\n",
"# Пример 3: Температура 35, Влажность 80\n",
"fan_speed_simulation.input['temperature'] = 35\n",
"fan_speed_simulation.input['humidity'] = 80\n",
"fan_speed_simulation.compute()\n",
"print(fan_speed_simulation.output['fan_speed'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Анализ результатов:\n",
"Пример 1 (Температура = 15, Влажность = 40):\n",
"\n",
"Результат: 39.84.\n",
"\n",
"Интерпретация: Температура ближе к \"холодно\", влажность ближе к \"сухо\". Скорость вентилятора ближе к \"низкой\", что логично.\n",
"\n",
"Пример 2 (Температура = 25, Влажность = 60):\n",
"\n",
"Результат: 60.16.\n",
"\n",
"Интерпретация: Температура ближе к \"средне\", влажность ближе к \"нормально\". Скорость вентилятора ближе к \"средней\", что соответствует ожиданиям.\n",
"\n",
"Пример 3 (Температура = 35, Влажность = 80):\n",
"\n",
"Результат: 81.43.\n",
"\n",
"Интерпретация: Температура ближе к \"жарко\", влажность ближе к \"влажно\". Скорость вентилятора ближе к \"высокой\", что логично.\n",
"\n",
"Выводы:\n",
"Модель работает корректно и выдает ожидаемые результаты.\n",
"\n",
"Результаты соответствуют заданным правилам и логике системы.\n",
"\n",
"Для улучшения модели можно:\n",
"\n",
"Добавить больше термов для входных переменных (например, \"очень холодно\", \"очень жарко\").\n",
"\n",
"Уточнить функции принадлежности.\n",
"\n",
"Добавить больше правил для учета промежуточных состояний."
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}