andreev: (Крупно)
[personal profile] andreev
Сегодняшний пост будет интереснее всех предыдущих, потому что посвящён он будет самому увлекательному занятию - написанию математических моделей. Естественно, никому не интересны математические модели Вселенной, болида формулы-1 или лопастного насоса, поэтому писать я буду про моделирование гидропривода! О том, зачем вообще нужно писать математические модели я писал в посте "О математическом моделировании и переворотах в сознании", а теперь настало время описать этот процесс более подробно...

Каждый человек хоть раз в жизни задавался вопросами: "Как мне написать математическую модель гидропривода? С чего начать? Что почитать?". Ответов на эти вопросы, как правило, нет. В советсткое время было написано достаточно много литературы, посвящённой расчёту гидропривода и в том числе описанию физических процессов и математическому моделированию, но основная проблема заключается в том, что для того, чтобы эти книги принесли пользу, необходимо уже уметь писать математические модели.
2015-10-02 13-33-33 Особенности обучения студентов основам математического моделирования технических систем на примере гидр.png
В этих книгах я находил практически всё, что мне было нужно в части математического моделирования гидроприводов


По крайней мере мне нигде не удалось найти описания пошагового процесса создания математической модели гидропривода. В лучшем случае автор подробно расписывает откуда берётся каждое уравнение огромной системы, но что с ними делать дальше на начальном этапе освоения, не очень понятно. На практике сакральное знание математического моделирования (по крайней мере, у нас на кафедре) передаётся из уст в уста, от поколения к поколению.

Конечно, это никуда не годится. Пора сделать знание о математическом моделировании гидропривода доступным миллионам читателей ЖЖ, и я беру эту задачу на себя!

Первая ошибка, которую совершают многие студенты, это пытаться научиться моделированию сразу на сложной задаче. В лучшем случае они берут решение похожей задачки и пытаются как-то его изменить, чтобы в результате получилось своё, в худшем - начинают изобретать и запутываются в куче неправильных схем. Обычно, на этом увлечение математическим моделированием заканчивается.
Не будем повторять их ошибок и возьмём в качестве примера предельно простой случай:
Имеется цилиндрический плунжер диаметром 10 мм, с приведённой массой 100 кг, работает на пружину жёсткостью 200 Н/мм и демпфер с коэффициентом вязкого трения - 1000 Н/(м/с). Нужно посмотреть как он будет перемещаться, если мы ступенькой подадим в полость с начальным объёмом 20 куб.см давление 200 бар. Чтобы плунжер не превратился в пулю, поставим между источником давления и камерой дроссель диаметром 0,2 мм.
С чего же начать? Многим может показаться, что нужно начать с выбора софта, в котором можно моделировать такую систему. Это не так. На самом деле, начать нужно с листочка бумажки и карандаша. Если при помощи этих инструментов внимательно записать уравнения, потом можно будет решить их в любом софте. Более того, как показывает практика, если посадить человека за какую-нибудь программу, где мат. модели можно писать путём перетаскивания готовых блочков из библиотек, чаще всего результат оказывается неудовлетворительным. В лучшем случае модель просто отказывает считаться. В худшем случае она выдаёт какой-то бредовый результат и человеку уже трудно убедить самого себя в том, что это модель написана неправильно, а не софт кривой.
Поэтому я убеждён, что по крайней мере на начальном этапе просто необходимо прописывать все уравнения. Этим и займёмся.

Первое правило при составлении математических моделей: "Дроби задачи на подзадачи!"
В нашем случае можно выделить несколько физических процессов, поддающихся математическому описанию:

  • прохождение рабочей жидкости через дроссель (дросселирование);

  • её сжатие в рабочей полости плунжера;

  • перемещение массы с учётом взаимодействия с пружиной и демпфером.

Второе правило: "Начинай с конца!"
Чего мы хотим получить в итоге? Наверное, график зависимости перемещения плунжера x от времени t. Так давайте и начнём описание с уравнения движения этого плунжера:


