Журнал LinuxFormat - перейти на главную

LXF108:SciLab

Материал из Linuxformat
Версия от 16:42, 24 августа 2009; Yaleks (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
SciLab

Содержание

Scilab: Имитационное моделирование

ЧАСТЬ 3 Одним из великих даров компьютерной эры является возможность увидеть невидимое и услышать неслышимое. Александр Бикмеев предлагает заглянуть в «черный ящик».

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

То, чем мы собираемся заняться, называется компьютерным экспериментом в форме имитационного моделирования. Для этой цели в системе Matlab есть Simulink, а в Scilab – Sciсos. Это инструмент для моделирования динамических процессов с помощью функциональных блоков и связей между ними. Проще говоря, математическая модель изучаемого объекта или процесса составляется из определенных блоков, а затем при помощи связей указывается, как данные перемещаются от одного блока к другому. Да, то же самое можно проделать, написав программу на встроенном языке, но если уже есть готовые блоки, так почему бы не воспользоваться ими? Кроме того, описание модели в виде диаграммы более наглядно и информативно.

Конечно, Scicos содержит не так много диаграмм, как Simulink, однако для моделирования многих объектов и процессов, а особенно для целей обучения он вполне подойдет.

Ну-с, приступим

(thumbnail)
Рис. 1. Так выглядит графический редактор Scicos и древо палитр блоков.

Scicos содержит графический редактор, представляющий собой окно, в котором отображается диаграмма и отдельные окна палитр блоков. Вызывается он командой scicos; (точку с запятой можно не ставить, но тогда все окно Scilab будет заполнено служебной информацией). По сути, окно графического редактора Scicos не очень-то и отличается от самого Scilab, но в нем нельзя вводить текст; вы также заметите, что главное меню содержит несколько новых пунктов: Diagram (для задания параметров всей диаграммы), Simulate (для компиляции, определения параметров и запуска модели), Tools (инструменты для различных служебных задач) и Palette (работа с палитрами функциональных блоков). Это графическое окно, и если белый фон навевает на вас скуку, можете изменить его, щелкнув правой кнопкой мыши в пустой области окна диаграммы и выбрав в появившемся меню пункт Background color.

Все блоки сгруппированы в палитры. Вывести любую из них можно, выбрав последовательно Palette > Palettes, а затем щелкнув на требуемой панели в появившемся окне. Однако более удобно в работе древо палитр, поскольку в этом случае все блоки присутствуют на экране одновременно (см. рис. 1): оно вызывается последовательным выбором Palette > Pal tree.

Блоки могут иметь различное число входов и выходов, называемых портами. Входной порт обозначается треугольником с углом, направленным в блок, а порт-выход – с углом, направленным из блока. Порты делятся на обычные (для ввода/вывода данных в/из блока), которые отображаются черным цветом, и активационные или управляющие (для ввода/вывода управляющей информации), отмечаемые красным цветом. Как правило, обычные порты расположены по бокам блока, а управляющие – сверху и снизу.

При составлении диаграммы вначале необходимо дважды щелкнуть на желаемом блоке, а затем перенести курсор мыши (он примет вид иконки блока) в окно диаграммы и левым щелчком установить блок в нужном месте. Позиция блока не фиксирована, то есть впоследствии, если потребуется, вы сможете переместить блок, не нарушая связи и сохранив его атрибуты. Блоки также можно поворачивать и отражать: чтобы сделать это, щелкните на блоке правой кнопкой мыши и выберите в появившемся меню один из трех пунктов: Rotate Left (повернуть против часовой стрелки на 450), Rotate Right (повернуть по часовой стрелке на 450) или Flip (перевернуть, отразить).

После переноса блоков их необходимо соединить между собой. Для создания связи следует щелкнуть на треугольнике выходного порта одного блока, а затем – на треугольнике входного порта другого. При этом будет создана прямая линия. Если вам необходимо создать ломаную, то каждую ее точку можно определить левым щелчком в пустой области, точно так же, как при рисовании многоугольника в OOo Draw. Когда вы, наконец, щелкнете на входном порту, редактор постарается сделать углы вашей линии прямыми. Каждый входной порт соединяется лишь с одним выходным портом. Если вам необходимо провести линии от одного блока ко многим, например, передать одно и то же значение на вход нескольких расчетных блоков или синхронизировать несколько генераторов, то сначала проводится одна связь, а затем от ее линии создаются ответвления. Для этого следует выполнить двойной щелчок в каком-либо месте связи и провести дополнительную ветвь. Альтернативный вариант – использовать блоки MUX и DEMUX.

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

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

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

Что в черном ящике?

Немного истории

Sciсos – это часть пакета Scilab, распространяемая совместно с ним. Изначально она разрабатывалась Р. Никухой [R. Nikoukhah] на языке Scilab и не имела графического интерфейса. Позднее, для первого официального релиза в 1994, разработчик переписал имитатор на Fortran и частично на C, а С. Штеер [S. Steer] разработал графический редактор. До конца 90-х Sciсos развивался медленно силами студентов и аспирантов. С 2000 года работа над ним значительно ускорилась благодаря контракту с R&D. В частности был разработан новый имитатор на С, расширены типы данных, внедрен компилятор Modelica, разработаны интерфейсы взаимодействия с внешними устройствами.

Ключевую роль в продвижении Scicos сыграла книга “Modeling and Simulation in Scilab/Scicos”, вышедшая в издательстве Springer в 2006 году (к сожалению, на русский язык она не переведена). В 2008 году для версии SciLab 4.1.2 был разработан абсолютно новый многооконный графический интерфейс и алгоритм компиляции, кроме того, Scicos был адаптирован под лицензию GPL.

(thumbnail)
Рис. 2. Измененная диаграмма с заданным смещением коробки.

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

Рассмотрим такой пример: в коробке находится несколько упругих шариков, и в какой-то момент времени мы начинаем наблюдать за ними. Для этого случая модель уже построена и включена в демонстрационные примеры, поэтому в редакторе Scicos выберите последовательно пункты меню ? > Demos, а затем, в появившемся окне, укажите файл bounce.cosf. После этого в редакторе откроется диаграмма, показанная на рис. 1. В ней всего три блока, так что разобрать ее труда не составит.

Первый (имеющий вид красных часов) – это стандартный управляющий блок, без которого не обходится практически ни одна диаграмма. Он генерирует регулярные события, с заданным пользователем периодом. В данном случае он отсчитывает время, то есть подает команду на пересчет системы и отрисовку текущего состояния через определенные интервалы. Этот блок имеет всего два параметра: Period – период генерации событий и init time – начальное значение времени.

Блок, с которым соединены часы, представляет собой инструмент анимации, подстроенный специально для данной задачи. (Есть сходный инструмент, расположенный на палитре Sinks.) У него много параметров, и большая их часть задается векторами, размерность которых совпадает с числом шариков. Они определяют цвета шариков, их радиусы и границы коробки.

Ну, а третий блок осуществляет расчеты и выдает вектора координат. У него тоже много параметров, которые задают массу, радиус шариков, коэффициент аэродинамики, ускорение свободного падения...

Запустите модель на выполнение (Simulate > Run), и вы увидите, что происходит в неподвижной коробке с несколькими шариками. Хотите почувствовать разницу между Землей, Луной и Юпитером? Измените параметр g (gravity) и посмотрите, как он влияет на поведение системы. Чтобы остановить выполнение, нажмите на кнопку Stop в редакторе диаграмм (заметьте – не в окне с анимацией).

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

Добавим к открытой диаграмме описание смещения коробки, то есть синусоидальное изменение координаты шарика х и синусоидальные изменения со случайной амплитудой координаты y. Посмотрите результат на рис. 2.

Блок с красным фоном описывает смещение коробки по оси х и представляет собой генератор синусоидального сигнала с палитры Sources. У него есть три параметра: Magnitude – максимальная по модулю величина сигнала, в нашем случае это максимальное смещение коробки (установите 2); Frequency – частота колебаний (мы выберем здесь значение 15); и phase – начальная фаза колебаний (укажите 0).

Блоки с зеленым фоном задают смещение коробки по вертикали. Первый из них – это просто генератор событий (красные часы), который используется для выдачи случайного значения амплитуды колебаний (установите значение period в 0.2). Далее идет сам блок-генератор случайных чисел (random generator). У него есть несколько интересных нам параметров, например, flag – флаг, определяющий как использовать параметры A и B:

  • 0: A – это минимум, а максимальное значение равно A + B;
  • 1: A – это среднее, а B – отклонение от среднего.

Установите flag равным 1, A – 0, B – 0,5. Ниже расположен знакомый нам генератор синусоиды. Укажите в нем следующие значения параметров: Magnitude – 0.5, Frequency – 5. Затем случайное значение амплитуды умножается на периодический сигнал (блок Product панели NonLinear) и прибавляется к координате y.

Теперь нам осталось задать параметры расчета смещения шарика. Дважды щелкаем на блоке Bouncing balls и устанавливаем следующие значения: Mass – [1], radius – [1], [xmin,xmax,ymin,ymax] – [0;10;0;10]; xpos, xdpos, ypos, ydpos – 5. Файл диаграммы со всеми изменениями (Ball_in_a_box1.cos) вы можете найти на LXFDVD в разделе Журнал.

Чтобы посмотреть движение нескольких шариков, необходимо изменить параметры блока Bouncing balls, указав для Mass, radius, xpos, xdpos, ypos, ydpos вектора с числом элементов, равным количеству шариков. Но этого мало: необходимо также добавить в диаграмму перед блоками суммирования блок Scalar to vector с палитры Branching. Ведь смещение коробки вдоль каждой оси есть скаляр, а координаты нескольких шариков передаются в виде векторов. Измененную диаграмму для этого случая (файл Ball_In_a_Box_1m.cos) вы также сможете найти на диске.

Запустите модель на выполнение. Правда, похоже? Но шарик вылетает за стенки коробки, а это неправильно! Так происходит потому, что мы добавили смещение коробки к координатам уже при выполнении анимации, а на расчет наши добавки никак не влияют.

Таким образом, готовая модель не помогла нам точно описать нашу систему даже после изменений. С другой стороны, хоть какой-то характер движения мы выяснили. Более того, надеюсь, вам стало понятно, как применяются управляющие сигналы и как создаются диаграммы. А это и есть наша главная цель.

Создание более точной модели требует детального анализа системы, вывода уравнений ее состояния (что, в принципе, делается довольно просто), но самое главное и самое трудное – это собрать диаграмму из блоков. Вот вам «домашнее задание»: попробуйте самостоятельно получить уравнения и создать модель шарика в подвижной коробке, и пришлите нам ваши результаты по адресу: letters@linuxformat.ru. Небольшая подсказка: вы можете воспользоваться готовой демонстрационной диаграммой с именем Bouncing_ball.cosf.

Суперигра

(thumbnail)
Рис. 3. Главная диаграмма с суперблоком.

Вернемся к нашим диаграммам. Я думаю, вы понимаете, что диаграммы не всегда можно уместить на одном листе: зачастую они бывают достаточно объемны, и их трудно отлаживать, а также обозревать. Некоторые блоки можно логически объединить в большие суперблоки, со своими входами и выходами. Для этой цели в Scicos существует специальный блок с именем SUPER_f. На рис. 3 приведен пример «правильной» диаграммы для моделирования шарика в движущейся коробке, где части расчета координат x и y для шарика упакованы в суперблоки (мы-то уже решили эту задачку!).

Создать суперблок можно двумя способами: обычным, т.е. просто перенести в диаграмму и затем наполнить его содержимым, и путем преобразования уже имеющейся части диаграммы. Последнее выполняется следующим образом: выделяем несколько блоков, а затем последовательно выбираем пункты меню Diagram > Region to Super block.

Чтобы увидеть и изменить содержимое суперблока, достаточно щелкнуть дважды на его иконке. Открывшееся окно в системной строке-заголовке будет содержать текст SuperBlock, а кнопка Simulate станет недоступной, поскольку запускать модель на выполнение можно только из главного окна.

Каждый суперблок может содержать определенное число входных и выходных портов – как для данных, так и для управляющих сигналов. Таким образом, суперблок – это своего рода подпрограмма, и его можно отлаживать отдельно от основной части диаграммы, а затем вставить в нее уже готовеньким.

Перечень палитр блоков
  • Sources (источники) – блоки, представляющие собой источники данных или сигналов.
  • Sinks (приемники) – блоки вывода или отображения данных.
  • Linear (линейные) – базовые линейные операторы и подсистемы.
  • Non_Linear (нелинейные) – нелинейные функции и подсистемы.
  • Matrix (Матричные) – простые и сложные операции матричной алгебры.
  • Integer (Целое) – различные операции для работы с целыми числами.
  • Events (События) – блоки управления событиями в модели и синхронизации.
  • Thresholds (Граница) – блоки для генерации событий при обращении входной величины в нуль.
  • Others (Другие) – блоки различной направленности, от подключения программ на других языках программирования до решения уравнений в частных производных.
  • Branching (Ветвление) – управление перемещением данных в ссылках.
  • Electrical (Электричество) – базовые электрические блоки.
  • ThermoHydraulics (Термодинамика) – основные элементы термодинамики.
  • OldBlocks (Старые блоки) – старые версии блоков.
  • DemoBlocks (Демо блоки) – блоки из демонстрационных примеров.

Входной порт данных определяется блоком IN_f (палитра Sources), а выходной – OUT_f (палитра Sinks). Для управляющих сигналов используются CLKINV_f и CLKOUTV_f с соответствующих палитр. Каждый входной или выходной порт суперблока должен иметь уникальный для своей группы номер, т.е. все входные порты данных нумеруются с 1, все выходные также нумеруются с 1, и т.д. Во время отладки суперблока в виде отдельной диаграммы входные и выходные блоки можно заменить некими тестовыми константами или зависимостями.

Scicos содержит также средства отладки, но программисты сочтут их весьма и весьма убогими. Выбрав последовательно пункты меню Simulate > Debug level, вы можете установить уровень режима отладки:

  • 0 нет отладки;
  • 1 краткая отладочная информация;
  • 2 подробная отладочная информация;
  • 3 молчаливая отладка, то есть режим отладки включен, но информация не выводится.

Вся отладочная информация отображается в окне Scilab, а не в редакторе Scicos, так что не убирайте его далеко. Кроме изменения режима отладки, вы можете перенести в суперблоки блок Debug с палитры Others. Он вызывается первым при входе в суперблок и может содержать скрипт на языке Scilab, позволяющий вам выполнить те или иные действия. По умолчанию в нем стоит команда pause, приостанавливающая процесс выполнения.

В заключение хочется вновь сказать, что пусть Simulink удобнее, имеет больше возможностей и широко известен, а потому для него существует обширная документация, но он очень дорого стоит. Scicos намного моложе и пока что неказист, и не может составить серьезную конкуренцию своему более именитому собрату. Однако я думаю, что со временем все изменится. Число членов консорциума Scilab растет все быстрее и быстрее, благодаря ужесточению законодательства в нашей стране все больше людей смотрят в сторону Scilab/Scicos, а для свободного ПО это автоматически приводит к увеличению числа разработчиков. Присоединяйтесь и вы! Помните, что даже если вы не программист и плохо разбираетесь в каких-то моментах, вы всегда можете внести посильную лепту путем перевода или написания документации, а ее катастрофически не хватает.

Персональные инструменты
купить
подписаться
Яндекс.Метрика