This commit is contained in:
GokaPek 2025-02-21 19:28:33 +04:00
parent f5d003a911
commit c8fb430e60

220
lab_7/lab7.ipynb Normal file
View File

@ -0,0 +1,220 @@
{
"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
}