Решение задачи прямым программированием в SimInTech

Мы уже рассмотрели три способа создания модели.

На самом деле 2, создание принципиальной схемы, это просто оформительские изыски, при этом внутри блоков принципиальной схемы, могли быть как блоки на языке программирования, так и схемы из стандартных блоков. А можно их и сочетать: например, дроссель сделать на базе блока типа «Язык программирования», а гидроцилиндр собрать из блоков в синей и зеленой рамке на рисунке 23, или наоборот.

Но оба этих варианта для расчета используют готовые методы интегрирования, предоставляемые SimInTech. Но что делать, если мы хотим сами своими руками интегрировать, как настоящие профессионалы? Нам что, нужно бросать SimInTech и брать в руки фортран? Конечно нет!

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

превращается в уравнение:
где vi+1 и vi – скорости в моменты времени ti+1 и ti . Тогда решение становится простым – зная параметр в один момент времени, мы можем посчитать, каким он будет через промежуток времени Δt:
Видно, что в этом уравнении в правой части только известные нам величины. То же самое нужно проделать с остальными уравнениями системы.

Если же объяснять совсем по-простому, то система уравнений в форме Коши, это когда слева стоят производные (скорости изменения величин), а справа формулы для их вычисления. Что бы решить систему методом Эйлера, нам нужно знать начальное состояние Х10 ... XN0 (оно известно).

Из системы в форме Коши мы можем посчитать скорости изменений всех величин V10 ... VN0 в начальный момент времени (системы уравнений).

А теперь, главное предположение, мы выбираем шаг таким маленьким Δt, что все скорости в системе не меняются в течение шага интегрирования. И тогда любая величина на следующем шаге будет равна Х11 = Х10 + V10 × Δt (время на скорость изменения).

Ура! Мы получили новые значения Х11 .. XN1! Повторим шаг. С божьей помощью из уравнений Коши мы получили новые значения скорости; и так мелким шагами, пока не посчитали весь процесс.

Это простой, но работающий способ! Можно будет хоть на калькуляторе посчитать значения ровно для такого количества шагов, на которое хватит терпения. Но лучше, конечно, доверить это рутинное занятие вычислительной машине. Можно написать цикл на C++, в Delphi, а мы сделаем это в SimInTech.

Берем блок "Язык программирования" и создаем константы и переменные, необходимые для расчета, блок не имеет входа, а только выход (Рисунок 1):

Рисунок 1. Объявления констант и переменных

Расчет мы будем производить в секции инициализации, которая выполняется один раз на страте расчета. Здесь пришлось повторить расчет площади сечений для того, чтобы можно было отлаживать скрипт, не запуская главное окно программы. Сначала готовим вектора, где будем хранить результаты и присваиваем значения для нулевого шага (Рисунок 2):

Рисунок 2. Подготовка первого шага

Дальше непосредственно сам цикл расчета. Обратите внимание, что мы практически переписываем без изменений уравнения в форме Коши, только без штриха, который писали при создании блоков в первой части (Рисунок 3).

Рисунок 3. Цикл расчета шагов по времени

В результате после завершения цикла инициализации у нас появляются два вектора T – вектор времен, Х – вектор положения штока. Задача решена – для любого значения времени у нас есть положение штока.
Теперь обеспечим возможность сравнивать результат ручного расчета методом Эйлера, и другие способы моделирования. Для этого после секции инициализации, на каждом шаге внешнего моделирования будем выдавать на выход блока значения, рассчитанные функцией интерполяции. При этом мы помним, что мы рассчитали скачок с нулевого времени, а во внешней модели для сравнения используется скачок на 1 секунде расчета (см. Рисунок 4).

Рисунок 4. Основной текст программы

Программу можно запускать и отлаживать непосредственно в окне редактирования скрипта, и просматривать все значения переменных (Расчет/Посмотреть все).
Можно также просматривать результаты в виде графиков (Расчет/Построить зависимость, см. Рисунок 5):

Рисунок 5. Отладка программы прямого расчета

Таким образом, SimInTech позволяет внутри каждого блока иметь свое рабочее пространство Matlab.

Теперь можно выводить все варианты на один график и производить всякие сравнения и численные эксперименты.