http://wiki.linuxformat.ru/wiki/index.php?title=LXF108:SciLab&feed=atom&action=historyLXF108:SciLab - История изменений2024-03-28T14:44:26ZИстория изменений этой страницы в викиMediaWiki 1.19.20+dfsg-0+deb7u3http://wiki.linuxformat.ru/wiki/index.php?title=LXF108:SciLab&diff=8528&oldid=prevYaleks: Новая: {{Цикл/SciLab}} == Scilab: Имитационное моделирование == : ''ЧАСТЬ 3 Одним из великих даров компьютерной эры явл...2009-08-24T13:42:48Z<p>Новая: {{Цикл/SciLab}} == Scilab: Имитационное моделирование == : ''ЧАСТЬ 3 Одним из великих даров компьютерной эры явл...</p>
<p><b>Новая страница</b></p><div>{{Цикл/SciLab}}<br />
== Scilab: Имитационное моделирование ==<br />
: ''ЧАСТЬ 3 Одним из великих даров компьютерной эры является возможность увидеть невидимое и услышать неслышимое. '''Александр Бикмеев''' предлагает заглянуть в «черный ящик».''<br />
<br />
Не знаю, как вам, а мне всегда хотелось узнать и увидеть<br />
недоступное: как выглядит черная дыра изнутри, где находится граница литосферы и магмы, на что была похожа<br />
Вселенная за мгновение до Большого взрыва... да хотя бы что происходит с шариком (или мухой) в закрытой коробке, когда я ее трясу?<br />
Благодаря Scilab и моим Учителям я могу проникнуть в эти тайны, но<br />
рамки журнала не позволяют рассказать обо всем. Поэтому придется<br />
проявить скромность и остановиться на коробке и шарике.<br />
<br />
То, чем мы собираемся заняться, называется компьютерным экспериментом в форме имитационного моделирования. Для этой цели<br />
в системе Matlab есть Simulink, а в Scilab – Sciсos. Это инструмент<br />
для моделирования динамических процессов с помощью функциональных блоков и связей между ними. Проще говоря, математическая модель изучаемого объекта или процесса составляется из<br />
определенных блоков, а затем при помощи связей указывается, как<br />
данные перемещаются от одного блока к другому. Да, то же самое<br />
можно проделать, написав программу на встроенном языке, но если<br />
уже есть готовые блоки, так почему бы не воспользоваться ими?<br />
Кроме того, описание модели в виде диаграммы более наглядно и<br />
информативно.<br />
<br />
Конечно, Scicos содержит не так много диаграмм, как Simulink,<br />
однако для моделирования многих объектов и процессов, а особенно<br />
для целей обучения он вполне подойдет.<br />
<br />
=== Ну-с, приступим ===<br />
[[Изображение:LXF108 78 1.png|thumb|300px|Рис. 1. Так выглядит графический редактор Scicos и древо палитр блоков.]]<br />
Scicos содержит графический редактор, представляющий собой окно,<br />
в котором отображается диаграмма и отдельные окна палитр блоков.<br />
Вызывается он командой scicos; (точку с запятой можно не ставить,<br />
но тогда все окно Scilab будет заполнено служебной информацией).<br />
По сути, окно графического редактора Scicos не очень-то и отличается от самого Scilab, но в нем нельзя вводить текст; вы также заметите,<br />
что главное меню содержит несколько новых пунктов: Diagram (для<br />
задания параметров всей диаграммы), Simulate (для компиляции,<br />
определения параметров и запуска модели), Tools (инструменты для<br />
различных служебных задач) и Palette (работа с палитрами функциональных блоков). Это графическое окно, и если белый фон навевает<br />
на вас скуку, можете изменить его, щелкнув правой кнопкой мыши в<br />
пустой области окна диаграммы и выбрав в появившемся меню пункт<br />
Background color.<br />
<br />
Все блоки сгруппированы в палитры. Вывести любую из них можно, выбрав последовательно Palette > Palettes, а затем щелкнув на<br />
требуемой панели в появившемся окне. Однако более удобно в работе древо палитр, поскольку в этом случае все блоки присутствуют на<br />
экране одновременно (см. рис. 1): оно вызывается последовательным<br />
выбором Palette > Pal tree.<br />
<br />
Блоки могут иметь различное число входов и выходов, называемых портами. Входной порт обозначается треугольником с углом,<br />
направленным в блок, а порт-выход – с углом, направленным из<br />
блока. Порты делятся на обычные (для ввода/вывода данных в/из<br />
блока), которые отображаются черным цветом, и активационные или<br />
управляющие (для ввода/вывода управляющей информации), отмечаемые красным цветом. Как правило, обычные порты расположены<br />
по бокам блока, а управляющие – сверху и снизу.<br />
<br />
При составлении диаграммы вначале необходимо дважды щелкнуть на желаемом блоке, а затем перенести курсор мыши (он примет<br />
вид иконки блока) в окно диаграммы и левым щелчком установить<br />
блок в нужном месте. Позиция блока не фиксирована, то есть впоследствии, если потребуется, вы сможете переместить блок, не нарушая связи и сохранив его атрибуты. Блоки также можно поворачивать<br />
и отражать: чтобы сделать это, щелкните на блоке правой кнопкой<br />
мыши и выберите в появившемся меню один из трех пунктов: Rotate<br />
Left (повернуть против часовой стрелки на 450), Rotate Right (повернуть по часовой стрелке на 450) или Flip (перевернуть, отразить).<br />
<br />
После переноса блоков их необходимо соединить между собой.<br />
Для создания связи следует щелкнуть на треугольнике выходного<br />
порта одного блока, а затем – на треугольнике входного порта другого. При этом будет создана прямая линия. Если вам необходимо создать ломаную, то каждую ее точку можно определить левым щелчком<br />
в пустой области, точно так же, как при рисовании многоугольника в<br />
OOo Draw. Когда вы, наконец, щелкнете на входном порту, редактор<br />
постарается сделать углы вашей линии прямыми. Каждый входной<br />
порт соединяется лишь с одним выходным портом. Если вам необходимо провести линии от одного блока ко многим, например, передать<br />
одно и то же значение на вход нескольких расчетных блоков или синхронизировать несколько генераторов, то сначала проводится одна<br />
связь, а затем от ее линии создаются ответвления. Для этого следует выполнить двойной щелчок в каком-либо месте связи и провести<br />
дополнительную ветвь. Альтернативный вариант – использовать блоки MUX и DEMUX.<br />
<br />
Существует два вида связей: для передачи данных (черного цвета) и для передачи управляющей/временной информации (красного цвета). Пользователь может изменить цвета связей, но не цвет<br />
входа/выхода блока: он четко указывает необходимый тип связи.<br />
Следует также помнить, что обычный и управляющий порты соединить нельзя.<br />
<br />
Почти все блоки имеют изменяемые параметры, определяющие<br />
обработку информации или поведение. Чтобы открыть окно с перечнем параметров, достаточно дважды щелкнуть на блоке левой кнопкой мыши.<br />
<br />
Как создаются диаграммы, надеюсь, понятно. Но как же выбирать<br />
блоки для решения конкретной задачи и какие блоки с чем соединять? Вот в этом-то и заключается искусство экспериментатора. В<br />
рамках данной статьи я не смогу описать назначение всех блоков<br />
(читайте справку), но постараюсь объяснить базовые принципы.<br />
<br />
=== Что в черном ящике? ===<br />
{{Врезка<br />
|Заголовок=Немного истории<br />
|Содержание=Sciсos – это часть<br />
пакета Scilab,<br />
распространяемая<br />
совместно с ним.<br />
Изначально она<br />
разрабатывалась<br />
Р. Никухой<br />
[R. Nikoukhah] на<br />
языке Scilab и не<br />
имела графического интерфейса.<br />
Позднее, для<br />
первого официального релиза в<br />
1994, разработчик<br />
переписал имитатор на Fortran и<br />
частично на C,<br />
а С. Штеер<br />
[S. Steer] разработал графический<br />
редактор.<br />
До конца 90-х<br />
Sciсos развивался<br />
медленно силами<br />
студентов и<br />
аспирантов. С 2000<br />
года работа над<br />
ним значительно<br />
ускорилась благодаря контракту с<br />
R&D. В частности<br />
был разработан<br />
новый имитатор<br />
на С, расширены<br />
типы данных, внедрен компилятор<br />
Modelica, разработаны интерфейсы<br />
взаимодействия с<br />
внешними устройствами.<br />
<br />
Ключевую роль<br />
в продвижении<br />
Scicos сыграла<br />
книга “Modeling<br />
and Simulation in<br />
Scilab/Scicos”,<br />
вышедшая в издательстве Springer в<br />
2006 году<br />
(к сожалению, на<br />
русский язык она<br />
не переведена). В<br />
2008 году для версии SciLab 4.1.2<br />
был разработан<br />
абсолютно новый<br />
многооконный<br />
графический<br />
интерфейс и алгоритм компиляции,<br />
кроме того, Scicos<br />
был адаптирован<br />
под лицензию GPL.<br />
|Ширина=300px}}<br />
[[Изображение:LXF108 79 1.png|thumb|300px|Рис. 2. Измененная диаграмма с заданным смещением коробки.]]<br />
Прежде чем переходить к созданию диаграммы, следует построить<br />
математическую модель, то есть записать уравнение или систему<br />
уравнений, описывающих процесс, а также определить начальные<br />
условия и внутренние константы. Scicos сможет решить поставленную перед ним задачу только при условии, что вы сами понимаете ее,<br />
в противном случае не поможет и суперкомпьютер.<br />
<br />
Рассмотрим такой пример: в коробке находится несколько упругих шариков, и в какой-то момент времени мы начинаем наблюдать за ними. Для этого случая модель уже построена и включена в<br />
демонстрационные примеры, поэтому в редакторе Scicos выберите<br />
последовательно пункты меню ? > Demos, а затем, в появившемся<br />
окне, укажите файл bounce.cosf. После этого в редакторе откроется<br />
диаграмма, показанная на рис. 1. В ней всего три блока, так что разобрать ее труда не составит.<br />
<br />
Первый (имеющий вид красных часов) – это стандартный управляющий блок, без которого не обходится практически ни одна диаграмма. Он генерирует регулярные события, с заданным пользователем периодом. В данном случае он отсчитывает время, то есть подает<br />
команду на пересчет системы и отрисовку текущего состояния через<br />
определенные интервалы. Этот блок имеет всего два параметра:<br />
Period – период генерации событий и init time – начальное значение<br />
времени.<br />
<br />
Блок, с которым соединены часы, представляет собой инструмент анимации, подстроенный специально для данной задачи. (Есть<br />
сходный инструмент, расположенный на палитре Sinks.) У него много параметров, и большая их часть задается векторами, размерность<br />
которых совпадает с числом шариков. Они определяют цвета шариков, их радиусы и границы коробки.<br />
<br />
Ну, а третий блок осуществляет расчеты и выдает вектора координат. У него тоже много параметров, которые задают массу, радиус шариков, коэффициент аэродинамики, ускорение свободного<br />
падения...<br />
<br />
Запустите модель на выполнение (Simulate > Run), и вы увидите,<br />
что происходит в неподвижной коробке с несколькими шариками.<br />
Хотите почувствовать разницу между Землей, Луной и Юпитером?<br />
Измените параметр g (gravity) и посмотрите, как он влияет на поведение системы. Чтобы остановить выполнение, нажмите на кнопку Stop<br />
в редакторе диаграмм (заметьте – не в окне с анимацией).<br />
<br />
Но в нашей задаче всего один шарик, и коробка движется.<br />
Попробуем изменить данную модель в соответствии с новыми<br />
условиями. Пусть коробка (и шарик) находятся в поле тяготения и<br />
коробка совершает синусоидальные колебания вдоль горизонтальной оси, а также периодические со случайной амплитудой – вдоль<br />
вертикальной.<br />
<br />
Добавим к открытой диаграмме описание смещения коробки, то<br />
есть синусоидальное изменение координаты шарика х и синусоидальные изменения со случайной амплитудой координаты y. Посмотрите<br />
результат на рис. 2.<br />
<br />
Блок с красным фоном описывает смещение коробки по оси х и<br />
представляет собой генератор синусоидального сигнала с палитры<br />
Sources. У него есть три параметра: Magnitude – максимальная по<br />
модулю величина сигнала, в нашем случае это максимальное смещение коробки (установите 2); Frequency – частота колебаний (мы<br />
выберем здесь значение 15); и phase – начальная фаза колебаний<br />
(укажите 0).<br />
<br />
Блоки с зеленым фоном задают смещение коробки по вертикали. Первый из них – это просто генератор событий (красные часы),<br />
который используется для выдачи случайного значения амплитуды<br />
колебаний (установите значение period в 0.2). Далее идет сам блок-генератор случайных чисел (random generator). У него есть несколько<br />
интересных нам параметров, например, flag – флаг, определяющий<br />
как использовать параметры A и B:<br />
* 0: A – это минимум, а максимальное значение равно A + B;<br />
* 1: A – это среднее, а B – отклонение от среднего.<br />
Установите flag равным 1, A – 0, B – 0,5. Ниже расположен знакомый нам генератор синусоиды. Укажите в нем следующие значения<br />
параметров: Magnitude – 0.5, Frequency – 5. Затем случайное значение<br />
амплитуды умножается на периодический сигнал (блок Product панели NonLinear) и прибавляется к координате y.<br />
<br />
Теперь нам осталось задать параметры расчета смещения шарика.<br />
Дважды щелкаем на блоке Bouncing balls и устанавливаем следующие<br />
значения: Mass – [1], radius – [1], [xmin,xmax,ymin,ymax] – [0;10;0;10];<br />
xpos, xdpos, ypos, ydpos – 5. Файл диаграммы со всеми изменениями<br />
(Ball_in_a_box1.cos) вы можете найти на LXFDVD в разделе Журнал.<br />
<br />
Чтобы посмотреть движение нескольких шариков, необходимо<br />
изменить параметры блока Bouncing balls, указав для Mass, radius,<br />
xpos, xdpos, ypos, ydpos вектора с числом элементов, равным количеству шариков. Но этого мало: необходимо также добавить в диаграмму перед блоками суммирования блок Scalar to vector с палитры<br />
Branching. Ведь смещение коробки вдоль каждой оси есть скаляр,<br />
а координаты нескольких шариков передаются в виде векторов.<br />
Измененную диаграмму для этого случая (файл Ball_In_a_Box_1m.cos) вы также сможете найти на диске.<br />
<br />
Запустите модель на выполнение. Правда, похоже? Но шарик<br />
вылетает за стенки коробки, а это неправильно! Так происходит<br />
потому, что мы добавили смещение коробки к координатам уже при<br />
выполнении анимации, а на расчет наши добавки никак не влияют.<br />
<br />
Таким образом, готовая модель не помогла нам точно описать<br />
нашу систему даже после изменений. С другой стороны, хоть какой-то характер движения мы выяснили. Более того, надеюсь, вам стало<br />
понятно, как применяются управляющие сигналы и как создаются<br />
диаграммы. А это и есть наша главная цель.<br />
<br />
Создание более точной модели требует детального анализа системы, вывода уравнений ее состояния (что, в принципе, делается довольно просто), но самое главное и самое трудное – это собрать диаграмму<br />
из блоков. Вот вам «домашнее задание»: попробуйте самостоятельно<br />
получить уравнения и создать модель шарика в подвижной коробке,<br />
и пришлите нам ваши результаты по адресу: [mailto:letters@linuxformat.ru letters@linuxformat.ru].<br />
Небольшая подсказка: вы можете воспользоваться готовой демонстрационной диаграммой с именем Bouncing_ball.cosf.<br />
<br />
=== Суперигра ===<br />
[[Изображение:LXF108 80 1.png|thumb|300px|Рис. 3. Главная диаграмма с суперблоком.]]<br />
Вернемся к нашим диаграммам. Я думаю, вы понимаете, что диаграммы не всегда можно уместить на одном листе: зачастую они<br />
бывают достаточно объемны, и их трудно отлаживать, а также обозревать. Некоторые блоки можно логически объединить в большие<br />
суперблоки, со своими входами и выходами. Для этой цели в Scicos<br />
существует специальный блок с именем SUPER_f. На рис. 3 приведен<br />
пример «правильной» диаграммы для моделирования шарика в движущейся коробке, где части расчета координат x и y для шарика упакованы в суперблоки (мы-то уже решили эту задачку!).<br />
<br />
Создать суперблок можно двумя способами: обычным, т.е. просто перенести в диаграмму и затем наполнить его содержимым, и<br />
путем преобразования уже имеющейся части диаграммы. Последнее<br />
выполняется следующим образом: выделяем несколько блоков, а<br />
затем последовательно выбираем пункты меню Diagram > Region to<br />
Super block.<br />
<br />
Чтобы увидеть и изменить содержимое суперблока, достаточно щелкнуть дважды на его иконке. Открывшееся окно в системной строке-заголовке будет содержать текст SuperBlock, а кнопка<br />
Simulate станет недоступной, поскольку запускать модель на выполнение можно только из главного окна.<br />
<br />
Каждый суперблок может содержать определенное число входных и выходных портов – как для данных, так и для управляющих<br />
сигналов. Таким образом, суперблок – это своего рода подпрограмма,<br />
и его можно отлаживать отдельно от основной части диаграммы, а<br />
затем вставить в нее уже готовеньким.<br />
<br />
{{Врезка<br />
|Заголовок=Перечень палитр блоков<br />
|Содержание=<br />
* Sources (источники) – блоки, представляющие собой источники данных или сигналов.<br />
* Sinks (приемники) – блоки вывода или отображения данных.<br />
* Linear (линейные) – базовые линейные операторы и подсистемы.<br />
* Non_Linear (нелинейные) – нелинейные функции и подсистемы.<br />
* Matrix (Матричные) – простые и сложные операции матричной алгебры.<br />
* Integer (Целое) – различные операции для работы с целыми числами.<br />
* Events (События) – блоки управления событиями в модели и синхронизации.<br />
* Thresholds (Граница) – блоки для генерации событий при обращении входной величины в нуль.<br />
* Others (Другие) – блоки различной направленности, от подключения программ на других языках программирования до решения уравнений в частных производных.<br />
* Branching (Ветвление) – управление перемещением данных в ссылках.<br />
* Electrical (Электричество) – базовые электрические блоки.<br />
* ThermoHydraulics (Термодинамика) – основные элементы термодинамики.<br />
* OldBlocks (Старые блоки) – старые версии блоков.<br />
* DemoBlocks (Демо блоки) – блоки из демонстрационных примеров.<br />
|Ширина=300px}}<br />
Входной порт данных определяется блоком IN_f (палитра Sources),<br />
а выходной – OUT_f (палитра Sinks). Для управляющих сигналов<br />
используются CLKINV_f и CLKOUTV_f с соответствующих палитр.<br />
Каждый входной или выходной порт суперблока должен иметь уникальный для своей группы номер, т.е. все входные порты данных<br />
нумеруются с 1, все выходные также нумеруются с 1, и т.д. Во время<br />
отладки суперблока в виде отдельной диаграммы входные и выходные блоки можно заменить некими тестовыми константами или<br />
зависимостями.<br />
<br />
Scicos содержит также средства отладки, но программисты<br />
сочтут их весьма и весьма убогими. Выбрав последовательно пункты<br />
меню Simulate > Debug level, вы можете установить уровень режима<br />
отладки:<br />
* 0 нет отладки;<br />
* 1 краткая отладочная информация;<br />
* 2 подробная отладочная информация;<br />
* 3 молчаливая отладка, то есть режим отладки включен, но информация не выводится.<br />
<br />
Вся отладочная информация отображается в окне Scilab, а не в<br />
редакторе Scicos, так что не убирайте его далеко. Кроме изменения<br />
режима отладки, вы можете перенести в суперблоки блок Debug<br />
с палитры Others. Он вызывается первым при входе в суперблок и<br />
может содержать скрипт на языке Scilab, позволяющий вам выполнить те или иные действия. По умолчанию в нем стоит команда pause,<br />
приостанавливающая процесс выполнения.<br />
<br />
В заключение хочется вновь сказать, что пусть Simulink удобнее,<br />
имеет больше возможностей и широко известен, а потому для него<br />
существует обширная документация, но он очень дорого стоит. Scicos<br />
намного моложе и пока что неказист, и не может составить серьезную конкуренцию своему более именитому собрату. Однако я думаю,<br />
что со временем все изменится. Число членов консорциума Scilab<br />
растет все быстрее и быстрее, благодаря ужесточению законодательства в нашей стране все больше людей смотрят в сторону Scilab/Scicos, а для свободного ПО это автоматически приводит к увеличению числа разработчиков. Присоединяйтесь и вы! Помните, что даже<br />
если вы не программист и плохо разбираетесь в каких-то моментах,<br />
вы всегда можете внести посильную лепту путем перевода или написания документации, а ее катастрофически не хватает.</div>Yaleks