0. Что имеем на старте
Компания L****, находясь, в непростой для себя точке решает изменить модель бизнеса и принимает решение пойти в область IT. За 10 лет компания спроектировала и запустила в работу более 900 кожухотрубных теплообменников. На базе данного опыта решено было создать облачный сервис для автоматизированного подбора и проектирования кожухотруных теплообменных аппаратов.
-
Из первоначального штата компании (более 80 человек) в группу разработки вошли 6 человек:
Инженер-конструктор 1-ой категории (есть небольшой опыт на VBA)
Инженер-теплотехник 2-ой категории (без опыта программирования)
Инженер-теплотехник 3-ий категории (без опыта программирования)
Инженер-физик (без опыта программирования)
Инженер-химик (годовой курс по Python)
Инженер-математик (есть опыт программирования на PHP)
1. Подготовка
1.1. Выбор стека
Руководителем группы был выбран Инженер-математик, обладавший на тот момент наибольшим опытом программирования.
В качестве языка программирования был выбран Python по следующим ключевым причинам:
Простота синтаксиса
Поддержка ООП
Наличие большого количества готовых прикладных библиотек
В качестве среды разработки был выбран JupiterLab, тогда еще версии 2.0:
В качестве базы данных выбрали MySQL, поскольку у руководителя проекта в ней тоже был опыт работы )
1.2. Первый план на полгода
Первым шагом было создание плана разработки на полгода. Создан был план в корпоративной MediaWiki:
2. Обучение Python
Поскольку навыков программирования в Python не было ни у одного члена команды мы начали с самых азов.
В качестве ориентиров были бесплатный курс по Python от Яндекса и курс лекций от Тимофея Хирьянова.
Примеры, разобранные в учебных курсах мы сразу адаптировали под задачи нашего проекта, затем совместно разбирали данную тему уже на этих адаптированных примера и выполняли самостоятельное домашнее задание, которое тоже было адаптировано под нашу тематику. В итоге у нас получилось порядка 8 уроков.
Пример из урока по функциям
# Одна или несколько переменных в функции могут быть заданы по умолчанию
# Но сначала в функции должны быть перечислены обязательные аргументы
def F(Q = 1.5, dT = 10, k = 1600):
return Q*10**6/(k*dT)
print(F())
print(F(1.5,14))
print(F(dT=14, Q=1.5))
print(F(Q=1.5, dT=14)) # к берется по умолчанию равным 1600
print(F(Q=1.5, dT=14, k=2000))
Пример домашнего задания
# Ниже подготовлен массив свойств воды:
# [tºС, ρ кг/м³, ср Дж/(кг×К), λ Вт/(м×К), μ н×с/м²]
WP = [
[1,1000,4218,0.564,0.001790],
[5,1000,4208,0.572,0.001549],
[10,1000,4196,0.582,0.001306],
[15,999,4191,0.591,0.001160],
[20,999,4185,0.600,0.001002],
[25,997,4183,0.608,0.000900],
[30,996,4180,0.615,0.000798],
[35,994,4180,0.622,0.000726],
[40,993,4179,0.629,0.000653],
[45,991,4180,0.635,0.000600],
[50,988,4180,0.641,0.000547],
[55,986,4172,0.646,0.000507],
[60,984,4183,0.651,0.000467],
[65,981,4186,0.656,0.000436],
[70,978,4188,0.660,0.000404],
[75,975,4192,0.664,0.000379],
[80,972,4196,0.667,0.000355],
[85,969,4201,0.670,0.000335],
[90,966,4205,0.673,0.000315],
[95,962,4211,0.676,0.000298],
[100,959,4217,0.678,0.000282],
[110,951,4230,0.682,0.000255],
[120,944,4246,0.684,0.000232],
[130,935,4265,0.685,0.000213],
[140,926,4286,0.685,0.000197],
[150,917,4310,0.684,0.000183],
[160,908,4338,0.682,0.000170],
[170,898,4369,0.679,0.000160],
[180,887,4406,0.675,0.000150],
[190,876,4447,0.669,0.000142],
[200,865,4494,0.663,0.000134],
[210,853,4548,0.656,0.000128],
[220,840,4611,0.648,0.000122],
[230,827,4683,0.639,0.000116],
[240,814,4767,0.629,0.000111],
[250,799,4865,0.618,0.000106],
[260,784,4981,0.606,0.000102],
[270,768,5120,0.592,0.000098],
[280,751,5290,0.578,0.000094],
[290,732,5490,0.562,0.000090],
[300,712,5750,0.545,0.000086]
]
print(WP[20][2])
# Задача: Написать функцию сведения теплового баланса
# с любым одним необязательным параметром
# Исходные данные (запрашиваются у пользователя)
# t1, Цельсий - температура на входе в трубное
# t2, Цельсий - температура на выходе в трубное
# T1, Цельсий - температура на входе в межтрубное
# T2, Цельсий - температура на выходе в межтрубное
# g, кг/час - расход среды в трубном
# G, кг/час - расход среды в трубном
# Вывод программы:
# t1 труб. вход =
# t2 труб. выход =
# T1 межтруб. вход =
# T2 межтруб. выход =
# g труб. =
# G межтруб. =
# Q труб. =
# Q межтруб. =
3. Начало работы
На момент старта проекта в компании L**** был реализован механизм расчета теплообменника в виде Excel файла. Вот его вид:
Для перевода данного расчета на Python следовало решить ряд подготовительных задач:
Оцифровать графики TEMA для определения поправки Z
Построить коммуникацию через API с пакетом теплофизических свойств для решения задачи по сведению теплового баланса
Занести в базу данных таблицы из ГОСТа: 34347-2017 сосуды и аппараты стальные сварные. общие технические условия / 34347 2017
3.1. Оцифровка графиков TEMA
Вид графика из TEMA
Итоговый результат оцифровки
Результат перевода в массивы Python
Mas_7_11 = [
[
0.1,
[
[1.000000000000000, 0.499999999999999],
[0.999322833180564, 0.613635531736094],
[0.997093063158007, 0.664615593443683],
[0.996832262423495, 0.737096845531233]
]
]
]
3.2. Связь по API с пакетом теплофизических свойств
Генерация разбивок
Интерактивный виджет в JupiterLab для построения разбивок
Посекторный расчет теплообменника
Визуализация процесса расчета в JupiterLab
Генетический алгоритм поиска решения
Генетическая игра "Мир кроликов"
Ссылка на GitHub: https://github.com/tau15/Rabbit_World
Параметры мира кроликов
# World values
DNA_commands = 32 # Количество генов у каждого кролика
Food_limit = 100 # Кол-во еды, генерируемое в мире
Poison_limit = 0
Food_generation = 200
sleep_time = None
Bots_num = 8
DNA_lenght = 32
Survivers = 2
Mutation = 1
Love = True
Mutation_dna = 2
Устройство кролика :)
График корреляции массы аппарата и коэффициента теплопередачи К
Построение сетки решений и критериальный выбор лучшего решения
Блок-схема алгоритма построения сетки решений
Комментарии (5)
ganqqwerty
13.02.2022 14:00Не очень понял, где пригодились генетические алгоритмы. На последней блок-схеме вроде кучка if'ов ну то бишь дерево решений.
mSnus
Мне кажется, инженеры без опыта программирования просто обязаны были наступить на какие-нибудь грабли. Конверсия строк в числа, float-ы, приведение типов -- что-нибудь вот такое.
В любом случае - молодцы! Но код лучше бы отдать на ревью кому-то опытному.