Spaces:
Sleeping
Sleeping
| import re | |
| from typing import Dict, List | |
| class FormulaEngine: | |
| """Движок для работы с формулами из строительной документации.""" | |
| def __init__(self): | |
| self.formulas = self._init_formulas() | |
| def _init_formulas(self) -> Dict[str, Dict]: | |
| """Инициализация базы формул.""" | |
| return { | |
| "thickness": { | |
| "name": "Толщина тепловой изоляции", | |
| "expression": "δ = λ × ((tв - tн) / q - Rн)", | |
| "variables": ["tв", "tн", "λ", "q", "Rн"], | |
| "description": "Расчет толщины изоляции по нормированной плотности теплового потока", | |
| }, | |
| "heat_loss": { | |
| "name": "Тепловые потери", | |
| "expression": "q = (tв - tн) / (Rиз + Rн)", | |
| "variables": ["tв", "tн", "Rиз", "Rн"], | |
| "description": "Расчет плотности теплового потока", | |
| }, | |
| "surface_temp": { | |
| "name": "Температура на поверхности", | |
| "expression": "tпов = tн + (tв - tн) × Rн / (Rиз + Rн)", | |
| "variables": ["tв", "tн", "Rиз", "Rн"], | |
| "description": "Расчет температуры наружной поверхности изоляции", | |
| }, | |
| "resistance": { | |
| "name": "Термическое сопротивление", | |
| "expression": "R = δ / λ", | |
| "variables": ["δ", "λ"], | |
| "description": "Расчет термического сопротивления слоя изоляции", | |
| }, | |
| } | |
| def get_available_formulas(self) -> List[Dict]: | |
| """Список доступных формул.""" | |
| return [ | |
| { | |
| "name": f["name"], | |
| "expression": f["expression"], | |
| "variables": f["variables"], | |
| "description": f["description"], | |
| } | |
| for f in self.formulas.values() | |
| ] | |
| def answer_calculation(self, question: str) -> Dict[str, str]: | |
| """Ответ на расчетный вопрос.""" | |
| q_lower = question.lower() | |
| numbers = re.findall(r"(\d+(?:[.,]\d+)?)\s*(°c|мм|м|вт)?", q_lower) | |
| temp_values = [] | |
| for num, unit in numbers: | |
| try: | |
| value = float(num.replace(",", ".")) | |
| if unit == "°c" or "градус" in q_lower: | |
| temp_values.append(value) | |
| except ValueError: | |
| continue | |
| if "толщин" in q_lower: | |
| return self._calculate_thickness(temp_values, question) | |
| if "потер" in q_lower or "теплопотер" in q_lower: | |
| return self._calculate_heat_loss(temp_values) | |
| if "температур" in q_lower and "поверхн" in q_lower: | |
| return self._calculate_surface_temp(temp_values) | |
| return self._general_calculation_guide() | |
| def _calculate_thickness(self, temps: List[float], question: str) -> Dict[str, str]: | |
| """Расчет толщины изоляции.""" | |
| t_in = temps[0] if temps else 150 | |
| t_out = 20 | |
| lam = 0.045 | |
| q_norm = 40 | |
| R_outer = 0.1 | |
| delta = lam * ((t_in - t_out) / q_norm - R_outer) | |
| delta_mm = delta * 1000 | |
| answer_text = f""" | |
| **📐 Расчет толщины тепловой изоляции** | |
| **Исходные данные:** | |
| - Температура теплоносителя: **{t_in}°C** | |
| - Температура окружающей среды: **{t_out}°C** | |
| - Теплопроводность изоляции: **0,045 Вт/(м·°C)** | |
| - Нормированная плотность теплового потока: **40 Вт/м²** | |
| - Сопротивление теплоотдаче: **0,1 м²·°C/Вт** | |
| **Формула расчета (СП 61.13330.2012, формула В.18):** | |
| δ = λ × ((tв - tн) / q - Rн) | |
| text | |
| **Подстановка:** | |
| δ = {lam} × (({t_in} - {t_out}) / {q_norm} - {R_outer}) | |
| δ = {lam} × ({t_in - t_out} / {q_norm} - {R_outer}) | |
| δ = {lam} × ({(t_in - t_out) / q_norm:.3f} - {R_outer}) | |
| δ = {lam} × {((t_in - t_out) / q_norm - R_outer):.4f} | |
| text | |
| **Результат:** | |
| - Расчетная толщина: **{delta:.3f} м** = **{delta_mm:.0f} мм** | |
| - Рекомендуемая толщина: **{round(delta_mm/10)*10} мм** | |
| """ | |
| return {"answer": answer_text} | |
| def _calculate_heat_loss(self, temps: List[float]) -> Dict[str, str]: | |
| """Расчет тепловых потерь.""" | |
| t_in = temps[0] if temps else 150 | |
| t_out = 20 | |
| R_ins = 2.0 | |
| R_outer = 0.15 | |
| q = (t_in - t_out) / (R_ins + R_outer) | |
| answer_text = f""" | |
| **📊 Расчет тепловых потерь** | |
| **Исходные данные:** | |
| - Температура теплоносителя: **{t_in}°C** | |
| - Температура окружающей среды: **{t_out}°C** | |
| - Термическое сопротивление изоляции: **{R_ins} м²·°C/Вт** | |
| - Сопротивление теплоотдаче: **{R_outer} м²·°C/Вт** | |
| **Формула (СП 61.13330.2012, формула В.17):** | |
| q = (tв - tн) / (Rиз + Rн) | |
| text | |
| **Подстановка:** | |
| q = ({t_in} - {t_out}) / ({R_ins} + {R_outer}) | |
| q = {t_in - t_out} / {R_ins + R_outer} | |
| q = {q:.1f} Вт/м | |
| text | |
| **Результат:** | |
| - Тепловые потери: **{q:.1f} Вт/м** | |
| """ | |
| return {"answer": answer_text} | |
| def _calculate_surface_temp(self, temps: List[float]) -> Dict[str, str]: | |
| """Расчет температуры на поверхности.""" | |
| t_in = temps[0] if temps else 150 | |
| t_out = 20 | |
| R_ins = 2.0 | |
| R_outer = 0.15 | |
| t_surf = t_out + (t_in - t_out) * R_outer / (R_ins + R_outer) | |
| answer_text = f""" | |
| **🌡️ Расчет температуры на поверхности изоляции** | |
| **Исходные данные:** | |
| - Температура теплоносителя: **{t_in}°C** | |
| - Температура окружающей среды: **{t_out}°C** | |
| - Термическое сопротивление изоляции: **{R_ins} м²·°C/Вт** | |
| - Сопротивление теплоотдаче: **{R_outer} м²·°C/Вт** | |
| **Формула (СП 61.13330.2012, формула В.29):** | |
| tпов = tн + (tв - tн) × Rн / (Rиз + Rн) | |
| text | |
| **Подстановка:** | |
| tпов = {t_out} + ({t_in} - {t_out}) × {R_outer} / ({R_ins} + {R_outer}) | |
| tпов = {t_out} + {t_in - t_out} × {R_outer} / {R_ins + R_outer} | |
| tпов = {t_out} + {t_in - t_out} × {(R_outer/(R_ins+R_outer)):.3f} | |
| tпов = {t_surf:.1f}°C | |
| text | |
| **Результат:** | |
| - Температура на поверхности: **{t_surf:.1f}°C** | |
| """ | |
| return {"answer": answer_text} | |
| def _general_calculation_guide(self) -> Dict[str, str]: | |
| """Общее руководство по расчетам.""" | |
| answer_text = """ | |
| **📐 Как рассчитать тепловую изоляцию** | |
| **Основные формулы:** | |
| 1. **Толщина изоляции:** δ = λ × ((tв - tн) / q - Rн) | |
| 2. **Тепловые потери:** q = (tв - tн) / (Rиз + Rн) | |
| 3. **Температура поверхности:** tпов = tн + (tв - tн) × Rн / (Rиз + Rн) | |
| **Примеры вопросов:** | |
| - "Рассчитай толщину изоляции при температуре 150°C" | |
| - "Какие тепловые потери при 200°C?" | |
| **Для точного расчета укажите:** | |
| - Температуру теплоносителя (°C) | |
| - Температуру окружающей среды (°C) | |
| - Тип поверхности (плоская или цилиндрическая) | |
| """ | |
| return {"answer": answer_text} |