Инженеры по всему миру ведут разработку в среде MATLAB, это их любимый инструмент. А может ли российская IT-индустрия предложить достойную альтернативу дорогому американскому софту?
С этим вопросом я пришла к Вячеславу Петухову, основателю компании 3В Сервис, которая производит отечественную среду моделирования и разработки SimInTech. После попытки продать свою разработку в Америке он вернулся в Россию и делает конкурента MATLAB здесь.
Поговорили о трудностях внедрения сложного IT-продукта на российский рынок, маркетинге на грани, принципах работы SimInTech и её преимуществах перед MATLAB.
Полную версию, которая охватывает очень много интересных вопросов, вы можете посмотреть на моем ютуб-канале. Здесь же я приведу в сжатом виде некоторые интересные моменты, творчески переработанные под печатный формат.
Фаря:
На чём написана среда SimInTech?
Вячеслав Петухов:
Изначально и сейчас она написана на Паскале.
Серьёзно? Кто-то на нем еще пишет?
Да. Он спокойно себе развивается, Скайп был написан на Delphi. Когда мы начинали разработку это была чуть ли не первая среда, в которой можно было быстро набрать код, не заморачиваясь, и заняться сутью.
Если сравнивать с MATLAB, то какие библиотеки SimInTech, по твоему мнению, самые сильные сейчас, какие еще недоработанные, какие планируется доработать?
Математическое ядро уже готово, можно использовать. Готова гидравлика. Кипение воды в трубах и работа турбины это основа, то, с чего всё начиналось. Один заказчик долго пытался посчитать с помощью MATLAB, но в итоге у него ничего не заработало, у нас эта задачка буквально через день была решена.
В целом у нас нет ничего неудачного, но есть области, где мы еще не копали. Допустим, в MATLAB есть тулбокс для расчета динамики летательных аппаратов, а у нас нет. Но это не потому, что у нас что-то не хватает, просто мы этим не занимаемся.
А что на счетавтоматической генерации кода? MATLAB этим очень кичится.
Это смешно. Матлабовская кодогенерация это просто смех. Если говорить про наш продукт, то теперь операторы АЭС открывают ноутбук на станции, открывают схему в SimIntech, подключают к стойке, которая управляет реактором, и правят эту схему. Программиста нет.
***
Мне кажется, это очень интересная история, что вы делаете свой сложный российский продукт, но почему у вас такой жесткий маркетинг? Почему в каждую дырку (отверстие) нужно обязательно вставлять MATLAB?
Потому что изначально все наши коммерческие проекты начинались тем, где обкакивался MATLAB. Я считаю, что MATLAB у нас используют все, это стандарт де-факто, они на рынке, все их знают. И вот мы приходим и говорим: У нас есть всё то же самое, только лучше. Но часто возникает проблема, если приходишь с российским продуктом: Это что, импортозамещение? Взяли, денег намыли, теперь нам пытаются впарить это
Вот одна из твоих цитат из ВКонтакте:
И при этом ты говоришь, что по отношению к SimInTech понятие импортозамещение употреблять не стоит. Хотя тут сам на это и намекаешь.
Здесь написано, что ВУЗ заплатил 25000000 . За что? Зачем ВУЗу на 25000000 покупать MATLAB?
А зачем ему SimInTech покупать?
SimInTech не надо покупать. Качай и учи. Передаточные функции, фазочастотный анализ, устойчивость. Это всё можно делать бесплатно. У нас можно качать демоверсию и в ней всё это делать.
И сколько эта демоверсия доступна?
Нет ограничений по времени, но есть ограничение по сложности 250 блоков. Для обучения это выше крыши. Не надо тратить деньги на американцев.
Часто вижу твои комментарии в соцсетях и на Хабре с возмущениями про MATLAB. Они, что-то делали и MATLAB посчитать не смог, а вот у нас считает. Но для человека, который работает в MATLAB, это значит, что он просто недоразобрался. Открываешь документацию, и все получается.
Это понятно. Но моя задача тебе продать. Как еще я тебе продам, если ты пользуешься MATLAB? Ты позовёшь своих инженеров и скажешь им: Вот пришли ребята, хотят нам предложить аналог MATLAB. А у инженера в матлабе наработана библиотека и куча всего. Он откроет SimInTech и скажет: Ой, да у вас интерфейс не такой, да у вас линии неправильные рисуются и т.д.
Так в этом же и заключается проблема бизнеса. Многие компании, которые, пытаются продать какой-либо продукт, идут на ухищрения. Устраивают тренинги, показывают товар лицом
Наш заказчик к нам придёт, потому что у него проблема с MATLAB. А те, у кого нет проблем с MATLAB, кого всё устраивает, в принципе, не наши заказчики. Они не придут. Мне нужно, чтобы все знали, что SimInTech это то же самое, что MATLAB, но лучше.
То есть ты за счёт MATLAB пиаришься?
Ну да.
***
А зачем ты приходил к конкурентам в Софтлайн (дистрибьюторы MATLAB)?
Я предлагал им гениальную бизнес-идею. Я знаю, что у них где-то порядка 50% прибыли уезжает в Америку. Давайте оставим эти 50% здесь и на эти деньги мы разработаем всё, что угодно.
Чем закончилась ваша встреча?
Их директор сказал: Мне не интересно, у меня и так всё хорошо. Не захотел участвовать в процессе маркетингового сопровождения: уроки, презентации, материалы, учебная литература. Я хотел, чтобы Софтлайн, как он продаёт MATLAB, продавал SimInTech. Деньги, которые сейчас уходят в Америку, можно было бы оставлять у себя и делить с нами.
Очень амбициозно
Если вам понравилось, приглашаю к просмотру полной версии.
Пишите в комменты, что вы думаете о разработке отечественных
аналогов продвинутого импортного ПО.
__global__ void checkIntersectCell (const TCOORD* coord,const TZCORN* zcorn,const TACTNUM* actnum,TFLAGS* flags,TIJK I, TIJK J, TIJK K,TPLANE A, TPLANE B, TPLANE C, TPLANE D,const TCOEF* coefX, // предрасчитанные коэффициенты для поиска координат x узловconst TCOEF* coefY // предрасчитанные коэффициенты для поиска координат y узлов){const auto globalIndex = blockDim.x * blockIdx.x + threadIdx.x;if (globalIndex < (I * J * K)){if (actnum[globalIndex]){// globalIndex = K * J * i + K * j + k = K * (J * i + j) + kconst auto k = globalIndex % K;const auto j = (globalIndex / K) % J;const auto i = (globalIndex / K) / J;int_fast8_t signPlus = 0;int_fast8_t signMinus = 0;int_fast8_t signZero = 0;for (size_t p = 0; p < vertexCount; ++p){const auto indexPillar = (J + 1) * (i + p / 4) + (j + (p / 2) % 2);const auto zPillarTop = coord[6 * indexPillar + 2];const auto z = zcorn[(2 * i + p / 4) * 2 * 2 * J * K + (2 * j + (p / 2) % 2) * 2 * K + (2 * k + p % 2)];const auto x = (z - zPillarTop) * coefX[indexPillar] + coord[6 * indexPillar + 0];const auto y = (z - zPillarTop) * coefY[indexPillar] + coord[6 * indexPillar + 1];switch (sign<int_fast8_t>(A * x + B * y + C * z + D)){case -1: ++signMinus; break;case 1: ++signPlus; break;case 0: ++signZero; break;}}flags[globalIndex] = static_cast<TFLAGS>((signMinus > 0 && signPlus > 0) || signZero >= 3);}else{flags[globalIndex] = static_cast<TFLAGS>(0);}}}
На объединение данных понятий мне потребовалось 5 лет и миллион рублей.
Я запустил производство флейт Пана Arra Lazur и продолжаю его развивать по настоящее время (2021г), при этом являюсь C++ разработчиком, преимущественно в области 3d моделирования для CAD/САПР (систем автоматизированного проектирования) и геометрических ядер.
Мне удалось достигнуть определенных успехов в этом деле и в этой статье я хотел бы поделиться ими, а также результатами проделанных экспериментов.
Что же такое флейта Пана? Это музыкальный духовой инструмент. Является набором скрепленных между собой трубок различной длины. Музыкант дует на срез (лабиум) с одной стороны, а с другой трубки заткнуты пробками. Полученный внутренний объем трубки (игровой канал) определяет ее ноту.
флейта Пана [0]Качественное звучание обеспечивается известными техническими
аспектами [12], например:
Диаметры трубок меняются логарифмически, постепенно от большего к меньшему. Это дает плавность изменения тембра на всем диапазоне звучания.
Внутренние поверхности трубок должны быть гладкими, отполированными в зеркало. Это дает легкость звукоизвлечения и чистоту звука.
Расстояние между игровыми каналами должно быть минимально. Это дает минимальную ширину инструмента и как следствие, увеличивает максимальную скорость игры.
Пробки должны иметь вогнутую поверхность. Чем короче трубка, тем больше степень вогнутости. Это дает мягкость звучания высоких нот.
Форма игровых каналов должна быть конусной (сужаться к верху). Это дает отзывчивость инструменту и снижает потребление воздуха музыкантом.
В большинстве своем такие флейты делаются из бамбука или тростника, поскольку этот природный материал уже имеет необходимую форму трубки. Главная проблема в нестабильности - невозможности иметь прогнозируемый, повторяемый результат.
Хранилище бамбуковых трубок на производстве [1]Более современный подход это вытачивание трубок на токарных станках. Тут основная проблема это очень высокая трудоемкость.
Точение трубок на токарном станке [2]Массовый и очень дешевый вариант производства это литье пластмасс под давлением [6]. Тут главная проблема это невозможность менять параметры индивидуально под клиента, а также требуется реализация больших партий для амортизации оборудования/пресс-форм.
Литье пластмасс в пресс-формах [6]Хочется же получить технологию/алгоритм действий, исключающий недостатки вышеописанных подходов, выполнив которые, можно получить флейту высокого качества.
Также хочется иметь гибкость при производстве. Например, индивидуально менять степень изгиба флейты, в зависимости от биомеханики шеи/головы играющего.
Начал свой путь с написания программы автоматического генератора 3д моделей панфлейт, поскольку подавляющее большинство оборудования, с функцией автоматического изготовления чего-либо, использует эти самые 3д модели.
Так достаточно лишь запустить приложение (.ехе) с новыми параметрами, и получить сразу готовую 3д модель для преобразования в траекторию движения режущего инструмента станка с ЧПУ (числовым программным управлением).
Саму флейту описывают порядка 50ти параметров: диаметры, толщины стенок, высота обвязки и т.д. Легкость перегенерации моделей поощряет эксперименты с этими параметрами и позволяет мне, например, измерив длину челюсти/рук и т.д., оптимизировать габариты/изгиб флейты под музыканта.
Пример 3д моделиДалее я начал пробовать различные способы изготовления:
1) Вырезал плоские половинки флейт на фрезерном ЧПУ станке (фрезерование), а затем изгибал их, по известной технологии, при помощи водяного пара [7] (под воздействием влаги и высокой температуры дерево становится пластичным). Написал программу оптимальной расстановки деталей с целью экономии материала [8] и автоматическим запуском расчета управляющей программы для станка.
Фрезерование плоских панфлейтНа деле оказался невозможным изгиб, потому что во время пропаривания флейта начинает расслаиваться по клеевым швам.
2) Тогда я решил попробовать фрезеровать сразу изогнутые флейты, где весь инструмент распиливается на отдельные трубки, а каждая трубка на две половинки.
Фрезерование изогнутых панфлейтПодход оказался неудачным из-за необходимости фрезеровать детали с очень высокой точностью, которая недостижима при работе с натуральными материалами (деревом) и ограничениями такого типа оборудования [9].
Неудачный результат фрезерования3) А что если попробовать нарезать флейту поперек и затем
склеивать полученные куски?
Для этого пришлось дописать функциональность по расчету пересечений
3д объектов и плоскости. Также заиграла новыми красками уже готовая
авто-расстановка.
При таком подходе оказалось сложно получить точную и аккуратную стыковку слоев между собой. Критичным оказалось еще и отсутствие прочности (древесина легко раскалывается вдоль волокон).
Результаты сборки4) Далее решил попробовать наматывать композитные угле- или стеклопластиковые трубки [10], а фрезеровать только деревянную обвязку. На деревянной обвязке с самых краев не лишним будет дополнительный материал, для защиты от разрушения крайних трубок при падении флейты углами на твердые поверхности.
Проектирование карбоновых панфлейтСуть формовки трубок заключается в намотке стекло-/углеткани на полированные стальные стержни, которые затем напитываются отверждаемым жидким пластиком в вакуумном пакете (метод вакуумной инфузии [11]). Трубки получаются сразу с гладкой внутренней поверхностью, легкие и прочные.
Реквизит для вакуумной инфузииФрезеровка плоской части обвязки не отличается от предыдущего способа, но вот фрезеровка изогнутой проблематична. Написал модуль, который нарезает эту часть на кучу небольших деталей, каждая из которых не имеет нависающих частей и может быть отфрезерована за один проход. Теперь уже требуется не просто расставить оптимально в заготовке, но и помнить, где какой кусок, чтобы правильно собрать воедино, так как деталей много и все они похожи друг на друга. Хороший такой пазл получился (:
Результат автоматической расстановкиРеализация в деревеПроблемой при таком подходе является высокая вероятность собрать неправильно нижнюю часть обвязки. Тонкие части деревянных кусков легко скалываются. Да и вся флейта получается хрупкой.
Стеклопластиковые панфлейты5) Следующий этап это печать трубок на 3d принтере и возврат к изгибу деревянных частей флейты с помощью водяного пара.
Составляющие напечатанных панфлейтПри печати возможно придать трубкам сложную, конусную форму с выступами, которая недостижима при формовке на стальных стержнях из-за неизбежного разрушения трубок во время снятия со стержней (так называемый замок).
Для корректного изгибания деревянной обвязки требуется умение предсказывать, какую деталь нужно отфрезеровать, чтобы при изгибе она приобрела задуманную форму (ближняя и дальняя половинки обвязки имеют разную длину и требуются разные алгоритмы их генерации). Для этого пришлось реализовать дополнительный модуль в программе, моделирующий физический изгиб деревянной, тонкой пластины.
Пропаривание: ожидание и реальностьДетали по размерам небольшие и их удается фрезеровать целиком из одной доски и впоследствии успешно изгибать с пропариванием, без расслоений и поломок. Таким образом это рабочая технология сборки флейт, но приходится вручную заниматься шлифованием места стыка трубок и обвязки на торцах.
Напечатанные панфлейты6) Пока итоговый вариант это 3d печать флейты целиком с использованием композитных пластиков, дерево-наполненным пластиком для обвязки, угле-наполненным пластиком для трубок и фотополимерным пластиком для вставок с торцов (лабиум).
Проект целиком печатаемой панфлейтыВзрыв-схемаПотребовались очередные корректировки генератора моделей. При этом для изготовления всех отдельных составляющих достаточно нажать на одну кнопку. А сборка напоминает конструктор лего, где все детали без усилий стыкуются друг с другом. Основной минус в ограниченном наборе возможных материалов.
Сборка трубок с обвязкой и лабиумом Пример целиком напечатанной панфлейты7) Так же хочется отдельно отметить изготовление пробок. Каждая пробка в зависимости от того, для какой ноты она предназначается, имеет свою степень вогнутости дна. Чем меньше длина трубки (чем выше нота), тем сильнее должна быть выпуклость.
3д модель силиконовых пробокВ целом все относительно просто. Изготавливается форма под литье силикона (фрезеровка, печать) и она заполняется силиконом.
Литье силиконаБудет очень удобно, если в пробки будут встроены петли, за которые специальным крюком их можно будет двигать для подстройки нот.
Наматывать карбоновые трубки на отполированные стержни с использованием технологии препрегов (проще, чем вакуумная инфузия), а не печатать их из угле-наполненного пластика [3]. Тогда получиться делать зеркальный внутренний канал.
Фрезеровать обвязку из ценных пород древесины по уже отработанной технологии с изгибом [4], что просто эстетически красиво и прочнее, чем напечатанный пластик.
Отливка из латуни лабиума (вставок с торцов) по технологии выжигаемых моделей [5], для долговечного ими удержания заточки.
Таким образом рендер 3d модели идеальной флейты Пана может выглядеть как-то так:
Проект идеальной панфлейтыУдалось получить достаточно автоматизированную технологию изготовления флейт Пана, в которой без дополнительных накладных расходов могут вноситься изменения хоть в каждую выпускаемую единицу товара.
Но не все еще идеально. Есть аспекты, требующие улучшений, в связи с чем планирую продолжать работу над проектом.
P.S.
Фото отчет: https://www.instagram.com/arra.lazur/
Видео материалы: https://www.youtube.com/channel/UCVlFogcnEd2hL9x5DVbyb8Q
Использованные источники:
[0] https://vplate.ru/flejta/pana/
[1] https://sites.google.com/site/radu63353/panflute-shop
[2] https://www.youtube.com/watch?v=CNRBoFL0U28&feature=emb_logo&ab_channel=BradWhite
[4] https://www.youtube.com/watch?app=desktop&v=k4uVozxt6vY&ab_channel=mtmwood
[5] https://lk-casting.ru/izgotovlenie-juvelirnyh-izdelij/
[6] https://3dvision.su/services/lite-plastmass/v-press-formy/
[7] https://woodjig.net/parovaja-gibka/
[9] https://prototechasia.com/en/plastic-cnc-machining/questions-cnc-machining
[10] https://www.youtube.com/watch?v=wMJ3b2QhFkk&ab_channel=World4Carp
[11] https://zakbus.ru/vakuumnaya-infuziya/
[12] Флейта Пана: инструмент и техника игры. Денис Климов. Стр 39.
Предыдущие уроки можно найти здесь:
На прошлом уроке мы затронули тему самостоятельного создания объектов для игр. В т.ч. была упомянута программа SketchUp, которую мы часто использовали, для создания простых строений.
Сегодня, мы создадим здание и перенесем его в Unity. Хочу обратить ваше внимание на то, что для импорта готового здания, необходимо, чтобы SketchUp стоял на том же ПК. Без программы Unity не сможет импортировать модель.
Откроем SketchUp и выберем шаблон Simple Template - Meters.
Выберем инструмент фигуры и нарисуем на земле квадрат по форме дома.
Теперь, выдавим его с помощью инструмента выдавить/вдавить (push/pull).
Сделаем стены. Для этого используем инструмент Сдвиг (Offset).
Повторим операцию ещё раз.
Образовалась довольно узкая рамка, которую можно использовать для создания стен. На этом этапе стоит добавить все запланированные перегородки.
Лишние линии убираются инструментом Ластик (Erase).
Выдвигаем стены.
Прорежем двери и окна. Для начала по периметру дома создадим направляющую линию. Последней линией контур не замыкаем, иначе образуется новая плоскость.
Нарисуем на стене квадрат и выделим его.
Нажимая Ctrl+C и Ctrl+V, копируем его по стене, привязывая к линии.
После копирования окон лишнии линии стираем.
С помощью инструмента Вдавить/выдавить вдавливаем окно до состояния "На грани" (On Face).
Теперь, инструмент запомнил глубину и можно вырезать окна двойным кликом.
Вырежем дверь похожим образом.
Используем инструмент "Ведёрко" (Paint Bucket) для наложения текстур. Выберем подходящую текстуру и зальём пол с фундаментом.
Аналогично поступим со стенами.
Чтобы наложить текстуру на замкнутый контур, нажмём Shift, чтобы наложить на все плоскости, имеющие такую же текстуру Ctrl.
Текстура на стену легла не идеально. Перейдём в свиток Текстура-Позиция, и перетягивая красный ползунок мы изменим позицию текстуры, а зелёным её размер.
Сейчас текстура этой стены отличается от остальных стен. Используем клик левой кнопки мыши по этой стене с зажатым Alt на инструменте "Ведёрко", чтобы запомнить настройки текстуры на этой стене.
И красим инструментом "Ведёрко" остальные стены.
Перейдем к созданию крыши. Для этого нужно заблокировать данный участок от редактирования, чтобы ничего не испортить. Выделим дом и вызовем свиток меню "Сгруппировать".
На одном из торцов дома создадим плоскость для крыши.
Попрошу заметить, что мы вышли из группы кликом по пустому месту на экране. Если плоскость маленькая, её можно увеличить инструментом "Растянуть" (Scale).
Рисуем на плоскости очертания крыши. Лишние линии можно стереть.
Инструметом Выдавить/вдавить придаём объем.
Используем "Сдвиг" на крыше, чтобы добавить объёма.
И вдавим плоскость немного внутрь.
Окрасим всё подходящими текстурами и удалим человека. Домик готов для импорта в Unity!
В настройках импорта в Unity надо выставить галочку Generate Colliders, а во вкладке Material Use External Materials.
При этом, импортируются все материалы и создадутся папки.
Теперь, у вас есть своя собственная модель дома, для использования в играх!
Эпидемиология из-за некоторого стечения обстоятельств стала очень популярной за последний год. Интерес к моделированию эпидемий стал возникать у многих и уже всё больше людей знают о вездесущей SIR модели. Но есть ли другие подобные модели? Насколько сложно из вообще создавать и модифицировать? Но обо всём по порядку.
За несколько месяцев до появления первых новостей о COVID-19 я для себя, так скажем, в образовательных целях программирования, начал писать программу визуализации эпидемий. В этой простой программе кружочки разных цветов двигались по полю и заражали друг друга. Через полгода, каким-то образом это уже стало темой моей дипломной работы (специальность биоинженерия и биоинформатика) и пришлось по-настоящему вникать в математическое моделирование эпидемий для написания статей. Благо интернет вдруг стал наполняться эпидемиологическими материалами. Я это виду к тому, что работать я начал за некоторое время до того, как эпидемиология стала мейнстримом.
Прежде, чем обсуждать, свои разработки хотел рассказать немного о том, что узнал о математическом моделировании эпидемий.
Модель SIR, без упоминания которой не обходится почти ни одна статья по эпидемиологии, создана уже почти век назад. Она проста и элегантна, её много критикуют и много хвалят, как, собственно, любую сущность, которая применима лишь в определённых условиях и имеет свои допущения, о которых необходимо знать во время использования.
Я понимаю, что медиапространство заполнено всевозможными описаниями данной модели, поэтому я не побоюсь и добавлю ещё одно.
SIR модель. Всю популяцию, которая подвержена эпидемии, разделили на три группы: S (susceptible восприимчивые, то есть здоровые, не заразные, но могут заразиться, так как не имеют иммунитета), I (infected инфицированные, то есть болеют и заразны) и R (recovered выздоровевшие, то есть здоровые, не заразные и не могут заразиться, так как имеют иммунитет). Очевидно, что до начала эпидемии 100 % индивидов находятся в группе S (восприимчивые) и по нулям в остальных группах. Для удобства будем считать, популяция в 100 человек, соответственно S = 100, I = 0, R = 0. В таких условиях эпидемия, конечно, не пойдёт, так как чтобы она началась, должен быть хотя бы один больной. Поэтому рассмотри другую ситуацию: S = 99, I = 1, R = 0. Вот теперь начнётся эпидемия и её моделирование заключается в последовательном высчитывания состояния популяции на следующем шаге.
Дальше чуть сложнее, чтобы понимать сколько людей заразиться на каждом шаге, надо понимать наличие двух вероятностей: вероятность контакта между двумя индивидами и вероятность заразить при контакте инфицированного с восприимчивым (). Часто в модели для воплощения первой вероятности используют просто 1/N (N объём популяции), подразумевая, что в каждый момент времени каждый индивид контактирует с одним случайным индивидом в популяции. А вторая вероятность (), обеспечивает собственно биологический показатель заразности конкретного патогена (со всеми влияющим факторами: температура, наличие маски и т.п.).
Один инфицированный встретит и заразит в конкретный момент времени конкретного восприимчивого с вероятностью:
Тогда всего он заразит восприимчивых индивидов:
А все инфицированные вместе заразят восприимчивых
Таким образом, количество восприимчивых на втором шаге нашей модели уменьшиться на 0.99*.
Ещё инфицированные выздоравливают, тоже с какой-то вероятностью (), которую часто рассматривают как число обратное времени болезни. Имеется в виду, что если болезнь длится 10 дней, то больной индивид в конкретный день выздоровеет с вероятностью = 1/10. Получается количество выздоравливающих на каждом шаге будет равно:
Количество инфицированных на втором шаге, помимо того, что увеличится на 0.99* ещё уменьшится на 1*. Количество выздоровевших увеличится на 1*. Относительного полученного состояния будет высчитываться следующий шаг модели.
Таким образом модель формулируется следующими уравнениями:
О SIR модели слышали теперь довольно многие. О существовании других моделей слышало уже меньше людей. Часто всё-таки вспоминают SEIR модель, которую рассматривают как модификацию SIR.
SEIR модель учитывает инкубационный период (E exposed, индивиды болеют, но не заразны и со временем полностью заболеют). В такой модели заражение восприимчивых происходит таким же способом как в модели SIR, но попадают такие особи не в группу I, а в группу E. А из E с определённой вероятностью (, число обратное длительности инкубационного периода) происходит переход уже в I.
Существует ещё много модификаций SIR моделей. Все они, включая саму SIR, являются представителями целого класса моделей, которые называют компартментальными эпидемиологическими моделями. Упоминаемое выше разделение популяции на группы или компартменты (отсеки) как раз и обуславливает такое название моделей.
Сложность компартментальных моделей не ограничена тремя или четырьмя группами. Такие модели могут учитывать самые различные сценарии: введение карантинных мер (SIQR, добавляется группа Q quarantine), потеря иммунитета (SIRS, переход с некоторой вероятностью из R обратно в S), группы риска у восприимчивых (несколько групп S: S1, S2, , каждая из которых со своей вероятностью заражается), различные варианты течения болезни (несколько групп I: I1, I2, , в каждую из которых своя вероятность попадания восприимчивых особей, а также у каждой допустим своя заразность) и т.д. Ограничением здесь является только фантазия исследователя.
Сложные схемы компартментальных моделей часто описывают в виде графа переходов. Вот, например модель для туберкулёза из книги по эпидемиологии:
Схема распространения туберкулёзаРеализация компартментальных моделей заключается в описании уравнений переходов и последующем расчёте изменений каждого компартмента в течение какого-то периода.
В этом и заключается назначение разрабатываемой мной программы DEMMo. DEMMo Designer of Epidemic Math Models (конструктор эпидемиологических математических моделей). Конструированные модели организуется в объектно-ориентированном виде. Есть класс стадии (аналог компартмента), класс потока (обеспечивает переход индивидов между стадиями) и внешнего потока (прибавление/вычитание индивидов к/из стадии). Подробную инструкцию по использованию программы попытался написать в документации.
Результаты различных моделей, реализованных с использованием программыПрограмму писал на python. Интерфейс на PyQt5. Выложил исходный код программы на github (с git работал впервые) и архив с готовой версией для windows на гугл диск. Будем считать, что начинаю бета тестирование программы. Надеюсь, я хоть немного понятно объяснил и для тех, кому интересно, буду очень рад если программу жестоко поэксплуатируют. Вроде бы настроил систему создания отчётов об ошибках. Это мой первый крупный проект после задачек на ряды Фибоначчи и т.п.
Код очень плохо задокументирован, причём часть комментариев на
русском, а часть на английском. Знаю, что плохо, каюсь. Надеюсь
займусь этим. Если будут какие-то конкретные советы от матёрых
программистов, буду очень рад.
Контактная почта: demmo.development@gmail.com
Так уж вышло, что актуальность темы моего диплома резко возросла за последние полтора года. Надеюсь, мейнстрим никого не отпугнул и кому-нибудь было интересно и познавательно. Спасибо за внимание.
Вряд ли Лу Барбе осмелится назвать себя заядлым геймером. Он занимается проблемами экологии в Университете Ренна во Франции, проводя большую часть времени среди растений. Но одна игра с самого детства захватила его воображение: StarCraft популярная онлайн-стратегия, в которой игроки накапливают ресурсы и создают армии инопланетных бойцов для ведения войн на внеземных территориях. "Игрок из меня никакой, говорит Барбе, но я понимаю, что происходит в игре".
Несколько лет назад, играя в StarCraft II (последнюю версию игры), Барбе понял, что помимо всех взрывов и лазерных ударов в игре происходит что-то ещё. Он обратил внимание, что события в StarCraft развиваются точно так же, как развивается любая экосистема."В игре имеется среда, говорит Барбе. В игре имеются ресурсы и организмы, конкурирующие друг с другом в этой среде. Всё это очень хорошо подходит под определение экосистемы".
На этом идея Барбе пока и ограничилась. Но в 2019 году DeepMind, дочерняя компания Google Alphabet по исследованию ИИ, выставила интеллектуального агента под названием AlphaStar против лучших в мире игроков в StarCraft II. AlphaStar превзошёл в мастерстве 99,8% геймеров-людей, получив заветное звание гроссмейстера высший ранг в игре и дополнив тем самым список побед ИИ над людьми.
После этого Барбе пришло в голову, что способности AlphaStar могут не ограничиваться управлением действиями инопланетян на выдуманной планете. Если StarCraft функционирует подобно экосистеме, возможно, игровые алгоритмы могли бы помочь исследователям в изучении экологических проблем Земли?
В статье, опубликованной в журнале Trends in Ecology and Evolution в 2020 году, Барбе вместе с другими экологами из Реннского университета и Университета Бригама Янга объясняет, как способность AlphaStar управлять сложной многомерной динамикой StarCraft может применяться для проверки идей о динамике развития экосистем в реальном мире с решением этой задачи традиционные модели пока справиться не могут.
Например, исследователи могут запускать агентов AlphaStar на картах StarCraft, созданных для имитации реалистичного распределения ресурсов, и создавать модели, на базе которых можно получить представление, как различные организмы реагируют на такие отклонения, как возникновение инвазивных чужеродных видов или уничтожение среды обитания.
Алгоритм AlphaStar, говорит Барбе, возможно, непреднамеренно стал самой сложной экологической моделью из всех существующих.
Идея использования мощных инструментов искусственного интеллекта для анализа экологических проблем не нова. Ещё 1520 лет назад инструменты ИИ использовались в экологии относительно редко, но исследователи отмечают, что в последнее время наблюдается бурный рост применения ИИ в этой области от классификации видов диких животных до прогнозирования увеличения популяций жуков в сосновых лесах.
По мнению экологов, инструменты ИИ в сочетании с новыми возможностями сбора большого количества данных о Земле позволят пересмотреть методы изучения экосистем и расширить возможности человека по прогнозированию таких изменений. В этих исследованиях могут помочь сложные алгоритмы, подобные AlphaStar, часто разрабатываемые для целей, не имеющих ничего общего с экологией.
"Сложность [большинства] экологических моделей ничтожно мала по сравнению со сложностью некоторых систем искусственного интеллекта, утверждает Бен Эббот, эколог из Университета Бригама Янга и соавтор статьи об AlphaStar. То, что умеем мы, экологи, не идёт ни в какое сравнение с тем, что умеют эти алгоритмы.
Для исследователей ИИ игра StarCraft II, вышедшая в 2010 году, стала сложным интеллектуальным вызовом. Так же как в шахматах или го, игроки StarCraft управляют различными отрядами, чтобы нападать на противников, но здесь игроки тоже выбирают, где и когда собирать ресурсы, когда создавать новые отряды, какие именно отряды создавать и тому подобное, и всё это в окружении множества посторонних факторов. В шахматах в одной позиции у игрока есть выбор из примерно 35 возможных ходов, в игре Go из 200250. Но в StarCraft II возможных ходов в одной позиции 1026. Кроме того, в отличие от игр, называемых теоретиками игр играми с "полной информацией", где все игроки могут видеть полное игровое пространство, события в StarCraft происходят на огромной карте, которую геймеры могут видеть лишь частично.
Дополнительная сложность состоит в том, что геймеры играют за одну из трёх инопланетных рас терранов, протоссов или зергов, каждая из которых имеет сильные и слабые стороны.
Чтобы натренировать алгоритм AlphaStar и создать ИИ, который способен брать верх над лучшими игроками в StarCraft II, исследователи DeepMind использовали методы машинного обучения. Они начали с того, что создали лигу интеллектуальных агентов, обученных на основе данных сотен тысяч матчей StarCraft, проведённых между людьми. Затем они заставили членов лиги виртуальных агентов играть друг против друга, отобрали самых сильных из них, внесли в них определённые коррективы и отправили обратно в лигу. Они повторяли этот процесс до тех пор, пока не придали AlphaStar силу джаггернаута, крушащего всё на своём пути. Ориол Виньялс, возглавлявший команду DeepMind создателя AlphaStar, сравнил саму лигу с некой экосистемой, в которой работает процесс естественного отбора. "Создавая лигу AlphaStar, мы черпали вдохновение из литературы об эволюции", рассказывает он.
Поведение медленно растущих терранов, одной из трёх инопланетных рас в StarCraft II, в экосистеме игры один в один напоминает поведение кактусов."Традиционные" исследователи ИИ черпали вдохновение в природе, Барбе же и его коллеги-экологи стали черпать вдохновение в игре. В своей работе, опубликованной в 2020 году, они подробно описывают глубокие параллели между расами терранов, протоссов и зергов в StarCraft, и конкурентными стратегиями, характерными для определённых видов организмов.
Например, отряды зергов это прирожденные колонизаторы, но слабые бойцы. Они ведут себя как сорные растения: мелкие, худосочные, хилые, но после нарушения экосистемы первыми дают ростки жизни именно они.Протоссы, с другой стороны, ведут себя как папоротники. Они расходуют много ресурсов и лучше всего растут в группах.Терраны напоминают кактусы: медленно растут, но прекрасно держат оборону. Как и в реальной экосистеме, эти "виды" используют собственные стратегии в борьбе за ресурсы в сложных схемах взаимодействия.
Барбе полагает, что наблюдение за взаимодействием между агентами AlphaStar в StarCraft может стать способом проверки гипотез об экологических и эволюционных процессах, которые обычные статистические модели смоделировать не в состоянии, например предсказать, как небольшое изменение доступных ресурсов в одном углу карты в StarCraft повлияет на поведение отрядов терранов и зергов, сражающихся в противоположном углу (правда, эту свою идею Барбе на практике ещё не проверял).
Представьте, что терраны и зерги это сосны и короеды, и вы поймёте, что такая информация может представлять довольно существенную ценность для специалистов по охране окружающей среды. Для учёных эта игра может стать песочницей экспериментов с экосистемами, рассказывает Барбе.
"Возникает весьма интересная игрушечная модель вы наблюдаете за очень упрощённой системой и можете задавать очень конкретные вопросы, говорит Энн Тессен, специалист по работе с данными из Университета штата Орегон, не имеющий отношения к работе по экологическому смыслу StarCraft. Просто нужно помнить, что вы имеете дело с моделью".
Надо признать, что StarCraft II при всей своей сложности намного проще реальной экосистемы. Барбе отмечает, что в игре никак не отражены базовые природные процессы, например азотный цикл, а также никак не затрагиваются ключевые отношения между организмами, например паразитизм. К тому же в мире StarCraft II всего три вида существ.
"Проблема, на мой взгляд, заключается в том, что игровая механика, призванная быть как можно более развлекательной, лишь частично отражает реальный физический мир", считает Вернер Раммер, эколог из Технического университета Мюнхена. Раммер утверждает, что делать выводы о способностях AlphaStar вне рамок StarCraft, лишь наблюдая за его игрой, какой бы сложной и замысловатой она ни была, преждевременно.
Однако независимо от того, будут ли экологи когда-либо использовать AlphaStar в своих исследованиях, следует признать, что для решения проблем экологии и науки об окружающей среде всё чаще используются всё более сложные инструменты ИИ.
Десять лет назад, рассказывает Тессен, применение ИИ в экологии и науке об окружающей среде в основном ограничивалось задачами классификации, например быстрой идентификацией видов при анализе записей пения птиц или типов ландшафтов на спутниковых снимках. Сейчас, по его словам, ИИ в экологии выходит за узкие рамки классификации объектов и берётся за более разнообразные и амбициозные задачи, такие как составление прогнозов через анализ неупорядоченных многомерных данных, то есть именно таких данных, с которыми обычно имеет дело экология.
Однако ИИ в экологии используется всё ещё недостаточно активно, полагает Николя Лекомт, сотрудник Канадской кафедры полярной и бореальной экологии и эколог Университета Монктона в Канаде, который использует инструменты ИИ для классификации звуков арктических птиц и прогнозирования их миграции.
Экологи, как правило, не имеют навыков программирования, необходимых для обучения алгоритмов искусственного интеллекта, объясняет он. С ним соглашается Эббот, добавляя, что сбор достаточного количества данных для обучения алгоритмов непростая задача. Некоторые данные получить довольно легко, например посредством анализа спутниковых снимков, однако сбор других данных может быть сопряжён с большими трудностями, например сбор образцов почвы.
Отчасти эти проблемы объясняются недостаточным финансированием и нехваткой квалифицированных экологов, говорит Эббот. Ведь экология, отмечает он, это не самая "монетизируемая" область науки.
Такие компании, как Blizzard, создавшая StarCraft, ежегодно тратят сотни миллионов долларов на разработку алгоритмов для своих игр, говорит он. У них просто гораздо больше ресурсов, чем у нас. Но мы, конечно же, считаем, что наши проблемы гораздо важнее их проблем". Хоть это и была шутка, но в ней кроется чистая правда, в конце концов, жизнь на Земле это далеко не игра.
Машинное обучение и искусственный интеллект продолжают всё глубже проникать в самые разные сферы знаний, находя для этого всё более неочевидные и нестандартные пути. Если вам интересны новые подходы к машинному и глубокому обучению, разнообразные эксперименты с моделями, а также лежащие в основе моделей алгоритмы, вы можете обратить внимание на курс "Machine Learning и Deep Learning", партнёром которого является компания NVIDIA.
Узнайте, как прокачаться и в других специальностях или освоить их с нуля:
Другие профессии и курсыПРОФЕССИИ
КУРС
"То что ясно всем, ещё кто-то должен сказать"
Типа эпиграфа, Google/Яндекс автора не сыскали
При построении модели какого-либо объекта её можно свести к представлению чёрного ящика с несколькими параметрами P(i), влияющими на выход T. Для сложного многомерного объекта это могут быть модели его "сечения" в различных плоскостях/смыслах.
В идеальном случае для получения информации, необходимой для построения модели, необходимо получить значения T для всех сочетаний его параметров, заданных с достаточно малым (равномерным) шагом в интервале значений, допустимом для каждого из параметров. Чем больше имеется точек по каждому параметру (и, соответственно, значений Т), тем точнее можно построить модель. Однако, в реальной жизни, зачастую оказывается что и параметры влияют по-разному и шаг по каждому из них разумнее делать не равномерным. Например, в начале допустимого интервала параметр слабо влияет на Т, а в середине или в конце его влияние меняется (и даже многократно) и, следовательно, шаг по такому параметру стоит делать иным.
Но в начале построения модели, когда информации о взаимосвязях мало, допустимый интервал значений каждого параметра разбивается с равномерным шагом. При повторном решении задачи построения модели объекта близкого или слабо изменившегося к ранее уже исследованному, особенность влияния его параметров можно учесть в задании неравномерного разбиения допустимого интервала. Это минимизирует количество необходимых для построения модели значений Т при сохранении полноты получаемой об объекте информации, используемой в модели.
Здесь следует обратить внимание на то, что существуют объекты, для которых стоимость/сложность/длительность получения каждого выходного значения T очень велики. Далее речь пойдёт именно о таких объектах и их моделях.
Процедура задания каждого нового значения параметра в процессе исследования такого объекта уже не может быть тривиальной (равномерный шаг), она высоко затратна, и должна учитывать, по возможности, всю уже имеющуюся информацию о поведении Т. Каждый выбираемый шаг/значение i-го параметра должен учитывать текущую его корреляцию с поведением Т. Это становится возможно, если на каждом шаге строить предварительную модель объекта заново, и это оправдано, учитывая стоимость/сложность/длительность получения каждого нового значения T.
Сформулирую вытекающий из вышесказанного подход к моделированию неизвестного в общем случае объекта (с описанной выше сложностью): сначала по априорным, физическим и/или уже имеющимся исходным данным строится грубая модель с примерно постоянным (крупным или какой есть) шагом по каждому параметру. Затем на каждом новом шаге вычисления/получения Т создаётся/уточняется модель на основе новой информации, и модель уточняется (пересчитывается) с получением каждого нового значения Т. На каждом шаге по текущей модели определяется оптимальный следующий шаг по каждому параметру. Оптимальный в том смысле, что новое значение Т будет приносить максимум новой информации об объекте на данном этапе знания о нём.
Способ определения оптимального следующего шага будет работать тем лучше, чем точнее будут аппроксимированы зависимости Т от каждого параметра в текущей (промежуточной) модели. Здесь встаёт задача (необходимость) распараллеливания вычислительных процессов. Пока идёт относительно длительное вычисление ответа Т, на основании ранее полученной информации об объекте выполняется вспомогательный процесс - построение/уточнение модели и определение следующего набора параметров для нового расчёта. Причём заранее неизвестно сколько времени будет доступно для этих расчётов - столько, сколько идёт вычисление ответа Т. Чем быстрее работает алгоритм генерации точек, на которых производится интерполяция и аппроксимация по имеющимся точкам и точкам, полученным от текущей (промежуточной) модели, тем лучшего качества/точности достигнет алгоритм выбора оптимального следующего шага. Этот алгоритм работает в цикле - сначала грубо определяется новый набор параметров для вычислений, потом, если не прервали, идёт его уточнение и т.д. до завершения определяющего процесса - вычисления ответа Т. Ему (определяющему процессу) передаётся набор/вектор новых параметров для расчёта, а полученная новая точка Т используется в уточнении модели и новой процедуре выбора следующего шага.
Конечно, доля вычислительных затрат на получение набора значений каждого параметра с заданным шагом (именно этот алгоритм является целью обсуждения настоящей статьи, назову его Z, чтобы отличать от других упоминаемых) обычно намного меньше затрат на остальные расчёты по выбору шага для оценки Т. Но предлагаемый к обсуждению алгоритм демонстрирует предельно малые вычислительные затраты и не влечёт недостатков или сложностей. Разумно его использовать во всех подходящих применениях, это почти ничего не стоит.
На примере простейшей функции одного переменного T(X) покажу алгоритм получения значений параметров (X) для последующей аппроксимации. Напоминаю, что тут речь идёт об относительно мало затратных вычислениях по промежуточной модели и оптимизировать расположение точек на интервале допустимых значений параметров нет необходимости, кроме разве краёв диапазона (см. ниже):
Сначала производится расчёт по модели T(X) на 3-х точках: Xmin, (Xmin + Xmax)/2 и Xmax, т.е. по краям и посередине допустимого интервала (Xmin, Xmax). Далее каждый отрезок делится пополам и вычисляются значения в серединах каждого отрезка и т.д. Следующий анимированный GIF демонстрирует процесс генерации первых 14 значений параметров для одномерного случая.
В среднем плотность точек, генерируемых алгоритмом Z, выше на краях диапазона, как и должно быть для лучшей аппроксимации. "В среднем" понимается с учётом того, что весь вспомогательный процесс подбора следующего шага (и работы алгоритма Z) может быть прерван в любой момент, если завершилось получение новой точки Т. Расчёт нового ответа Т начнётся по тому набору/вектору параметров (новый шаг), который к этому времени успел сделать вспомогательный процесс. Результат незаконченной итерации расчёта нового шага или отбрасывается, или таки завершается, если велико соотношение временных затрат на расчёт Т и завершение расчёта текущей итерации прогноза нового шага.
Описанный подход применялся и при поиске экстремума сложной функции многих переменных. Целью минимизации служила сумма квадратов отклонения точек, полученных по модели от экспериментально измеренных на некоем объекте.
Алгоритм Z несложно масштабируется на двумерную (и более) плоскость, демонстрируя даже снижение средних вычислительных затрат на точку для больших размерностей. Для одномерного случая при достаточно большом количестве точек, получаемых на интервале (Xmin, Xmax), вычислительные затраты стремятся к 3/2 операции сложения (или вычитания, считаем их эквивалентными) на точку. Более простыми операциями присвоения и организации циклов пренебрегаем, ибо цикл и так участвует в самой процедуре аппроксимации.
Для двумерного случая вычислительные затраты стремятся к (!) операции сложения.
Автор утверждает, что не существует более экономичного алгоритма с точки зрения вычислительных затрат на генерируемую точку.
Ожидаю обсуждения (хорошо бы с буквой "б", а не без) сообществом Хабра описанного выше подхода к решению задачи построения модели и, возможно, ответа на мой вызов (к сообществу) о предельных характеристиках описанного алгоритма Z. Во второй части статьи, если не будет предложено решения, оспаривающего первенство по вычислительным затратам моего алгоритма, изложу конкретное программное его решение для одно- и двумерного случаев исполнения.
Надеюсь, вселенная меня не остановит. :)
Архитектура ПО это Вселенная. Все очень сложно, но если все правильно, то все невероятно просто. Шаг за шагом познаю что и как. Ищу лучшие практики и шаблоны. В конечном счете, в очередной раз делаю одно и то же заключение:
Изученные правильные практики и шаблоны проектирования лишь вектор, который вдохновляет на красивые и уникальные решения.
Здесь нет примеров хорошей архитектуры, советов как должно быть и как правильно. Я просто хочу зафиксировать мысли, которые надо не забывать воспроизводить при решении очередной задачи.
Архитектура системы определяет скорость ее развития. Красивая и правильная архитектура вдохновляет работать и помогает команде разработки.
Вдохновляет простое. К простым и красивым решениям не всегда возможно прийти с первого раза. Ошибка тоже результат.
Если система проста и удобна внутри, то она так же проста и удобна снаружи. У пользователей меньше проблем, а значит и у разработчиков тоже.
Если у команды разработки нет уверенности в последствиях их доработки, и они не могут точно сказать на что она повлияет, то это начало плохих решений: дублирование кода, неявная логика и другие причуда.
Монолиты плохо, микросервисы не всегда хорошо, наносервисы плохо. При проектировании нужно держать баланс и рисовать логические границы. Помогут сценарии использования.
Объектная модель должна быть понятна не только разработчикам, но и пользователям.
Модель должна быть гибкой: позволять масштабировать решение, не вызывать проблем при развитии. Нужно прогнать на ней все известные сценарии, которые будут реализованы сейчас и могут быть реализованы в будущем.
При реализации объектной модели клиентам рекомендуется ориентироваться на модель сервер-приложения.
Упрощайте алгоритмы. Делите сложные части на простые. Не переусердствуйте.
Сначала продумайте тесты для алгоритма, получите альтернативные сценарии и предусмотрите обработку, а потом пишите сам алгоритм.
Если какая-то часть алгоритма многократно повторяется, то скорее всего она должна быть выделена в отдельный модуль и переиспользоваться. Отдельный модуль отдельный алгоритм.
Алгоритм должен легко читаться: в тексте, в любой нотации моделирования, в коде.
Не прячьте за методами в коде неявную логику. Неявные связи в реализации логики ведут к усложнению решения.
Когда отдельные части программы нельзя перекомбинировать в новое целое, значит создан неэффективный монолит.
Если назвать бокал стаканом, то назначение "пить" вроде бы не меняется, но что-то все-таки не то.
Имя объекта должно характеризовать его достаточно емко, не вызывать двусмысленности.
Метод должен реализовывать ровно то, о чем говорит его название. Название должно быть таким, чтобы другому разработчику не нужно было залезать внутрь и раскапывать, что еще здесь можно неожиданно встретить в реализации. Лучше, когда название метода описывает результат его работы, но не его реализацию.
Имена объектов и методов в конечном счете становится
языком команды разработки, заказчика ПО и даже
пользователей.
MVP это быстро и просто, это способ сдвинуться с мертвой точки и начать показывать результат.
MVP лучше, чем волшебное ничего и долгое обсуждение, как же все-таки надо сделать. Это отличный способ собрать фидбэк и неявные требования от пользователей, от других команд разработки, которые будут использовать ваше решение.
Это придется делать. Это нормально и это важно. Даже для задач, выпущенных в продакшн совсем недавно.
Своевременный рефакторинг ускоряет разработку. Больше времени сегодня на задачу, в рамках которой надо сделать рефакторинг, меньше времени на будущие задачи.
Заботьтесь о том, чтобы в будущем код не вызывал страха и отвращения к рефакторингу. С ним должно быть приятно работать. Если нет четкой и понятной архитектуры, то программисты будут бояться даже заглянуть в код, чтобы понять как это работает.
Рефакторингу может быть подвергнуто все, что связано с системой: код, модель данных, алгоритмы, тест-кейсы.
Документация к системе должна дополнять программный код и хранить знания о причинах принятых архитектурных решений.
Документация к системе позволяет без доступа к коду понимать, как работает программа: реализацию алгоритма, покрытие альтернативных сценариев, обработку ошибок. Но разработчикам должен быть понятен код и без документации на него.
Не усложнять.
Ничего не прятать.
Называть все своими именами.
Не стоять на месте.
Не поддаваться отчаянию, если не получилось.
Не забывать переосмысливать: смотреть через несколько дней свежим взглядом на готовое решение, если время позволяет.
В продолжение темы модельно ориетированного проектирования, публикую очередную статью Калачева Юрия Николаевича, автора книги Моделирование в электроприводе. Инструкция по пониманию.Данный текст еще готовится к публикации в специализированных издания, но читатели хабра увидят его первые.
В зарубежной литературе можно встретить два термина, связанных с этими двигателями:
PMSM(PermanentMagnetSynchronousMotor),что на языке Пушкина означает:синхронный двигательcпостоянными магнитами(СДПМ),и это понятно.
BLDC(BrushLessDirectCurrent),что переводится с языка Шекспира,какБесколлекторный(бесщеточный)ДвигательПостоянногоТока(БДПТ),и это непонятно.Причем здесь постоянный ток?
С этими названиями и у нас,и за рубежом существует немалая путаница.
Например,терминPMSM(СДПМ)может применяться для обозначения двигателя с постоянными магнитами на роторе,независимо от формы его ЭДС,на так же часто его применяют,подразумевая исключительно синусоидальную форму ЭДС двигателя.
ТерминBLDC(БДПТ)может применяться для обозначения двигателя с постоянными магнитами на роторе и трапецеидальной ЭДС,а может вообще обозначать не двигатель,а некий мехатронный узел,включающий в себя:
двигатель с постоянными магнитами и трапецеидальной ЭДС
датчик положения ротора
управляемый по сигналам этого датчика полупроводниковый коммутатор.
Собственно этот мехатронный узел,который может,как и двигатель постоянного тока,управляться постоянным напряжением и породил сам терминBLDC(БДПТ).
Ещё по отношению к синхронным двигателям с постоянными магнитами на роторе в отечественной литературе,можно встретить названиевентильный двигатель.
Попытки автора разобраться с этим термином быстро зашли в тупик,так как в различных источниках обнаружились явные противоречия.
Например,в книге Г.Б.ОнищенкоЭлектрические двигателина стр. 47 вентильнымназывается двигатель соответствующий терминуBLDC(БДПТ),что предполагает трапецеидальную ЭДС,и это понимаемо.
Но двигатели типа5ДВМ сам производитель(ЧЭАЗ)называетвентильными,хотя при этом утверждает,что они имеют синусоидальную ЭДС.
А вот википедия: Вентильный двигатель следует отличать от бесколлекторного двигателя постоянного тока(БДПТ),который имеет трапецеидальное распределение магнитного поля в зазоре....
Ну, ...приехали...
Какой термин,какой форме ЭДС соответствуетнепонятно.
А между прочим,именно эта форма определяет выбор структуры системы управления двигателем.
Как человек занимающийся управлением этими двигателями хочу предложить:
во избежание путаницы забыть терминвентильный двигатель
термином БДПТ обозначать не двигатель,а исключительно описанный выше мехатронный узел(аналог двигателя постоянного тока)
делить синхронные двигатели с постоянными магнитами на роторе (СДПМ)по типу ЭДС на две группы:
1) с синусоидальной ЭДС(далее,для краткости, -СДПМс)
2) с трапецеидальной ЭДС(далее,для краткости, -СДПМт)
При управлении двигателями с синусоидальной ЭДСиспользуется векторное регулирование(подробно описано в книжке по ссылке). С точки зрения возможностей и качества управления это наилучший вариант.
Однако идвигатели с трапецеидальной ЭДСв силу более простой конструкции статорных обмоток и возможности более простого управления применяются довольно часто.
Ротор синхронных двигателей обоих типов устроен одинаково.Он представляют собой магнит с различным количеством пар полюсов.
А вот конструкция статорных обмоток,которая собственно и определяет форму ЭДС,у разных типов различна(см.Рис1.).
Рисунок 1. Конструкции статорных обмотокСтаторная обмотка двигателя с трапецеидальной ЭДС проще и технологичнее,за счёт этого цена такого двигателя несколько ниже.
Далее остановимся более подробно на двигателе с трапецеидальной ЭДС(СДПМт)
Двигатель с одной парой полюсов будет выглядеть в разрезе так,как показано на Рис.2.
Рисунок 2. Схема двигател с одной парой полюсов я в разрезеНа статоре СДПМт намотаны три обмотки(А,В,С),сдвинутые в пространстве на120.Каждая обмотка состоит из двух секций,включённых встречно.Таким образом,при протекании тока в обмотке она создаёт внутри двигателя два полюса(положительный и отрицательный),к которым и притягивается магнитный ротор.Поочередное изменение токов в обмотках переключает полюса обмоток и заставляет ротор двигаться вслед за полем.На этом и основан принцип работы двигателя.
В дальнейшем будем считать нулевым то угловое положение роторапри котором вектор потока ротора совпадает по направлению с осью фазыА(осью обмоткиА).
Уравнения равновесия статорных обмоток двигателя при его включении взвездув неподвижных фазных координатахАВСимеют вид(1).
Здесь:
-фазные напряжения
-потокосцепления фазных обмоток
-токи фаз
- активное сопротивление фазной обмотки.
Поток в обмотке каждой фазы формируется из следующих составляющих:
поток,наводимый собственным током фазы
поток,наводимый магнитными полями других фазных обмоток
поток,наводимый в обмотке магнитами ротора.
Проиллюстрируем это системой(2):
Где:
-индуктивность фазных обмоток
-взаимные индуктивности обмоток
-потокосцепления, наводимые в обмотках магнитом ротора.
В общем случае все индуктивности системы(2)могут являться переменными функциями угла поворота поля.
В частном случаеВ частном случае для неявнополюсного двигателя(при цилиндрическом роторе)индуктивности и взаимные индуктивности обмоток не зависят от угла.
Обозначив
- индуктивность фазной обмотки,
-взаимная индуктивность двух фазных обмоток,
и подставив выражения(2)в систему(1),получим выражение(3):
Заметив,что производные по времени от потокосцеплений магнитов ротора
- есть не что иное,как наводимая магнитами
ротора в этих обмотках ЭДС,систему(3)можно переписать в виде(4).
Теперь введем понятие единичной функции формы ЭДС.
Единичная функция формы ЭДС-это функция от угла поля(), имеющая единичную амплитуду и повторяющая по форме ЭДС. Для фазА,В,Собозначим эти функции: обозначим эти функции .
Используя единичные функции формы,мгновенные ЭДС в фазах можно представить выражением(5):
Где:
-амплитуда потокосцепления ротора и фазной обмотки
- скорость вращения поля
- скорость вращения ротора
- число пар полюсов двигателя.
Зависимости единичных функций формы ЭДС обмоток СДПМт от угла поворота поля представлены На Рис.3.
Рис. 3. Единичные функции форм ЭДСМомент,создаваемый двигателем,является суммой моментов,создаваемых его обмотками.
Посмотрим на уравнение равновесия обмоткиАиз системы(4).
Умножив обе его части на ток обмотки,получим уравнение для мгновенной электрической мощности обмотки:
Рассмотрим составляющие этой мощности:
- реактивная мощность обмотки
- активная мощность, рассеивающаясяв обмотке
- мощность,создающая электромагнитный момент.
Если пренебречь потерями при переходе электрической мощности в механическую,то можно записать:
Где:
- электромагнитный момент двигателя
- угловая скорость вращения ротора.
Подставив в формулу(6)значения ЭДС из соотношений(5),получим формулу вычисления электромагнитного момента ротора(7).
В соответствии с формулой(7)момент СДПМт пропорционален сумме произведений фазных токов на функции формы соответствующих ЭДС.
Максимальное значение ЭДС обмотки соответствует плоским участкам трапеции ЭДС.Если бы нам удалось на этих участках угловой траектории сформировать в обмотках токи некоторой постоянной амплитуды,например,совпадающие по знаку со знаком ЭДС,то это позволило бы сформировать при этих токах максимальный постоянный положительный момент.
Для примера рассмотрим на Рис.3участок угловой траектории от /6до /2.На этом участке ЭДС в фазеАимеет максимально отрицательное значение,а в фазеВмаксимально положительное.Следовательно,для получения положительного момента на этом участке угловой траектории надо обеспечить в фазеАотрицательное,а в фазеВположительное значение тока.Для этого фазуАможно подключить на отрицательный,а фазуВна положительный полюса внешнего источника постоянного напряжения(Udc).При этом фазаСне используется(отключена от источникаUdc).
Величина тока,протекающего через обмотки,будет в свою очередь определяться прикладываемым к обмоткам напряжением,величиной ЭДС и параметрами обмоток.
Если рассуждать таким образом,то можно составить таблицу коммутаций обмоток,обеспечивающих в зависимости от положения ротора момент нужного знака(Табл. 1).
Таблица1. Закон коммутацииОбмотки трёхфазного двигателя можно коммутировать на внешний источник напряжения с помощью трехфазного мостового инвертора.Для этого состояние инвертора надо поставить в зависимость от положения ротора.Обычно это делается с помощью датчика положения ротора(ДПР).Этот датчик имеет три канала.Каждый канал выдает за один оборот двигателя импульс,соответствующий половине периода вращения,при этом импульсы в каналах сдвинуты на120.
Логическая обработка сигналов ДПР позволяет определить-в каком из шести секторов в данный момент находится ротор.
Работа ДПР поясняется Табл. 2.
Таблица 2. Работа ДПР (определение сектора)ОпределяющАлгоритм,описанный в Табл.1,предполагает протекание одного и того же тока в двух фазах двигателя при единичном значении функции формы ЭДС в обмотках фаз.Поэтому выражение(7)можно переписать в виде(8).
Где: - значение тока в фазах.
То есть значение момента пропорционально величине тока в обмотках двигателя.
Вытекающая из формулы(8)структура системы управления моментом в приводе с СДПМт изображена на Рис.4.
Рисунок 4. Система управления моментом БДПТДанная структура позволяет получить нужный момент,формируя в обмотках двигателя ток необходимой амплитуды,при сохранении алгоритма коммутации(Табл.1).
Эта задача решается с помощью создания на базе трёхфазного мостового инвертора контура тока с ШИМ.
Регулятор тока(ПИ-рег.)формирует сигнал задания напряжения обмоток(U),которое затем реализуется инвертором с ШИМ в соответствии с алгоритмом коммутации(Табл.1).
В качестве сигнала обратной связи в контуре можно использовать трёхфазно-выпрямленные сигналы датчиков тока фаз или сигнал датчика тока в звене постоянного тока инвертора().
На основе рассмотренного канала управления моментом можно строить внешние контуры управления скоростью и положением.
Если бы токи в обмотках спадали до нуля и нарастали до нужного уровня мгновенно,то момент двигателя,определяемый их величиной,в установившемся режиме был бы постоянным.В действительности же реальные переходные процессы при коммутации обмоток приводят к пульсациям момента.В зависимости от параметров обмоток,а также соотношения величин текущей ЭДС и напряжения звена постоянного тока эти пульсации могут быть различны по длительности,амплитуде и знаку.
Кроме этих коммутационных пульсаций в рассматриваемой системе также будут иметь место пульсации момента на частоте ШИМ.
Ниже приведен пример работы модели системы регулирования скорости.Данная модель построена в средеSimInTehcна элементах специализированного тулбоксаЭлектропривод.Среда позволяет получить максимальное приближение моделируемых процессов к реальности с учетом эффектов временной и уровневой дискретизации.
Часть модели,а именно-модель цифровой системы управления скоростью приведена ниже,на Рис.5.Регулятор скорости системы(Рег.W)выдает сигнал момента,который отрабатывается структурой,построенной в соответствии с Рис.4.
Рисунок 5. Модель цифровой системы управленияДля управления был выбран двигатель со следующими параметрами:
Rs = 2.875Ом-сопротивление обмотки фазы;
Ls = 8.5e-3Гниндуктивность фазы;
F = 0.175Вбпотокосцепление ротора;
Zp = 4-число пар полюсов;
Jr = 0.06 нм- момент инерции ротора.
Напряжение в звене постоянного тока привода было принято равным100В.
В контуре тока электропривода использовалась ШИМ с частотой5кГц.
В процессе регулирования происходило ступенчатое увеличение частоты при постоянном моменте сопротивления на валу двигателя(10Нм).
Графики,полученные в процессе работы модели,приведены на Рис.6.
Рисунок 6. Моделирование работы двигателяНа графике момента видны существенные пульсации.
Отметим,что в основном они связаны именно с переходными процессами при коммутации обмоток и имеют соответственно частоту,ушестеренную по отношению к заданной.
Пульсации,связанные с ШИМ,в данном случае,невелики.
Заметим,что коммутационные пульсации существенно возрастают при увеличении момента,что связано с увеличением тока.
Несколько спасает то,что их влияние на скорость снижает инерция.
Если очень хочется-то можно.
Однако и здесь не без особенностей.
Математика и структура стандартной векторной системы управления
исходит из синусоидальности поля в зазоре.При трапецеидальной ЭДС
это условие нарушается,правда не очень сильно(трапеция это же почти
синус).
А результатом этогопочтибудут,опять же,пульсации момента.
Вид части модели относящейся к цифровой системе векторного управления в средеSimInTechпоказан на Рис.7.
Рисунок 7. Часть модели векторного управления.Ниже на Рис.8показан график работы модели уже рассмотренного ранее СДПМт работающего в рассмотренном ранее режиме,но под управлением векторной системы.
В графике момента мы опять наблюдаем пульсации(хотя по сравнению с предыдущим вариантом они несколько уменьшились).
Причины пульсации при векторном управлении и управлении по ДПР различны,но частота все та жеушестеренная по отношению к заданной.
Заметим,что вследствие несинусоидальности ЭДС токи в обмотках двигателя так же будут принципиально несинусоидальными(это так,хотя в масштабе рисунка и не слишком заметно).
Рисунок 8. Работа двигателя при векторном управленииС точки зрения автора можноно не нужно.
Наряду с коммутационными пульсациями момента синусоидальность ЭДС(отсутствие плоской вершины трапеции)в данном случае неминуемо вызовет еще и дополнительные пульсации,снижающие качество регулирования даже по сравнению с управляемым по ДПР двигателем СДПМт.
Для подтверждения этого тезиса ниже(Рис.9)приведены графики работы модели двигателя с уже рассмотренными ранее параметрами,но с синусоидальной ЭДС и векторной системой управления скоростью.
Видно,что пульсации момента в этом случае практически отсутствуют.При правильной настройке регуляторов системы они связаны только с ШИМ-преобразованием и для данного случая почти не видны.
Рисунок 8. Работа двигателя с синусоидальной ЭДСДля синхронников с страпецеидальной ЭДС-коммутация по ДПР.
Так же возможно использование и более сложного векторного алгоритма регулирования,что может дать снижение уровня пульсации момента.
Для синхронников с синусоидальной ЭДСлучший вариант это векторное регулирование.
Это сочетание идеально для построения точного электропривода(что собственно и так было понятно).
Калачёв Ю.Н.
Модели для самостоятельного изучения можно взять здесь.
Предыдущие статьи по теме:
Модельно ориентированное проектирование. Электропривод с бесколлекторным двигателем постоянного тока
Список литературы
[1]А.С.ПушкинПолтава.
За уже несколько десятков лет существования индустрии информационных технологий создана значительная теоретическая база. Множеством ассоциаций и организаций разработаны своды знаний и методологии в различных областях.
Вот некоторые из них:
BABOK (A Guide to the Business Analysis Body of Knowledge) - руководство к своду знаний по бизнес-анализу от Международного института IIBA (International Institute of Business Analysis)
SWEBOK (Software Engineering Body of Knowledge) - международный стандарт ISO/IEC TR 19759 от 2015 г., в котором описана общепринятая сумма знаний о программной инженерии
SEBOK (Systems Engineering Body of Knowledge) - свод знаний в области системной инженерии, разработанный организацией BKCASE, которая контролируется Управляющим советом, состоящим из трех ассоциаций (т.е. Международного совета по системной инженерии, Центра исследований системной инженерии и Компьютерного общества IEEE)
BPM CBOK (Guide to the Business Process Management Body of Knowledge) - свод знаний по управлению бизнес-процессами Ассоциации профессионалов управления бизнес-процессами (ABPMP)
PMBOK (Project Management Body Of Knowledge) - свод профессиональных знаний по управлению проектами института управления проектами PMI
сертификация IREB CPRE (certification in Requirements Engineering) Foundation Level - методология инженерии требований сообщества IREB.
Эти документы не сложно найти на просторах интернета, однако, чтобы изучить их потребуется значительное количество времени. Сотни страниц сухого текста: определения, классификации, зачастую, отсутствует русский перевод все это препятствует усвоению ценного материала, изложенного в источниках. Для систематизации и использования в работе такого объема информации требуется представление знаний в более удобном для восприятия и сжатом виде.
На текущий момент существует множество способов представления знаний: семантические сети, фреймы, языки и нотации и др. (Википедия).
Один из этих способов можно было бы использовать для конспектирования изученного материала в виде модели знаний с целью:
извлечь существенные понятия о концепциях, описанных в своде знаний
получить структурированное системное представление о связях между концепциями
обеспечить быстрый доступ к изученной информации, чтобы в дальнейшем быстро и удобно использовать ее в работе.
Cводы знаний и методологии инженерии требований и системного анализа описывают процессы, техники и подходы, применяемые в проектировании и создании информационных систем.
А раз это процессы, то классический подход к такой модели - ответить на основные вопросы:
кто? - какие действующие лица с какими наборами компетенций выполняют активности в процессах
как? - какие активности, техники и события включают в себя процессы, в какой последовательности выполняются; кроме описания самих активностей важно отразить:
ключевые принципы, на которых базируются активности
ключевые свойства и аспекты активностей
основные ограничения
определения и факты, связанные с процессами
что? - какие поставляемые результаты и прочие сущности являются результатом активностей или поступают на вход активностей
зачем? - какую ценность вносят активности и процессы в общий процесс инженерии требований и системного анализа.
Кроме того, между концептами системы важно отразить связи:
структурные - отношение к группе, связь части и общего
зависимости - влияние концептов друг на друга или операции, связывающие концепты друг с другом
динамические - обозначить последовательность выполнения, направление потока информации
обобщение и специализация - связь между абстрактным и конкретным представлением одного концепта, отразить наследование.
Для практической реализации модели потребуется простой и удобный в использовании инструмент, который смог бы визуально (в графической форме) представить выявленные концепции, определения и связи.
Далее описана попытка представить методологию инженерии требований сообщества IREB в виде модели знаний в нотации ArchiMate.
Нотация ArchiMate предназначена для описания архитектуры информационных систем, имеет собственное бесплатное кросс-платформенное программное обеспечение и описывает широкий спектр аспектов информационных систем на различных слоях (уровнях абстракции) системы: стратегия, бизнес, приложения, технологии, производство, реализация и переходы, мотивация. Позволяет описать пассивную и активную структуру системы, ее поведение, различные типы связей между элементами.
Некоторые примеры описания модели знаний элементами нотации Archimate:
1. Активности, группы активностей и связи между ними
Цель описания: ответить на вопрос Как? - описать последовательность и структуру выполняемых в процессе активностей, а так же применяемые техники.
С помощью элемента слоя реализации Пакет работ (Work Package) можно отразить активности и техники используемые в процессах.
Связь Композиция (Composition) отражает то, что одна активность является частью более крупной группы активностей. Связь Триггер (Triggering) позволяет отобразить последовательность выполнения активностей.
Например, процесс организации работы с требованиями включает в себя активность по управлению жизненным циклом, которая состоит из последовательности этапов: Определение моделей жизненного цикла Контроль переходов и т.д.
Элемент Ценность (Value) позволяет указать ценность или преимущества использования активности в общем процессе и ответить на вопрос модели Зачем?.
2. Результаты активностей
Цель описания: ответить на вопрос Что? - описать основные ключевые результаты активностей и процессов, информационные потоки.
Результаты активностей описываются элементом Поставляемые результаты (Deliverable).
С помощью связи Реализация (Realization) отражается - какая активность создает поставляемые результаты. Связь Доступ (Access) позволяет показать чтение или запись информации из/в поставляемые результаты. Связь Поток отражает факт передачи информации (без конкретизации сущностей) между активностями или событиям.
Например, результатом активности по выявлению заинтересованных сторон являются списки заинтересованных сторон, которые поступают на вход активности по выявлению требований. Кроме того, активность по выявлению требований использует информацию о потребности к изменениям.
3. Свойства активностей
Цель описания: отразить основные принципы, свойства, ограничения и аспекты активностей, а так же определения, связанные с ними.
Используя элементы слоя мотивации ArchiMate можно описать ключевые свойства, аспекты, определения и ограничения, связанные с активностями и поставляемыми результатами системы.
С помощью элемента Требование (Requirement) описываются свойства или аспекты, связанные с активностью или поставляемыми результатами процесса. Элемент Принцип (Principle) позволяет описать ключевые принципы, связанные с активностью. Элемент Понятие (Meaning) можно использовать для описания ключевых понятий и определений.
С помощью связи Ассоциация (Association) описанные артефакты связываются с активностями и поставляемыми результатами.
Например, процесс инженерии требований имеет Ключевые аспекты процесса RE (декомпозируются в отдельном представлении) и основывается на девяти ключевых принципах. Принцип 4. Контекст связан с концептом Контекст (само определение дано в описании элемента).
Факторы, каким то образом ограничивающие пространство свойств или оказывающие влияние на свойство отражаются элементом Ограничение (Constraint), а само влияние отражается связью Влияние (Influence).
4. Взаимосвязи между активностями и выполняющими их сущностями: роль или актор являются ответственными или выполняют некоторые активности
Цель описания: ответить на вопрос Кто? - описать наборы компетенций и основных действующих лиц, участвующих в процессах.
Элемент Роль (Business Role) позволяет отразить набор компетенций или зону ответственности, связанных с активностью. Элемент Актор (Business Actor) представляет бизнес-сущность, выполняющую активность. Это может быть как конкретное лицо, так и структурные единицы, например, подразделения.
С помощью связи Назначение (Assignment) устанавливается связь между соответствующим активным элементом и активностью, им выполняемой.
Например, Заинтересованные стороны формируют Потребность в изменениях, запускающую процесс инженерии требований, который выполняет роль Инженер по требованиям, обладающая некоторым набором компетенций (указаны в описании).
5. Структурные связи между сущностями. Обобщение и специализация
С помощью связи Агрегация (Aggregation) однотипные элементы могут быть объединены в группы, организованные в сложные иерархии. На схеме элементы могут отражаться как отдельные элементы, связанные между собой, так и располагаться в границах родительского элемента. Например, в группу ключевых аспектов процесса инженерии требований входит аспект Требование и время, который, в свою очередь, включает аспект Спецификация, ориентированная на риск.
С использованием связи Композиция (Composition) отображаются случаи, когда один элемент является неотъемлемой частью другого (не может существовать без него). Например, активность по обучению пользователей является частью процесса выбора CASE-инструмента.
Отразить связь между абстрактным концептом и его конкретными реализациям позволяет связь Специализация (Specialization). Например, к концепту Модель относятся модели системного контекста, которые в свою очередь могут быть реализованы как DFD-диаграммы или UML-варианты использования.
6. Что еще может Archi
К каждому элементу может быть составлено описание или дано текстовое уточнение.
В состав ArchiMate входит инструмент для просмотра всех связей выбранного элемента. Глубина связей может настраиваться.
В состав Archi входит плагин, который позволяет выгрузить модель в html-формат для размещения на сайте с минимальными доработками. В формате реализована навигация по модели: переходы от представления к представлению по щелчку на ссылку представления, отображение описания по выбранным элементам.
Методология инженерии требований сообщества IREB описана моделью представления знаний в формате ArchiMate. Результат здесь:
Что удалось:
в графической форме представить знания об инженерии требований
выделить основные концепции, связи между ними и зафиксировать описание ключевых определений
реализовать простой и удобный доступ к модели в интернете.
Какие остались вопросы:
для описания активностей и поставляемых результатов использованы элементы реализации, что ограничивает применение типов связей между элементами схемы; возможно было бы лучше использовать элементы для описания бизнес-процессов
область применения модели - достаточность для описания других областей знаний системного анализа
возможность описания в одной модели нескольких сводов и методологий; например, в описанной методологии не выделен отдельно процесс анализа требований, что ограничивает возможность совместить эту модель с областью знаний о системном анализе в целом.
Данная статья описывает небольшой пример того, как использование языка моделирования Alloy может помочь при разработке программного обеспечения.
В Typeable мы придаем огромное значение качеству программного обеспечения и прикладываем все усилия, чтобы обеспечить это качество. В настоящее время мы искореняем ошибки следующими способами:
Такое большое число шагов обеспечивает высокое качество кода, но при этом сказывается на затратах. Для выполнения этих шагов нужно и время, и труд.
Один из способов сокращения этих затрат заключается в выявлении ошибок на ранней стадии. По грубой оценке, если система типов обнаруживает вашу ошибку, это происходит в течение 30 секунд после сохранения файла. Если ошибка найдена во время CI, получение информации об ошибке займёт до 30 минут. Кроме того, после исправления ошибки вам придётся ждать еще 30 минут, пока CI не отработает снова.
Чем дальше вы продвигаетесь по цепочке, тем длиннее становятся эти перерывы и тем больше ресурсов уходит на исправление ошибок: чтобы достигнуть этапа QA-тестирования могут потребоваться дни, после чего инженер-тестировщик еще должен будет заняться вашей задачей. А если на этом этапе будет обнаружена ошибка, то не только тестировщикам придется снова провести тесты после исправления ошибки, но и разработчики опять должны будут пройти все предыдущие стадии!
Итак, каков самый ранний этап, на котором мы можем выявить ошибки? Удивительно, но мы можем существенно повысить шансы на выявление ошибок ещё до того, как будет написана первая строка кода!
Вот здесь появляется Alloy. Alloy это невероятно простой и эргономичный инструмент моделирования, позволяющий строить пригодные для тестирования спецификации на системы, для которых вы только собираетесь писать код.
По сути, Alloy предлагает простой язык для построения абстрактной модели вашей идеи или спецификации. После построения модели Alloy сделает всё возможное, чтобы показать вам все проблемные места в рамках вашей спецификации. Также можно провести проверку всех свойств модели, которые вы сочтете важными.
Давайте приведем пример. Недавно у нас возникла неприятная проблема со следующим куском кода:
newAuthCode :: (MonadWhatever m) => DB.Client -> DB.SessionId -> m DB.AuthorizationCodenewAuthCode clid sid = do let codeData = mkAuthCodeFor clid sid void $ DB.deleteAllCodes clid sid void $ DB.insertAuthCode codeData return code
Здесь реализовывался обработчик HTTP-запроса и предполагалось, что функция будет обращаться к базе данных, удалять все существующие коды авторизации пользователя и записывать новый. По большому счету, код именно это и делал. Однако он также медленно заполнял наши логи сообщениями нарушение требования уникальности (uniqueness constraint violation).
Как это получилось?
Проблема, указанная выше, представляет собой хороший пример
задачи для Alloy. Давайте попробуем представить ее, построив
модель. Обычно мы начинаем моделирование конкретной проблемы с
описания нашего представления об операциях newAuthCode
для Alloy. Иными словами, необходимо сначала построить модель
операций, затем дополнить ее, построив модель базы данных и
привязав поведение базы данных к операциям.
Однако в данном случае оказывается, что для выявления проблемы достаточно просто формализовать представление о том, как могут выглядеть наши операции.
Процесс, описанный в приведенном фрагменте кода, имеет две интересующие нас части. Он производит удаление в некоторый момент времени, а затем вставляет новый токен в другой момент времени. Вот одна из моделей Alloy, используемая для описания этого поведения:
open util/time // Импортируем предопределённые объекты Timesig Operation // У нас есть операции... { delete : Time // ...которые удаляют в какой-то момент времени , insert : Time // ...и производят вставку в какой-то другой } { lt[delete,insert] // Удаления происходят до вставок lt[first,delete] // По техническим причинам в первый // момент времени ничего не происходит } run {some Operation} for 4 // Показать произвольный пример модели // с <= 4 операциями
Приведенная выше модель описывает систему абстрактных объектов и
отношений между этими объектами. Выполнение модели далее приведет к
образованию произвольного пространства, содержащего некоторые
операции Operation
, которые распределяются по
определенным правилам.
Если вы хотите проследить этот процесс, скачайте alloy и скопируйте в него приведенный выше фрагмент кода. Затем нажмите 'execute' и 'show', чтобы получить модель следующего вида:
Чтобы Alloy показал другие модели, можно нажать 'next'.
Вот один из таких случайных экземпляров, представленный в виде таблицы отношений (нужно несколько раз нажать 'next и выбрать вид 'Table'):
this/OperationdeleteinsertOperation Time Time Operation удаляет в момент Time и вставляет в момент TimeOperation Time Time Operation удаляет в момент Time и и вставляет в момент Time ОЙ!
Как правило, на данном этапе мы начинаем моделировать таблицы базы данных и семантику операций, но оказалось, что Alloy уже смог показать, почему наши логи содержат нарушение требований!
Обращения к нашему обработчику происходят одновременно, и последовательности операций накладываются друг на друга: есть две операции, обе из которых производят удаление примерно в одно и то же время, а затем обе делают вставку в одно время. Кроме того, поскольку это не считывание, уровень изоляции по умолчанию postgresql ничего не делает, чтобы остановить этот процесс.
Проблема найдена!
Как только я нашел причину проблемы, я написал для нее следующее исправление.
code <- run $ do handleJust constraintViolation (launchPG $ selectCodeForSession clid scope sid (launchPG . pgWithTransaction $ newAuthCode clid scope sid)
Моя идея заключалась в том, что если операции действительно
накладываются, а вставка действительно не срабатывает, то мы знаем,
что новый код авторизации только что был вставлен. Следовательно,
мы можем просто сделать select
и вернуть этот
существующий код, так как он был создан всего моментом ранее.
Давайте быстро построим модель Alloy для нашего исправления, чтобы проверить его корректность:
open util/time // Импортируем Timesig Token {} // Объекты с названием Tokenone sig DBState // База данных с токенами {userToken : Token lone -> Time} // В БД не более одного токена в каждый момент врвмени // (т.к. ограничения БД не позволяют хранить больше одного)sig Operation { delete : Time , insert : Time , select : Time // Наши операции теперь могут выполнять select}{ lt[first,delete] // Ничего не происходит в первый момент времени // по техническим причинам lt[delete,insert] // Первой выполняется операция delete lte[insert,select] // select выполняется после или во время insert'а no userToken.(insert.prev) // Если вставка сработала (т.е. таблица => insert = select // была пустой во время выполнения), // получаем значение в тот же самый // момент времени (т.е. у нас запрос // 'INSERT RETURNING'). // В противном случае вызываем обработчик // исключения, и select выполняется чуть позже}
До этого момента модель очень похожа на предыдущую. Мы добавили
DBState
для моделирования таблицы, где хранятся наши
токены, и наши операции теперь выполняют select, так же, как и в
нашем коде. То есть если таблица пуста, мы получаем токен во время
его вставки, а если таблица заполнена, мы выбираем его позднее в
обработчике исключений.
Затем мы переходим к интересному аспекту модели, который заключается в описании взаимодействия между операциями и состоянием базы данных. К счастью, для нашей модели это довольно просто:
fact Trace { // Факт Trace описывает поведение системы all t : Time - first | { // на всех шагах, кроме первого: some delete.t => no userToken.t // Если происходит удаление, таблица пуста some insert.t => some userToken.t // Если происходит вставка, таблица не пуста no delete.t and no insert.t // Если не происходит ни вставок, ни удалений, => userToken.t = userToken.(t.prev) // таблица не меняется }}
То есть мы описываем, как состояние базы данных изменяется в зависимости от некоторых происходящих событий.
Выполнение этой модели приводит к созданию многочисленных экземпляров, но вопреки обыкновению, их простой просмотр не позволяет найти очевидную ошибку. Однако мы можем потребовать от Alloy проверить для нас некоторые факты. Здесь придется немного подумать, но кажется, что исправление будет работать, если правильно работают все вызовы select.
Давайте примем это за утверждение и попросим Alloy проверить его.
assert selectIsGood { // То, что мы хотим проверить all s : Operation.select | // Всегда, когда выполняется select, some userToken.s // в базе присутствуем токен}check selectIsGood for 6 // Проверить, что selectIsGood всегда истинно
К сожалению, запуск этой проверки дает нам следующий контрпример:
DBState userToken DBStateTokenTime Token находится в БД в моменты Time и Time Time TokenTime Token в БД в момент Time. Токены есть в таблице только моменты Time, Time и Time Заменит, что в момент Time токенов нет!Operation deleteinsertselectOperation TIME Time TimeOperation Time Time TIME Таблица пуста в момент Time и select не работает для Operation!Operation Time Time Time Это моменты времени, когда происходят соответствующие действия
На этот раз контрпример усложняется. К неудаче нашего исправления приводят три операции, происходящие одновременно. Во-первых, две из этих операций производят удаление и очистку базы данных. Далее, одна из этих двух операций вставляет новый токен в базу данных, в то время как другая не может сделать вставку, поскольку в таблице уже есть токен. Неудачная операция начинает выполнять обработку исключений, но еще до ее завершения запускается третья операция и снова очищает таблицу, в результате чего select в обработчике исключений теперь не может ничего выбрать.
Итак, предлагаемое исправление, которое было проверено на согласование типов, протестировано, прошло интеграцию и проверку коллегами, оказалось ошибочным!
Параллельная обработка легко не дается.
Мне понадобилось примерно полчаса, чтобы написать вышеуказанные модели Alloy. Для сравнения, изначально у меня уходило вдвое больше времени на то, чтобы понять проблему и исправить ее. После этого я также ждал в течение получаса завершения непрерывной интеграции, а потом мои коллеги некоторое время проверяли мой код.
Учитывая, что исправление даже не работает, можно сказать, что решение проблемы определенно заняло больше времени, чем если бы я остановился и смоделировал проблему, как только обнаружил ее. Однако к сожалению, я вовсе не притрагивался к Alloy, поскольку проблема была простой.
Думается, в этом и заключается сложность с использованием подобных инструментов. Когда они нужны? Конечно, не для каждой проблемы, но, возможно, чаще, чем я ими пользуюсь сейчас.
Для тех, кто заинтересовался, ниже мы приводим несколько ссылок, чтобы начать работу с Alloy:
P.S. Правильное решение этой проблемы заключается в том, чтобы использовать сериализуемые транзакции и не возиться с параллельной обработкой.
Гипотеза о том, что старение запрограммировано весьма популярна среди обывателей, но имеет довольно мало сторонников среди ученых-геронтологов. При этом данная гипотеза кажется весьма логичной, на первый взгляд. Откуда такое расхождение? Может быть, ученые просто находятся в плену своих предубеждений и когнитивных ошибок, не давая зеленый свет смелой гипотезе?
"Ничто в биологии не имеет смысла, кроме как в свете эволюции"
Добржанский Феодосий Григорьевич
Для того, чтобы всерьез воспринимать гипотезу о наличии у абсолютного большинства видов некоей генетической программы старения нужны веские основания. Каким образом эволюция привела к тому, что гипотетическая генетическая программа закрепилась (далее просто Программа), какие преимущества она дает? Какую пользу старение может приносить отдельной особи никто так и не придумал, поэтому вся аргументация сторонников Программы сводится к групповому отбору. Групповой отбор - штука спорная, но давайте сделаем вид, что он существует и обратимся к работе Джоша Миттельдорфа, который является одним из сторонников Программы с довольно серьезным научным бэкграундом. Эта работа хороша тем, что она не заявляет голословно, что программа старения полезна для группы организмов, Миттельдорф приводит результаты симуляции, используя хорошо известную и проверенную модель популяционной динамики Лотки-Вольтерры. Давайте посмотрим на динамику численности популяций хищников и их добычи ("не-хищников") в разных сценариях (без старения и когда стареют жертвы):
Моделирование численности популяций нестареющих хищников и жертв.Когда старения нет минимальная и максимальная численность обоих видов разнится на два порядка и довольно долгое время численность популяции находится возле нуля: малейшая флуктуация - и оба вида исчезнут! А теперь взглянем на результаты симуляции, где присутствует старение "не-хищников" и старые особи представляют более легкую добычу:
Моделирование численности популяций хищников и стареющих жертв.Мы видим, что в этой симуляции динамика существенно стабилизировалась и есть даже некий намек на сходимость - колебания уменьшаются со временем. Это ли не лучшее доказательство наличия Программы!? Прежде чем ответить на этот вопрос, давайте изучим матчасть. А именно модель Лотки-Вольтерры, которую (с небольшими модификациями) использовал Джош Миттельдорф.
"В сущности, все модели неправильны, но некоторые полезны"
Джордж Бокс
В 1925 году Лотка (и независимо от него в 1926 году Вольтерра) предложил модель взаимодействия двух видов типа хищник жертва, которая с успехом применяется и сейчас во многих задачах. Модель представляют собой простую систему дифференциальных уравнений и во многом похожа на ставшую печально известной в последнее время эпидемиологическую модель SIR (про которую можно почитать, например, тут).
x численность жертв (травоядных);
y численность хищников;
скорость роста популяции жертв;
вероятность того, что жертва будет съедена хищником при контакте;
1/ имеет смысл среднего времени до голодной смерти хищника;
вероятность того, что хищнику хватит еды на дальнейшее размножение.
Оставим пока хищников в покое и рассмотрим уравнение для жертв. Как будет выглядеть динамика их численности при условии, что все хищники куда-то внезапно исчезли (y=0)?
А вот как:
То есть численность "не-хищников" по этой модели растет по экспоненте! И действительно, модель Лотки-Вольтерры предполагает что в распоряжении жертв неограниченные ресурсы (например, пища). Однако в реальности все совсем не так.
Вот как, например, выглядит рост численности популяции инфузорий туфелек (Paramecium):
Совершенно непохоже на экспоненциальный рост, не так ли? Современная наука давно объяснила почему так происходит и разработала простую математическую модель, которая точно описывает кривые роста бактерий, дрожжей, инфузорий и даже млекопитающих. И эта модель - рост по логистической кривой (эта кривая изображена черным на рисунке слева). Логистическая модель основана на факте наличия у среды определенной емкости - того максимального количества особей данного вида, которое среда может вместить и прокормить. Наличие такого предела приводит к тому, что скорость роста популяции замедляется по мере приближения к пределу, а при его достижении рост вообще прекращается.
Чем же обусловлено такое замедление? Существуют, как минимум, две группы факторов: механистические и адаптивные (генетические).
К механистическим можно, например, отнести недостаток пространства для размножения. Возьмем, к примеру, паразитическую осу, обитающую в Центральной Америке, которая откладывает яйца (см. рисунок снизу) только на спинках гусениц определенного вида. Очевидно, что максимальный прирост популяции равен количеству гусениц помноженному на количество яиц, которое можно разместить на гусенице. Таким образом ограничивается бесконечный экспоненциальный рост в данном случае. Такая же логика применима и к другим животным: например, существует предел того, сколько гнезд чайки могут разместить в ареале своего обитания, или предел подходящих мест для нереста лососей. Другим чисто механистическим препятствием является голод: если не хватает пищи, то даже если места полно, потомство либо вовсе не родится, либо умрет, не успев продолжить род.
Ко второй группе факторов можно отнести генетические адаптации: у мышей, например, в гипоталамусе обнаружили специальные нейроны, которые "отключают" репродуктивную функцию. Скорее всего, такие нейроны есть и у людей, потому что при экстремальной потере жировой массы женщины временно теряют фертильность. Снижение фертильности при голодании наблюдается и у более простых организмов [еще].
Логистическая функция является решением следующего дифференциального уравнения:
Давайте поймем в чем физический смысл этого уравнения. Пусть x(t) - это функция роста численности некоей популяции от времени, тогда dx/dt - это скорость роста популяции. Понятно, что скорость роста зависит от того, сколько уже особей существует (просто потому что количество детей зависит от количества родителей). Но еще она зависит от множителя (T - x), где T - это некий предел численности популяции, который может обеспечить среда. Когда x = T, то dx/dt = 0, то скорость роста популяции нулевая независимо от того сколько уже особей есть на данный момент). Когда T намного больше x, то функция похожа на экспоненту, но по мере приближения x к T функция становится все более пологой. Это, кстати, похоже на динамику эпидемий и, действительно, рост числа новых случаев COVID-19 неплохо описывается таким простым дифференциальным уравнением. А все почему? Да потому что даже без ограничительных мер вследствие иммунитета (или смерти) у вируса остается все меньше свободных переносчиков для распространения и поэтому скорость распространения падает.
Давайте попробуем решить это уравнение:
Если мы будем рассматривать только значения x(t) >= 0, то можно избавиться от модуля и после несложных алгебраических манипуляций получим:
Полученная нами функция является той самой логистической функцией, которая применяется для моделирования численности популяций, эпидемий, а также в машинном обучении: в логистической регрессии и искусственных нейросетях (хотя в последних ее уже практически не используют из-за проблемы затухания градиентов, но это совсем другая история). Вот такая вот интересная и полезная функция, которая берет начало из довольно простых соображений.
Итак, чтобы учитывать логистический рост популяции "не-хищников", я переписал первое уравнение Лотки-Вольтерры в следующем виде:
И вот какую динамику популяций мне удалось получить:
Из графика видно, что замедления репродукции достаточно для стабилизации динамики численности популяций обоих видов! Более того, тут приведена модель другая модифицированная модель, которая учитывает миграцию животных, в рамках которой тоже легко достигается эквилибриум. В общем, нет никакой нужды в программе старения для сглаживания колебаний численности популяций - при использовании более приближенных к реальности моделей колебания исчезают сами по себе.
Есть и другая точка зрения на то, почему эволюция могла привести к закреплению программы старения:
Но в итоге эти виды, когда это преимущество уже закреплялось в генах достаточно большого количества особей, вымирали из-за голода, вызванного перенаселением, от которого такой вид страдал хотя бы один раз в течение миллионов лет эволюции. А избежали вымирания только те виды, в которых групповой отбор закрепил достаточное количество дублирующих механизмов старения, и те, которые научились пережидать голодные времена в виде спор или затаившихся яиц как нестареющая гидра. http://personeltest.ru/aways/habr.com/ru/post/405101/
Но спасает ли старение от перенаселения? Давайте рассмотрим простейший пример: пусть у нас есть бактерия, которая умирает от старения через 2 деления. Похожим образом стареют пекарские дрожжи Saccharomyces cerevisiae: от материнской клетки отпочковывается дочерняя клетка, которой достаются самые хорошие органеллы, а все плохие органеллы и клеточный мусор остаются в материнской клетке, которая через несколько десятков таких делений умирает. У дрожжей есть еще хронологическое старение, но это отдельная история.
Так как же будет выглядеть рост популяции в нашей простейшей модели очень быстрого старения? А вот как (см. рисунок внизу для пояснения):
1 бактерия
2 бактерии
4 бактерии - 1 умершая от старости = 3
6 бактерий - 1 умершая от старости = 5
10 бактерий - 2 умерших от старости = 8
16 бактерий - 3 умерших от старости = 13
...
1 2 3 5 8 13... Да это же последовательность чисел Фибоначчи (каждое число равно сумме двух предыдущих)! Но это в свою очередь означает, что старение никак не ограничивает экспоненциальный рост популяции, потому что последовательность Фибоначчи растет по экспоненте. Поэтому эволюция никак не могла прийти к программе старения с этой целью, но она вполне могла прийти к механизмам ограничения размножения, что ученые и обнаружили у мышей.
Это, конечно, не единственные попытки придать эволюционный смысл гипотезе запрограммированного старения, но Алекс Ковальд и Томас Кирквуд подробно разобрали математические модели "программистов" и в каждой из них нашли серьезные ошибки и/или несоответствия.
Также встречается такой аргумент, что существование эпигенетических часов, которые тесно коррелируют с возрастом человека (и других млекопитающих), является доказательством наличия программы старения. Но это является ничем иным как логической ошибкой: в автомобиле, например, есть одометр, показания которого (пробег авто) тесно коррелируют с возрастом автомобиля, однако это вовсе не означает, что автомобиль начинает функционировать хуже, потому что с определенного пробега включается специальная программа. Частные случаи, впрочем, могут быть, но в общем, это не так.
Подытожим:
Гипотетическая программа старения вредит индивидуальному отбору и НЕ дает никаких ощутимых преимуществ при групповом отборе (который до сих пор не является общепризнанным).
Гипотеза запрограммированного старения нарушает принцип бритвы Оккама: постулируется новая сущность без надобности (см. пункт 1).
До сих пор не найдено ни намека на генетическую программу старения у млекопитающих хотя другие генетические программы давно найдены (например, вышеупомянутая программа отключения фертильности)
Самое главное: не существует примеров взломов "программы старения" внутри одного вида. Если есть программа, значит, чисто статистически должны быть особи, у которых она ломается со временем. Например, у каждой клеточки нашего организма есть программа самоубийства (апоптоза), но она с завидной регулярностью ломается, что служит одним из механизмов патогенеза онкологических заболеваний. Где среди 7 миллиардов людей нестареющие мутанты с отключенной программой старения!? Ведь ожидаемая продолжительность жизни таких людей должна составлять как минимум сотни лет.
С эволюционной точки зрения старение по-прежнему лучше всего описывается различными модификациями гипотезы Медавара, которая сводится к тому, что в дикой природе смертность от старения у большинства видов пренебрежимо мала в сравнении со смертностью от внешних причин (болезни, хищники и т. п.) и поэтому мутации, которые увеличивают максимальную продолжительность жизни в популяции не закрепляются. Однако те виды, которые не испытывают такого давления среды (очень крупные животные или живущие в защищенной от хищников среде), живут гораздо дольше. Дальнейшим развитием идеи Медавара является гипотеза антагонистической плейотропии, которая утверждает, что в условиях дикой природы эволюция закрепит те варианты генов, которые могут снижать максимальную продолжительность жизни, но увеличивают вероятность репродуктивного успеха в молодости. Гипотеза Медавара была не единожды проверена экспериментально:
В лабораторных условиях эволюционные гипотезы можно эффективно проверять с помощью экспериментальных эволюционных парадигм. Это подразумевает применение специфичного режима отбора и проведение мониторинга эволюционных изменений на протяжении поколений. Например, Стернс и коллеги на протяжении 60 поколений применяли к одной группе плодовых мушек высокую случайную смертность, а к другой группе низкую случайную смертность. В результате оказалось, что режим высокой смертности приводил к укорочению продолжительности жизни, снижению возраста полового созревания и ускорению репродуктивной траектории по сравнению с режимом низкой смертности. Эти данные оказались полностью сопоставимыми с результатами природного эксперимента, в котором опоссумов, естественным образом эволюционирующих на лишенном хищников острове, сравнивали с опоссумами нормальной популяции на населенном хищниками материке.
Но это все эволюционные гипотезы, которые не описывают конкретные механизмы, а ознакомиться с наиболее правдоподобным на мой взгляд гипотетическим механизмом старения можно здесь.
На прошлой неделе мы познакомились с инструментами, которые позволяют задавать и редактировать параметрические зависимости взаимного расположения 3D-тел, а также рассмотрели инструменты, которые позволяют найти перекрытия (коллизии) сопрягаемых 3D-тел.
В этой части статьи мы изучим прием, который позволяет упростить редактирование параметров параметрической сборки, при помощи таблиц nanoCAD.
Читать далееСоздание параметрической сборки подразумевает возможность изменения геометрических параметров деталей с целью перестроения сборки согласно новым требованиям. Ранее мы редактировали параметры сборки из окна диспетчера параметров, но у этого способа есть ряд неудобств. Необходимо открывать отдельное окно, которое нагружает интерфейс. При этом в окне отображаются все параметры сборки, хотя часть из них являются зависимыми и потому не представляют интереса. Соответственно, обилие параметров затрудняет поиск нужного.
Выходом из этих проблем становятся таблицы nanoCAD. В таблицу можно вывести только интересующие нас параметры, а режим быстрого редактирования таблицы позволяет изменять параметры без вызова дополнительных окон.
Создайте таблицу nanoCAD. Для этого вызовите команду таблица или в ленточном интерфейсе команду Таблица nanoCAD (рис. 1): Оформление Таблицы Таблица nanoCAD, либо выберите соответствующую иконку на панели Таблицы, либо в выпадающем меню укажите Черчение Таблицы Таблица nanoCAD.
Рис. 1. Вызов команды вставки таблицы nanoCAD в ленточном интерфейсе и на панели 3D Рис. 1.Появится окно создания таблицы (рис. 2). Выберите пункт Нестандартная, укажите мышью размер таблицы (1х1) и нажмите кнопку ОК.
Рис. 2. Окно создания таблицы nanoCADРазместите таблицу рядом со сборкой. Откройте на редактирование эскиз, в котором создавался профиль стакана, а затем дважды щелкните левой кнопкой мыши по ранее созданной таблице, чтобы открыть окно редактирования.
Создайте три раздела отчетов, для чего три раза выберите в выпадающем меню Разделы Вставить раздел отчета (рис. 3).
Рис. 3. Создание раздела отчета в таблице nanoCADВыберите курсором ячейку А2 и вставьте раздел данных (рис. 4).
Рис. 4. Создание раздела данных в таблице nanoCAD после ячейки А2Далее укажите курсором ячейку А4 и снова вставьте раздел данных (рис. 5).
Рис. 5. Создание раздела данных в таблице nanoCAD после ячейки А4Таким образом должно получиться чередование разделов отчета и разделов данных (рис.6).
Рис. 6. Итоговая структура разделов таблицыРядом с ячейкой А2 нажмите кнопку со значком фильтра (рис. 7).
Рис. 7. Кнопка настройки фильтра объектов раздела отчета ячейки А2Появится окно быстрого выбора. Нажмите кнопку выбора объектов из набора (рис. 8).
Рис. 8. Режим выбора объектов для фильтрации из набораНа редактируемом эскизе укажите курсором размерный параметр, который задает внутренний радиус стакана (рис. 9) и нажмите Enter. В окне быстрого выбора нажмите кнопку ОК.
Рис. 9. Выбор объекта для формирования отчета по геометрическому размеру подшипникового стаканаЗакройте окно редактора таблицы и откройте на редактирование эскиз крышки стакана. Снова откройте окно редактора таблицы и у ячейки А5 нажмите кнопку фильтра объектов (рис. 10).
Рис. 10. Кнопка настройки фильтра объектов раздела отчета ячейки А5Нажмите кнопку выбора объектов из набора. На редактируемом эскизе укажите курсором размерный параметр, который задает длину заплечика стакана (рис. 11), нажмите Enter, в окне быстрого выбора нажмите кнопку ОК.
Рис. 11. Выбор объекта для формирования отчета по геометрическому размеру крышки стаканаЗакройте окно редактора таблицы и завершите редактирование эскиза. Снова откройте окно редактора таблицы и рядом с ячейкой А8 нажмите кнопку фильтра объектов, а затем в окне быстрого выбора нажмите кнопку выбора объектов из набора. Укажите курсором подшипник (рис. 12), нажмите Enter, в окне быстрого выбора нажмите кнопку ОК.
Рис. 12. Выбор объекта для формирования отчета по геометрическому размеру подшипникаТаким образом в одной таблице сформировались три раздела отчетов по параметрам деталей сборки. Отчеты таблиц nanoCAD имеют двустороннюю связь с параметрами, которые отображаются в отчете, поэтому есть возможность изменять свойства объектов изнутри таблицы nanoCAD. Чтобы сформировать данные по отчетам, необходимо в ячейках шаблона отчета указать геометрические свойства ранее выбранных объектов.
Наведите курсор на ячейку А2 и зажмите правую кнопку мыши, а затем, не отпуская кнопку, переместите курсор вверх от ячейки. Вслед за движением курсора появится линия, которая сигнализирует о том, что активируется одна из команд редактирования таблицы (рис. 13). Отпустите правую кнопку. Откроется окно построителя выражений (рис.14): движение курсора вверх над ячейкой вызывает открытие именно этого окна.
Рис. 13. Быстрая активация команды вызова окна построителя выражений для ячейки А2Такой способ вызова команд редактирования таблицы является одним из самых быстрых. В то же время существует возможность вызывать эти команды с помощью интерфейсных кнопок окна редактора.
Окно построителя выражений состоит из трех полей. В верхнем поле записывается выражение, также это поле можно использовать для поиска выражений из среднего поля. В среднем поле отображается список всех доступных выражений. Поскольку ранее для отчета были заданы конкретные объекты, в списке выражений будут представлены и их свойства. В нижнем окне отображаются итоговое выражение и результат его расчета.
Рис. 14. Окно построителя выраженийВведите в верхнем поле слово Значение. В среднем поле будет осуществлен поиск выражения, которое содержит имя искомого свойства (рис. 15). Дважды щелкните левой кнопкой мыши по выражению Object.Value. Нажмите кнопку ОК.
Рис. 15. Поиск выражения по имени свойства параметрического размераТо же самое проделайте для шаблона отчета в ячейке А5. А для шаблона отчета в ячейке А8 имя искомого свойства должно быть Наружний (рис. 16).
Рис. 16. Поиск выражения по имени свойства параметрического объектаТаким образом получилась таблица с тремя контролируемыми параметрами объектов сборки (рис. 17). Чтобы в таблице было удобнее ориентироваться, впишите имена параметров в разделы данных.
Рис. 17. Итоговый результат формирования таблицыТакже разделите таблицу на страницы, чтобы появилась возможность произвольно расположить параметры в пространстве модели. Наведите курсор на цифру 4 в линейке и нажмите правую кнопку мыши, выберите в контекстном меню пункт Начать новую страницу (рис. 18).
Рис. 18. Установка разделителя страниц перед ячейкой А4Тоже самое сделайте для 7-ой строки (Рис. 75).
Рис. 19. Установка разделителя страниц перед ячейкой А7.Закройте окно редактора. Левой кнопкой мыши выделите таблицу. Перемещать страницы таблицы можно за квадратные ручки (рис. 20).
Рис. 20. Выделенная таблица nanoCADСтраницы таблицы расположите, как вам будет удобно. Например, как показано на рис.21.
Рис. 21. Расположение страниц таблицы в одну строкуНаведите курсор мыши на содержимое ячейки, в которой отображается значение внешнего диаметра подшипника. Зажмите на клавиатуре клавишу Ctrl и левой кнопкой мыши щелкните по содержимому ячейки. Активируется режим быстрого редактирования таблицы (рис. 22). В ячейке появится курсор, а сама ячейка будет выделена зеленой рамкой.
Рис. 22. Активация режима быстрого редактирования таблицыСотрите содержимое и напишите новое значение: 80. В данном случае значения будут округляться до ближайшего из имеющихся в библиотеке элементов. Стрелками на клавиатуре либо с помощью мыши переведите курсор на ячейку со значением радиуса стакана, сотрите значение и напишите 40 (рис. 23). Для подтверждения внесенных изменений нажмите Enter.
Рис. 23. Результат внесения изменений в режиме быстрого редактированияОбратите внимание, что геометрические размеры подшипника и стакана изменились.
Визуально можно заметить, что заплечик крышки и подшипник перекрываются. Измерьте длину перекрытия и измените значение в таблице на измеренную величину.
Итак, мы изучили прием работы с таблицами nanoCAD, который позволяет упростить редактирование параметрической сборки.
Олег Ачкасов, |
На протяжении тысячелетий человечество волновали вопросы функционирования нервной системы: предпринимались попытки понять, как происходит восприятие и обучение, что такое эмоции и сознание, какую роль они играют, как они появились в ходе эволюции, каково влияние различных внешних и внутренних факторов на развитие и становление нервной системы человека и других животных. Все эти захватывающие темы так или иначе затронуты в нейробиологии и смежных с ней дисциплинах.
Нейробиология это наука, изучающая структуру, функционирование и развитие нервной системы человека и животных. Brain science более узкая дисциплина, посвященная головному мозгу человека. Нейробиология охватывает разные уровни организации от молекулярного до системного, плавно переходя в молекулярную биологию и биохимию с одной стороны и в нейропсихологию (наука на стыке с психологией) с другой.
Некоторые люди, как и в незапамятные времена, продолжают утверждать, что понять работу мозга невозможно, или же отрицают, что мозг порождает наш разум и сознание и т. д. Несмотря на все это, в реальности науки, работающие в этой области, делают огромные успехи и быстро сокращают пробелы в нашем понимании существующих вопросов. За последние десятилетия человечество узнало о том, что нервные клетки все-таки восстанавливаются и научилось перепрограммировать стволовые клетки так, чтобы они формировали новые нейроны [1]. Мы также выяснили, что посредством электрической стимуляции нервов можно восстановить способность самостоятельно передвигаться у парализованных пациентов с повреждениями спинного мозга [2]. Многие заболевания нервной системы сейчас можно распознать на ранних стадиях и без использования инвазивных методов или долгого мучительного сканирования: относительно простой анализ генетической информации человека позволяет выявлять многие нейродегенеративные заболевания, эпилепсии и двигательные расстройства даже до начала проявления симптомов. Появилась возможность создавать подробные карты и общедоступные базы данных, содержащие информацию о том, как конкретные гены связаны с различными заболеваниями или определенными типами поведения и как взаимодействия продуктов этих генов вовлечены в процессинг огромного потока информации в мозге. Были открыты детальные (на уровне работы индивидуальных нейронов) механизмы обработки информации о пространственном местоположении организма своего рода внутренний GPS, обеспечивающий ориентирование (за эту работу была присуждена Нобелевская премия в 2014 году)[10].
Одним из относительно недавних событий в истории нейронауки стало применение компьютерных методов. Началось оно с простых математических моделей индивидуальных нейронов и небольших сетей, разработанных еще в 50-е годы, и на сегодняшний день невероятно расширилось. Сейчас вычислительная нейробиология включает в себя множество самых разнообразных подходов, позволяющих исследовать как элементарные низкоуровневые процессы, так и сложные когнитивные функции.
Вычислительная нейробиология, как и многие науки, в основном использует подход снизу-вверх" (bottom-up), анализируя, как динамические взаимодействия между биологическими нейронами могут реализовывать функции вычислительных компонентов мозга. Этот подход позволяет воссоздать и понять эмерджентные динамические процессы в небольших частях мозга (таких как кортикальные колонки и зоны), а также воспроизвести феномены, наблюдаемые в биологических нейронных сетях, как, например, осцилляции. В этой области были разработаны математические модели элементарных вычислительных компонентов и их реализации при помощи биологических нейронов. Сюда входят компоненты сенсорного кодирования, нормализации, кратковременной памяти, накопление информации, принятие решений и контроль движений. Большинство этих компонентов достаточно просты в вычислительном плане, но они и являются составляющими элементами когнитивной деятельности.
Подход сверху-вниз (top-down) стремится отобразить когнитивные функции на алгоритмическом уровне. Этот подход игнорирует биологическую реализацию и вместо этого пытается разложить процессы обработки информации, лежащие в основе функционирования нервной системы, на алгоритмические компоненты. Ученые уже начали тестировать сложные вычислительные модели, способные описать высокоуровневые сенсорные и когнитивные функции мозга. Недавние достижения в области машинного обучения, получившей мощный толчок за счет растущих вычислительных мощностей и крупномасштабных датасетов, на которых можно проводить обучение, позволили заметно продвинуться в решении проблем понимания процессов восприятия, когнитивной деятельности и контроля.
Рисунок 1. Подходы снизу-вверх vs сверху-вниз. Эти два подхода являются крайностями континуума различных путей к общей цели объяснению того, как именно наш мозг порождает наш разум. В целом, на данный момент существует отрицательная корреляция между когнитивной и биологической точностью моделей. Однако эта отрицательная корреляция может быть превращена в позитивную, когда когнитивные ограничения позволяют лучше понять биологические функции и когда биология служит вдохновением для создания моделей, объясняющих мыслительные процессы [3].Одной из важных тем, изучаемых в нейробиологии, является развитие нервной системы от самых ранних зародышевых стадий до взрослого организма. Помимо чисто фундаментального интереса, хорошее понимание этого процесса необходимо для расширения возможностей лечения множества заболеваний, связанных с дисфункциями нервной системы, вызванными нарушениями на разных этапах развития. Четкое понимание того, как происходит регуляция числа клеток различных типов в головном мозге поможет пролить свет на этиологию таких состояний, как микроцефалия, мегалэнцефалия, мальформации коры головного мозга, приводящие к фармакорезистентной эпилепсии и расстройствам когнитивных функций. Нарушения в процессах миграции предшественников нейронов и в процессах образования слоев внутри коры приводят к различным структурным нарушениям, среди которых Х-сцепленная перивентрикулярная узловая гетеротопия заболевание, характеризующееся высокой внутриутробной смертностью и судорогами. Дефекты механизмов образования корректных связей между нервными клетками внутри одной зоны НС или между различными зонами являются причиной формирования неверно функционирующих сетей в нервной системе, что может являться причиной патологических состояний вроде той же эпилепсии и таких нейропсихиатрических нарушений, как аутизм и шизофрения.
Исследования в области развития НС проводятся учеными из разных сфер по всему миру. Одни ищут ответы на поставленные вопросы при помощи простых клеточных культур, другие используют более сложные in vitro системы, известные как органоиды, третьи ставят эксперименты на грызунах. В нашей лаборатории JetBrains Research используется чисто вычислительный (in silico) подход: мы разрабатываем модельный фреймворк BCNNM (Biological Cellular Neural Network Modeling), который может быть использован исследователями для построения динамических пространственных моделей развития и функционирования нервной ткани.
Наш подход
Фреймворк BCNNM включает в себя полезные фичи, не представленные в других существующих моделях биологических нейронных сетей. Например, это возможность прослеживать все события, происходящие с каждой клеткой на протяжении всего времени симуляции, регистрировать изменения широкого набора биологически релевантных параметров (концентрации внутри- и внеклеточных ионов, сигнальных и других молекул, мембранный потенциал и т. д.). В то же время сохраняется способность модели описывать поведение клеточной популяции как единого целого. Такая возможность особенно полезна с учетом того, что наш фреймворк позволяет работать с миллионами клеток, что дает большое преимущество перед моделями, описывающими подробно работу лишь небольшого числа нейронов. При этом, описание тканевых и клеточных процессов в BCNNM достаточно подробно и биологично по сравнению со статистическими моделями, которые оперируют сотнями и миллионами клеток.
Наша дискретно-событийная модель позволяет снизить уровень сложности определения модели и вычислений, а также абстрагироваться от континуальности реальных событий. Для многих процессов возможно использование определяемой самим пользователем случайности величин, описывающих процесс, что делает моделирование более увлекательным, а его результаты менее предсказуемыми. В целом, BCNNM является модельным фреймворком широкого назначения, в отличие от большинства моделей, создаваемых в области нейромоделирования, которые нацелены на воссоздание лишь строго определенных экспериментальных сеттингов. В рамках нашей модели возможно подробное воспроизведение биологических механизмов, пользователи могут выбрать желаемый уровень детализации для описываемых процессов (от сдвигов внутриклеточных концентраций ферментов до взаимодействий групп клеток, образующих многоклеточные структуры высокого уровня). Пользователь может создавать структуры с большим количеством специфических связей, моделировать прохождение химических и электрических сигналов внутри них и раскрывать особенности их работы.
Модельный индивид это набор логических объектов, распределенных в пространстве. Состояние индивида определяется выполнением сигнальных путей каждого из этих логических объектов в данный момент времени. Логический объект в модели это абстракция, необходимая для того, чтобы объединить описания компонентов и их взаимодействий. Примерами логических объектов в данном контексте являются всевозможные клеточные компартменты. В конфигурации модели они заданы как наборы возможных механизмов, скомбинированных в сигнальные пути, куда также входят испускаемые и принимаемые сигналы. Процессы, ассоциированные с логическим объектом, могут модифицировать его состояние, пространственное расположение или активность. Набор сигнальных путей для каждого компартмента определяет, какие процессы могут с ним происходить и какие условия должны выполняться.
Результаты
В наших экспериментах мы используем модель для создания самых разных пространственных конфигураций клеточных структур. С использованием биологических данных о последовательности процессов дифференциации в клеточных линиях нервных и глиальных клеток, градиентов концентрации сигнальных молекул, заданных правил миграции и роста отростков мы получаем in silico аналоги органоидов головного мозга, которые ученые выращивают в лабораториях. Правильно продифференцировавшие клетки самоорганизуются в слоистые или ганглионарные структуры, свойственные таким органоидам. Ниже показан пример того, как может происходить пролиферация и дифференциация в модельном пространстве. Конфигурация пространства может быть любой, и выращиваемая структура может быть как сферической, так и слоистой.
Рисунок 2. Рост и дифференциация клеточной массы в ходе симуляции.Рост клеточной структурыПри моделировании в режиме нормального развития полученные структуры обладают количественными соотношениями различных типов клеток и их пространственным распределением, характерными для биологических структур [4,5]. Параметры внутренней связности также сравнимы с аналогичными параметрами моделируемых in vitro и in vivo систем в норме [6]. Моделируемый органоид из миллиона клеток может содержать миллионы отростков и синапсов, которые обеспечивают связность внутри слоев и между ними. Количество и соотношение входящих и исходящих связей для клеток внутри слоя коррелирует с таковым в живых системах. В слоистых модельных структурах паттерны связывания слоев между собой сходны с тем, что можно наблюдать в слоистых структурах мозга или в церебральных органоидах. Эти паттерны связывания не случайны они следуют из молекулярных правил аксонального наведения и связывания нужных целей. Ниже можно увидеть визуализацию процесса аксонального наведения в нашей модели.
Рост аксонаМоделирование в BCNNM возможно и в режиме отклонения от нормы за счет гибкости конфигурации. Это позволяет наблюдать за развитием дефектных структур, что может пролить свет на течение различных заболеваний нервной системы. Работая с моделью, мы показали, что, меняя концентрации сигнальных молекул или параметры ответов со стороны клеток (что может являться, к примеру, аналогом изменения чувствительности клеточных рецепторов) в области деления, дифференциации или создания связей, мы можем наблюдать отклонения в системе, которые напоминают изменения, свойственные нарушениям развития биологических нервных тканей.
Помимо моделирования нарушений процесса развития, в рамках нашего проекта проводились исследования по посттравматическому нейрогенезу [7]. Клеточная динамика после нанесения травмы продемонстрировала поведение соответствующее реальному [8, 9]: резко падает количество нервных клеток и повышается концентрация некротического фактора, что ведет к дифференциации мультипотентных стволовых клеток в нейрональные предшественники, которые мигрируют к месту травмы и в свою очередь дифференцируются в нейроны. Пример такой динамики показан на рисунке 5, а в таблице ниже приведено сравнение изменения числа пролиферирующих клеток при травме разной силы в модели и в экспериментальных данных из исследования на мышах [8].
Рисунок 3. Пример клеточной динамики после нанесения травмы в модели.Перспективы применения метода
Фреймворк BCNNM может быть использован для подробного in silico воспроизведения in vitro экспериментов, направленных на получение детальных наборов параметров, характеризующих все ключевые компоненты (клетки, их компартменты, синапсы и т. д.), предоставляя новые данные для нейробиологических исследований. Это могут быть как фундаментальные вопросы, касающиеся процессов развития, так и более прикладные, связанные с различными заболеваниями центральной нервной системы, а в перспективе и с разработкой подходов для лечения некоторых из этих заболеваний. Применение фреймворка для предварительного вычислительного тестирования биологических и медицинских гипотез позволит снизить стоимость постановки лабораторных экспериментов и ускорит процесс проведения исследований.
Курс Computational Neuroscience
Помимо исследовательской деятельности, наша лаборатория вовлечена в образовательный процесс. С 2019 года мы читаем курс Вычислительные нейронауки для студентов партнерских магистратур ВШЭ и ИТМО (и любых вольнослушателей!) в рамках образовательных программ JetBrains. В прошлом осеннем семестре лекции и семинары проходили в очном формате. В ходе курса студентам были предложены базовый материал для изучения и обсуждения в аудитории, материалы для самостоятельного, более глубокого погружения, интересные практические задания по моделированию нейронов и биологических нейронных сетей. В осеннем семестре 2020 курс проходит в удаленном формате, что позволило нам значительно расширить аудиторию. Видеоматериалы будут доступны всем желающим на YouTube-канале JetBrains Research.
В заключение: если вы нейробиолог и у вас есть экспериментальные данные, которые вы бы хотели использовать для моделирования, напишите нам. Мы будем очень рады сотрудничеству!
Список литературы
Takahashi, J. iPS cell-based therapy for Parkinson's disease: A Kyoto trial. Regenerative Therapy, 2020, ISSN 2352-3204. https://doi.org/10.1016/j.reth.2020.06.002.
Angeli, C. A., Boakye, M., Morton, R. A., Vogt, J., Benton, K., Chen, Y., Harkema, S. J. (2018). Recovery of Over-Ground Walking after Chronic Motor Complete Spinal Cord Injury. New England Journal of Medicine. doi:10.1056/NEJMoa1803588 (https://doi.org/10.1056/NEJMoa1803588)
Kriegeskorte, N., & Douglas, P. K. (2018). Cognitive computational neuroscience. Nature Neuroscience. doi:10.1038/s41593-018-0210-5
Caffrey, J. R., Hughes, B. D., Britto, J. M., and Landman, K. A. (2014). An in silico agent-based model demonstrates reelin function in directing lamination of neurons during cortical development. PLoS ONE 9. doi:10.1371/journal.pone.0110415
Dingle, Y.-T. L., Boutin, M. E., Chirila, A. M., Livi, L. L., Labriola, N. R., Jakubek, L. M., et al. (2015). Three-dimensional neural spheroid culture: An in vitro model for cortical studies. Tissue engineering. Part C, Methods 21, 12741283. doi:10.1089/ten.TEC.2015.0135. 26414693
Gerhard, F., Pipa, G., Lima, B., Neuenschwander, S., and Gerstner, W. (2011). Extraction of network topology from multi-electrode recordings: Is there a small-world effect? Frontiers in Computational Neuroscience 5. doi:10.3389/fncom.2011.00004
Мыров В.О. Вычислительное моделирование посттравматического нейрогенеза. Магистерская диссертация. СПбАУ РАН, Санкт-Петербург 2018
Wang, X., Gao, X., Michalski, S., Zhao, S., & Chen, J. (2016). Traumatic Brain Injury Severity Affects Neurogenesis in Adult Mouse Hippocampus. Journal of Neurotrauma, 33(8), 721733. doi:10.1089/neu.2015.4097 (https://doi.org/10.1089/neu.2015.4097)
Neuberger, E. J., Swietek, B., Corrubia, L., Prasanna, A., & Santhakumar, V. (2017). Enhanced Dentate Neurogenesis after Brain Injury Undermines Long-Term Neurogenic Potential and Promotes Seizure Susceptibility. Stem Cell Reports, 9(3), 972984. doi:10.1016/j.stemcr.2017.07.015 (https://doi.org/10.1016/j.stemcr.2017.07.015)
В предыдущей части статьи мы научились связывать параметры созданных 3D-моделей, а также рассмотрели инструменты, которые позволяют перемещать 3D-модели в удобное для нас расположение.
В этой части мы познакомимся с инструментами, которые позволяют задавать и редактировать параметрические зависимости взаимного расположения 3D-тел. А также мы рассмотрим инструменты, которые позволяют найти перекрытия (коллизии) сопрягаемых 3D-тел.
Добавьте подшипник, выбрав его из базы nanoCAD Механика и разместив в пространстве модели. Если вы используйте какой-либо другой программный продукт nanoCAD, пропустите это действие.
Чтобы открыть вкладку базы элементов nanoCAD Механика, необходимо вызвать в командной строке команду mctabs, либо в ленточном интерфейсе указать Механика Стандартные Управление вкладками, либо использовать панель ЕСКД Стандартные, либо в выпадающем меню выбрать Механика Стандартные Управление вкладками (рис. 1).
Рис. 1. Вызов команды управления вкладками на панели ЕСКДСтандартные и в ленточном интерфейсеЗатем в командной строке либо в динамической командной строке следует выбрать вкладку База элементов (рис. 2).
Рис. 2. Открытие/закрытие вкладки База элементовТакже в классическом варианте интерфейса вкладку базы элементов можно вызвать, щелкнув правой кнопкой мыши на свободном пространстве панелей и выбрав в появившемся контекстном меню Функциональные панели База элементов (рис. 3).
Рис. 3. Вызов вкладки База элементов в классическом варианте интерфейсаПосле этого должна появиться/исчезнуть вкладка с базой элементов (рис. 4).
Рис. 4. Вкладка базы элементов nanoCAD МеханикаРаскройте дерево Валы Подшипники шариковые (рис. 5).
Рис. 5. Путь до раздела с шариковыми подшипникамиНа вкладке базы элементов нажмите кнопку Использовать 3D модели при вставке стандартных деталей (рис. 6). Если эта кнопка неактивна, будут вставляться 2D-виды деталей.
Рис. 6. Кнопка включения отображения 3D-моделей при вставке деталей избазы nanoCAD МеханикаЛевой кнопкой мыши выберите подшипник ГОСТ 832-78 Тип 236000 (рис. 7).
Рис. 7. Выбор подшипника ГОСТ 832-78 Тип 236000 из базы nanoCADМеханикаУкажите точку вставки в пространстве модели. После этого появится окно редактирования параметров подшипника. Укажите параметры, как показано на рис. 8, и нажмите OK.
Рис. 8. Параметры подшипникаДля завершения работы команды нажмите на клавиатуре клавишу Esc.
Теперь задайте зависимости взаимного расположения 3D-тел стакана, подшипника и крышки. Для этого воспользуйтесь инструментами группы 3D-зависимостей. В ленточном интерфейсе они расположены на вкладке 3D-инструменты 3D-Зависимости, либо на панели 3D (рис. 9), либо в выпадающем меню 3D 3D элементы.
Рис. 9. Инструменты 3D-зависимостей на панели 3D и в ленточном интерфейсеПри задании 3D-зависимостей между 3D-телами удобно скрывать тела, не участвующие в операции. Для этого в истории построений щелкните правой кнопкой мыши на 3D-теле и выберите в контекстном меню пункт Скрыть (рис. 10).
Рис. 10. Скрытие объектаИзмените стиль отображения на 3D-скрытый и с помощью команды Зависимость 3D-вставка вставьте подшипник в стакан. Инструмент 3D-вставки позволяет совместить плоские поверхности, в которых лежат указанные пользователем окружности оснований двух 3D-тел; при этом также совмещаются (лежат на одной прямой) векторы нормалей. Начала векторов нормали совпадают с центрами окружностей.
Активируйте объектную привязку Ближайшая.
Вызовите в командной строке команду 3dinsert, либо в ленточном интерфейсе укажите 3D-инструменты 3D-Зависимости Зависимость 3D вставка, либо выберите соответствующую иконку на панели 3D, либо в выпадающем меню откройте 3D 3D элементы Зависимость 3D вставка (рис. 11).
Рис. 11. Зависимость 3D вставка на панели 3D и в ленточном интерфейсеКурсором укажите окружность внешнего диаметра подшипника. При наведении курсора окружность выделяется зеленым цветом, а также появляется стрелка вектора нормали. После выбора окружности ее цвет становится желтым (рис. 12).
Рис. 12. Выбор окружности подшипника для указания 3D-зависимости ВставкаЗатем укажите окружность заплечика стакана (рис. 13).
Рис. 13. Выбор окружности стакана для создания 3D-зависимости ВставкаПосле этого произойдет сопряжение тел. В командной строке можно изменить направление векторов нормали, чтобы перевернуть одну деталь относительно другой (рис. 14). Для этого щелкните кнопкой мыши на подчеркнутом параметре или введите в командную строку его имя. Имя может быть полным либо указываться заглавной буквой в имени параметра. Для подтверждения нажмите Enter.
Рис. 14. Изменение направления векторов нормалиСделайте видимыми скрытые детали. Для этого в контекстном меню истории построений необходимо выбрать пункт Показать (рис. 15).
Рис. 15. Включение отображения объектов в Истории 3D ПостроенийВставьте крышку в подшипниковый стакан с помощью инструмента 3D-вставки.
Укажите окружности фланцев стакана и крышки (рис. 16).
Рис. 16. Выбор окружности крышки для указания 3D-зависимости ВставкаЗатем укажите окружность второго 3D-тела (рис. 17).
Рис. 17. Выбор второй окружности стакана для указания 3D-зависимости ВставкаТакже необходимо, чтобы отверстия стакана и крышки оставались соосными при изменении их количества в массиве. Для этого следует добавить зависимость 3D вставка для кромок отверстий. Установите стиль отображения 3D Каркас. Активируйте инструмент 3D-вставки и укажите окружности кромок отверстий (рис. 18). Подтвердите добавление зависимости нажатием клавиши Enter. Установите стиль отображения Точный.
Рис. 18. Выбор окружностей при указании 3D-зависимости Вставка дляотверстий крышки и стакана.Чтобы увидеть, насколько корректно тела сопрягаются между собой, добавьте секущую плоскость, а в ее свойствах активируйте псевдоразрез. Для этого вызовите команду viewsection или команду Секущая плоскость в ленточном интерфейсе (рис. 19): 3D-инструменты 2D виды Секущая плоскость, либо выберите соответствующую иконку на панели 2D виды, либо в выпадающем меню укажите 3D 2D виды Секущая плоскость.
Рис. 19. Вызов команды Секущая плоскость на панели 2D виды ивленточном интерфейсеПоскольку на оси сборки лежит точка начала МСК, удобно будет указать для секущей плоскости какую-либо из плоскостей МСК: Y0Z, Z0X, X0Y. В одной из этих плоскостей будет лежать грань торца стакана. Эту плоскость в качестве секущей указывать не нужно, так как она ничего не разрежет. В истории построений укажите одну из плоскостей МСК при наведении курсора она будет окрашиваться в зеленый цвет (рис. 20).
Рис. 20. Выбор секущей плоскости в окне История 3D ПостроенийПосле этого можно будет разместить вид сечения. При отсутствии необходимости в нем можно нажать на клавиатуре клавишу Esc команда завершится, и будет создана только секущая плоскость.
Курсором выберите созданную секущую плоскость и в окне свойств укажите Да в выпадающем списке для параметра Псевдоразрез (рис. 21).
Рис. 21. Включение/отключение отображения псевдоразреза в свойствах секущей плоскостиПосле этого тело разрежется и в плоскости разреза будет отображаться псевдоразрез (рис.22).
Рис. 22. Псевдоразрез сборкиДля удобства в истории построений скройте объект сечения (рис. 23).
Рис. 23. Скрытие объекта секущей плоскости в Истории 3D ПостроенийЕсли внимательно рассмотреть псевдоразрез, то скорее всего окажется, что 3D-тела имеют перекрытия. Внешний диаметр подшипника был установлен ранее: 72 мм. Откройте Менеджер параметров, присвойте параметру Рподш половину диаметра подшипника (рис. 24) и закройте Менеджер.
Рис. 24. Редактирование сборки при помощи Менеджера параметровМожно видеть, как перестроились стакан и крышка стакана (рис. 25).
Рис. 25. Результат редактирования сборки после указания радиуса подшипникаТакже возможно перекрытие заплечика крышки подшипником. Необходимо измерить размер перекрытия и изменить на эту величину параметр Lзапл. Измерить это расстояние можно с помощью инструмента Отрезок, а для поиска характерных точек использовать объектные привязки (рис. 26).
Рис. 26. Поиск длины перекрытия заплечика и подшипникаКроме визуального анализа перекрытий деталей на разрезе, можно воспользоваться функционалом поиска перекрытий 3D-тел. Для этого необходимо вызвать в командной строке команду interfere, либо команду Анализ перекрытий 3D тел в ленточном интерфейсе: 3D-инструменты Прямое моделирование Анализ перекрытий 3D тел, либо выбрать соответствующую иконку на панели инструментов 3D, либо в выпадающем меню указать 3D Прямое моделирование Анализ перекрытий 3D тел (рис. 27).
Рис. 27. Вызов команды анализа перекрытий на панели 3D и в ленточном интерфейсеЗатем необходимо выбрать наборы 3D-тел. Секущей рамкой выберите все тела и дважды нажмите Enter. Появится окно проверки взаимодействий. Тела, между которыми имеются перекрытия, станут прозрачными и окрасятся в голубой цвет. Участки перекрытий тел будут выделены зеленым (рис. 28). Если после двойного нажатия клавиши Enter окно Проверка взаимодействий не появилось, значит у выделенных тел нет перекрытий.
Рис. 28. Отображение перекрытийВ нашем случае подшипник и стакан имеют перекрытия, так как подшипник врезается в скругление стакана. Верным решением будет заменить конструктивный элемент скругления на канавку, отредактировав эскиз стакана.
У 3D-зависимостей также есть редактируемые параметры, которые позволяют задавать расстояния между сопрягаемыми поверхностями. Для этого необходимо дважды щелкнуть по зависимости в истории 3D-построений, а затем в командной строке ввести расстояние, на которое следует разнести сопрягаемые плоскости (рис. 29). Таким образом можно создать разнесенный вид сборки (рис. 30).
Рис. 29. Редактирование параметров 3D-зависимостейРис. 30. Разнесенный вид сборкиИтак, мы познакомились с инструментами, которые позволяют задавать и редактировать параметрические зависимости взаимного расположения 3D-тел. А также рассмотрели инструменты, которые позволяют найти перекрытия (коллизии) сопрягаемых 3D-тел. В следующей части статьи мы познакомимся с приемом, который позволяет упростить процесс редактирования параметрической сборки с помощью таблиц nanoCAD.
Олег Ачкасов,
инженер САПР
ООО Макссофт-24
E-mail: oleg@maxsoft.ru