Здесь нет ничего нового для тех, кто учился хотя бы до 6-го класса школы. Разве что производные заменены точками для удобства. Единственное на что необходимо обратить внимание, это на выбор положительного направления перемещения и на знаки действующих сил.
На рисунке видно, что в качестве положительного направления я выбрал перемещение плунжера вправо. Тогда сила со стороны жидкости в уравнении будет со знаком "+", сила со стороны пружины и демпфера со знаком "-". Вот и всё.
Видно, что в этом дифференциальном уравнении неплохо было бы знать значение давления в рабочей камере. И тут уже появляется что-то новенькое. Дело в том, что всё что нам рассказывали в школе и на младших курсах про несжимаемость жидкости - враньё. На самом деле она сжимается, особенно в гидроприводе с давлением от 160 бар и выше.
Да, я знаю, что вы сейчас в глубоком шоке от этой новости, но нужно как-то с этим дальше жить и описывать этот процесс уравнениями. На мой взгляд, удобнее всего это описывается так:

Здесь слева - производная по времени от давления, т.е. другими словами - скорость изменения давления.

Вывести это выражение нетрудно из формулы для определения объёмного модуля упругости:

если разнести дифференциалы давления и объёма по разные стороны знака равенства, а затем продифференцировать обе части по времени.


Логично предположить, что давление будет меняться тем быстрее, чем выше модуль упругости рабочей жидкости E и тем медленнее, чем больше объём этой жидкости V. Поэтому модуль упругости у нас в числителе, а объём - в знаменателе.
В скобки я поместил алгебраическую сумму расходов. В данном случае мы имеем дело с расходом через дроссель Q и с геометрическим расходом от перемещения плунжера. Логично, что положительное значение расхода Q при прочих равных будет приводить к росту давления (положительная скорость изменения давления), а положительная скорость перемещения плунжера к падению давления. Поэтому расход через дроссель в уравнении со знаком "+", а геометрический расход со знаком "-".
Объём камеры в свою очередь можно описать формулой:

На самом деле, влияние изменения объёма жидкости очень несущественно, и во избежание лишних ошибок (например, при отрицательных x), лучше принимать просто постоянный объём равный половине разницы объёмов в конечном и начальном положениях.

Небольшое лирическое отступление. Ко мне часто приходят студенты, которые не первые сутки бьются над своей мат. моделью, которая выдаёт какой-то бред в виде астрономических значений давления, нереальных перемещений и т.п. Очень часто мне бывает достаточно примерно одной минуты "общения" с моделью, чтобы она заработала. И дело тут не в моей гениальности, а в том, что почему-то около 80% ошибок у начинающих "моделистов" приходятся именно на неправильную расстановку знаков в уравнении баланса расходов (уравнении сжимаемости жидкости). Я не был исключением. Мне, насколько я помню, понадобилась где-то неделя, чтобы найти в своей первой модели гидропривода эту ошибку.

Ну вот мы и подходим к последнему уравнению, которое описывает расход через дроссель:

В этой формуле тоже нет ничего нового для тех, кто хотя бы пол семестра изучал курс гидравлики. Единственная поправка, которую нужно внести - это учёт теоретической возможности обратного тока рабочей жидкости в случае отрицательной разницы давлений (например, когда на поршень действует сила больше, чем может противопоставить сила со стороны рабочей жидкости). Без этого мы рискуем получить отрицательное подкоренное выражение.
По цифрам - коэффициент расхода можно взять равным 0,62, а плотность рабочей жидкости - 850 кг/куб.м.

Теперь осталось записать эти уравнения для удобства в форме Коши (для тех, кто забыл матан - это когда все диффуры первого порядка и производные переносятся в левую часть):

Обратите внимание на хитрость: в уравнении движения у нас была вторая производная по перемещению. Чтобы всё-таки свести нашу задачу к задаче Коши, мы просто называем первую производную по перемещению скоростью v и превращаем один диффур второго порядка в два, но уже первого.
Видно, что у нас есть уравнения для трёх производных, которые требуют трёх начальных условий (скорость, перемещение и давление). Их мы смело можем принять нулевыми.

Осталось теперь эти уравнения решить. Не спешите кидаться к учебнику матана, он нам не понадобится, ведь у нас есть широкий спектр численных методов решения подобных дифференциальных уравнений. Самый простой из них - метод Эйлера. Заключается он в том, что для начала нужно прикинуться валенком и представить, что производная - это не предел отношения приращения функции к приращению её аргумента, а просто отношение разностей (по научному это называется переход к конечным разностям). Что это значит? Что, например, первое уравнение системы превращается в следующее:

где:

разница скоростей в (i+1)-й момент времени и в i-й момент времени.
В этом случае значение скорости в следующий момент времени вычисляется очень просто:

Видно, что в этом уравнении всё известно, если не из исходных данных, то из начальных условий. Остаётся только загнать это решение в цикл хоть на C++, хоть на Delphi. Я сделал это в Mathcad:


Логично предположить, что чем меньше мы возьмём шаг, тем больше будет точность расчёта, но тем дольше нам придётся ждать результата. Понятно, что мы живём не в каменном веке с перфокартами, но если вам придётся замоделировать систему где-то из сорока гидроцилиндров, вы поймёте, что на шаг интегрирования тоже нужно обращать внимание. Кроме того, слишком большой шаг интегрирования может дать картинку, похожую на правду, но на самом деле ошибочную. Вот пример:

Красная линия - шаг по времени - 1 мс, синяя - 2 мс, чёрная - 3 мс.
Характерная картинка, когда решение не получилось из-за слишком крупного шага:

Если система более сложная, можно запросто принять это за потерю устойчивости. Поэтому, на будущее, прежде чем делать выводы по модели, нужно поиграться с точностью решателя.

Конечно, только самые отъявленные фанаты могут писать математические модели на C++ или даже в Mathcad в век таких программ как MATLAB Simulink, Simulation X, Adams и другие. Они позволяют сделать модель более наглядной, читаемой другими специалистами, а так же делают возможным использование всяких фишек начиная от продвинутых решателей обыкновенных дифференциальных уравнений и заканчивая многочисленными методами оптимизации. В следующих постах я постараюсь привести пример решения этой задачи в MATLAB Simulink при помощи блок-диаграмм, а так же с использованием библиотеки готовых элементов.

Date: 2015-10-02 03:26 pm (UTC)
From: [identity profile] fixik-papus.livejournal.com
"только самые отъявленные фанаты могут писать математические модели на C++"

Это если нужно "поиграться".

Контроллеры, которые имеют в составе операционки Матлаб, на сегодняшний момент не производятся. Посему в реальной инженерной работе программировать те же конечные разности приходится постоянно то на С, то на Паскале (STL есть суть Паскаль)

Date: 2015-10-02 06:23 pm (UTC)
From: [identity profile] engineerandreev.livejournal.com
Зато есть возможность экспортировать модель в код C прямо из матлаба.
Хотя, если речь идёт, например, о несложной модели-наблюдателе, то я согласен, что проще быстро написать код на С.

Date: 2015-10-03 08:43 pm (UTC)
From: [identity profile] fixik-papus.livejournal.com
Это да, но есть и проблемки
Код, генеримый Матлабом, в простеньких контроллерах тормозит шо пипец, и ни о каком обсчете 100 раз в секунду не может быть и речи
А есть контроллеры, которые вообще не программируются на С (тот же Сименс)

Date: 2015-10-04 01:02 pm (UTC)
From: [identity profile] engineerandreev.livejournal.com
В матлабе опять же есть оптимизаторы этого кода)
Чем ещё хорош матлаб, так это тем, что упрощает взаимодействие между различными специалистами.
У меня была задача написать математическую модель гидросистемы с огромным количеством элементов (более 20 гидроцилиндров, примерно столько же распределителей, несколько гидроаккумуляторов) для стенда полунатурного моделирования. К тому моменту у меня были наработки как на C, так и в симулинке и мне было особо без разницы на чём писать. Но наши управленцы предпочли собрать со всех модели соответствующих подсистем в симулинке, и я их понимаю) Одно дело, когда есть блок подсистемы с тестовыми сигналами и соответствующими протоколам откликами, а другое дело разбираться в быдлокоде каждого программиста-самоучки и выковыривать оттуда нужные куски.

Date: 2016-07-19 06:16 pm (UTC)
From: [identity profile] alexgrach1985.livejournal.com
Matlab плох тем, что лицензия стоит 1,5млн рублей. Это очень дорого.
Имея простой математический аппарат, я смогу "на калькуляторе" в open office посчитать всё, что мне необходимо.
Потом это запрограммировать и сделать на arduino или https://www.raspberrypi.org/
типа так https://www.youtube.com/watch?v=y-yh7weJWYI&index=93&list=PLlqHlMY0qqKHtazqFUao9rA_SZ13aiUTZ
Page generated Sep. 20th, 2017 12:21 am
Powered by Dreamwidth Studios